From 024e538bbb6916f1c3e6a8caf52be6fee7f7257c Mon Sep 17 00:00:00 2001 From: Norbert Schulz Date: Mon, 23 Apr 2018 18:17:53 +0200 Subject: [PATCH] Adding MIPI System Software Trace Example Code Populate the SyS-T GitHub repository with an example open source implementation of a SyS-T instrumentation library. This source code supports the public release edition 1.0 of the MIPI System Software Trace specification. https://www.mipi.org/specifications/sys-t --- .gitmodules | 6 + LICENSE | 42 +- README.md | 379 +- collateral/example_collateral.xml | 121 + collateral/generator/readme.txt | 8 + collateral/generator/syst_cgen.pl | 917 +++ collateral/sys-t_1-0.xsd | 292 + examples/CMakeLists.txt | 28 + examples/client/CMakeLists.txt | 11 + examples/client/collateral_config.xml | 37 + examples/client/gencat.bat | 1 + examples/client/gencat.sh | 1 + examples/client/othersource.c | 368 ++ examples/client/systclient.c | 96 + examples/client/template.xml | 107 + examples/cmake/FindSyST.cmake | 74 + examples/hello/CMakeLists.txt | 11 + examples/hello/hello.c | 73 + examples/scripts/bldall.sh | 77 + external/googletest | 1 + external/pugixml | 1 + library/CMakeLists.txt | 136 + library/doxygen/Adapting.md | 71 + library/doxygen/ApiOverview.md | 172 + library/doxygen/Building.md | 122 + library/doxygen/CMakeLists.txt | 27 + library/doxygen/Catgen.md | 250 + library/doxygen/Doxyfile.in | 1893 ++++++ library/doxygen/DoxygenLayout.xml | 207 + library/doxygen/Example.md | 68 + library/doxygen/License.md | 34 + library/doxygen/Printer.md | 103 + library/doxygen/Protocol.md | 318 + library/doxygen/Reference.md | 347 ++ library/doxygen/mainpage.md | 57 + library/doxygen/mipi_sys_t_event_header.png | Bin 0 -> 7210 bytes library/doxygen/mipi_sys_t_library_flow.png | Bin 0 -> 45058 bytes library/doxygen/mipi_sys_t_library_flow.vsd | Bin 0 -> 135168 bytes .../doxygen/mipi_sys_t_message_anatomy.png | Bin 0 -> 10801 bytes library/doxygen/mipi_sys_t_overview.png | Bin 0 -> 58002 bytes library/include/mipi_syst.h.in | 783 +++ library/include/mipi_syst/api.h | 2989 ++++++++++ library/include/mipi_syst/compiler.h | 193 + library/include/mipi_syst/crc32.h | 138 + library/include/mipi_syst/inline.h | 245 + library/include/mipi_syst/message.h | 159 + .../example/include/mipi_syst/platform.h | 188 + .../platform/example/src/mipi_syst_platform.c | 404 ++ .../mipi_stp_sim/include/mipi_syst/platform.h | 156 + .../mipi_stp_sim/src/mipi_syst_platform.c | 561 ++ .../platform/nop/include/mipi_syst/platform.h | 153 + library/platform/nop/src/mipi_syst_platform.c | 146 + library/src/mipi_syst_api.c | 1314 +++++ library/src/mipi_syst_compiler.c | 78 + library/src/mipi_syst_crc32.c | 313 + library/src/mipi_syst_init.c | 204 + library/src/mipi_syst_inline.c | 48 + library/src/mipi_syst_writer.c | 219 + library/test/CMakeLists.txt | 7 + library/test/unit/CMakeLists.txt | 58 + library/test/unit/mipi_syst_build_test.cpp | 193 + library/test/unit/mipi_syst_catid32_test.cpp | 532 ++ library/test/unit/mipi_syst_catid64_test.cpp | 530 ++ library/test/unit/mipi_syst_clock_test.cpp | 92 + library/test/unit/mipi_syst_crc32_test.cpp | 138 + library/test/unit/mipi_syst_disable_test.cpp | 61 + library/test/unit/mipi_syst_gtest.h | 249 + library/test/unit/mipi_syst_gtest_main.cpp | 46 + library/test/unit/mipi_syst_init_test.cpp | 432 ++ library/test/unit/mipi_syst_printf_test.cpp | 709 +++ library/test/unit/mipi_syst_raw_test.cpp | 162 + library/test/unit/mipi_syst_string_test.cpp | 325 ++ printer/CMakeLists.txt | 120 + printer/include/mipi_syst_collateral.h | 204 + printer/include/mipi_syst_decode.h | 187 + printer/include/mipi_syst_guid.h | 116 + printer/include/mipi_syst_message.h | 228 + printer/include/mipi_syst_printer.h | 183 + printer/include/mipi_syst_printf.h | 203 + printer/src/mipi_syst_collateral.cpp | 331 ++ printer/src/mipi_syst_decode.cpp | 874 +++ printer/src/mipi_syst_main.cpp | 265 + printer/src/mipi_syst_message.cpp | 371 ++ printer/src/mipi_syst_printf.cpp | 435 ++ printer/test/collateral.xml | 238 + printer/test/diff.cmake | 21 + printer/test/input_client32.txt | 5142 +++++++++++++++++ printer/test/input_client64.txt | 3588 ++++++++++++ printer/test/output_client32.txt | 284 + printer/test/output_client64.txt | 284 + trademarks.txt | 5 + 91 files changed, 31339 insertions(+), 21 deletions(-) create mode 100644 .gitmodules create mode 100644 collateral/example_collateral.xml create mode 100644 collateral/generator/readme.txt create mode 100644 collateral/generator/syst_cgen.pl create mode 100644 collateral/sys-t_1-0.xsd create mode 100644 examples/CMakeLists.txt create mode 100644 examples/client/CMakeLists.txt create mode 100644 examples/client/collateral_config.xml create mode 100644 examples/client/gencat.bat create mode 100644 examples/client/gencat.sh create mode 100644 examples/client/othersource.c create mode 100644 examples/client/systclient.c create mode 100644 examples/client/template.xml create mode 100644 examples/cmake/FindSyST.cmake create mode 100644 examples/hello/CMakeLists.txt create mode 100644 examples/hello/hello.c create mode 100644 examples/scripts/bldall.sh create mode 160000 external/googletest create mode 160000 external/pugixml create mode 100644 library/CMakeLists.txt create mode 100644 library/doxygen/Adapting.md create mode 100644 library/doxygen/ApiOverview.md create mode 100644 library/doxygen/Building.md create mode 100644 library/doxygen/CMakeLists.txt create mode 100644 library/doxygen/Catgen.md create mode 100644 library/doxygen/Doxyfile.in create mode 100644 library/doxygen/DoxygenLayout.xml create mode 100644 library/doxygen/Example.md create mode 100644 library/doxygen/License.md create mode 100644 library/doxygen/Printer.md create mode 100644 library/doxygen/Protocol.md create mode 100644 library/doxygen/Reference.md create mode 100644 library/doxygen/mainpage.md create mode 100644 library/doxygen/mipi_sys_t_event_header.png create mode 100644 library/doxygen/mipi_sys_t_library_flow.png create mode 100644 library/doxygen/mipi_sys_t_library_flow.vsd create mode 100644 library/doxygen/mipi_sys_t_message_anatomy.png create mode 100644 library/doxygen/mipi_sys_t_overview.png create mode 100644 library/include/mipi_syst.h.in create mode 100644 library/include/mipi_syst/api.h create mode 100644 library/include/mipi_syst/compiler.h create mode 100644 library/include/mipi_syst/crc32.h create mode 100644 library/include/mipi_syst/inline.h create mode 100644 library/include/mipi_syst/message.h create mode 100644 library/platform/example/include/mipi_syst/platform.h create mode 100644 library/platform/example/src/mipi_syst_platform.c create mode 100644 library/platform/mipi_stp_sim/include/mipi_syst/platform.h create mode 100644 library/platform/mipi_stp_sim/src/mipi_syst_platform.c create mode 100644 library/platform/nop/include/mipi_syst/platform.h create mode 100644 library/platform/nop/src/mipi_syst_platform.c create mode 100644 library/src/mipi_syst_api.c create mode 100644 library/src/mipi_syst_compiler.c create mode 100644 library/src/mipi_syst_crc32.c create mode 100644 library/src/mipi_syst_init.c create mode 100644 library/src/mipi_syst_inline.c create mode 100644 library/src/mipi_syst_writer.c create mode 100644 library/test/CMakeLists.txt create mode 100644 library/test/unit/CMakeLists.txt create mode 100644 library/test/unit/mipi_syst_build_test.cpp create mode 100644 library/test/unit/mipi_syst_catid32_test.cpp create mode 100644 library/test/unit/mipi_syst_catid64_test.cpp create mode 100644 library/test/unit/mipi_syst_clock_test.cpp create mode 100644 library/test/unit/mipi_syst_crc32_test.cpp create mode 100644 library/test/unit/mipi_syst_disable_test.cpp create mode 100644 library/test/unit/mipi_syst_gtest.h create mode 100644 library/test/unit/mipi_syst_gtest_main.cpp create mode 100644 library/test/unit/mipi_syst_init_test.cpp create mode 100644 library/test/unit/mipi_syst_printf_test.cpp create mode 100644 library/test/unit/mipi_syst_raw_test.cpp create mode 100644 library/test/unit/mipi_syst_string_test.cpp create mode 100644 printer/CMakeLists.txt create mode 100644 printer/include/mipi_syst_collateral.h create mode 100644 printer/include/mipi_syst_decode.h create mode 100644 printer/include/mipi_syst_guid.h create mode 100644 printer/include/mipi_syst_message.h create mode 100644 printer/include/mipi_syst_printer.h create mode 100644 printer/include/mipi_syst_printf.h create mode 100644 printer/src/mipi_syst_collateral.cpp create mode 100644 printer/src/mipi_syst_decode.cpp create mode 100644 printer/src/mipi_syst_main.cpp create mode 100644 printer/src/mipi_syst_message.cpp create mode 100644 printer/src/mipi_syst_printf.cpp create mode 100644 printer/test/collateral.xml create mode 100644 printer/test/diff.cmake create mode 100644 printer/test/input_client32.txt create mode 100644 printer/test/input_client64.txt create mode 100644 printer/test/output_client32.txt create mode 100644 printer/test/output_client64.txt create mode 100644 trademarks.txt diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f34d32b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "external/pugixml"] + path = external/pugixml + url = https://github.com/zeux/pugixml.git +[submodule "external/googletest"] + path = external/googletest + url = https://github.com/google/googletest.git diff --git a/LICENSE b/LICENSE index e7de03e..21fdc0a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,29 +1,31 @@ -BSD 3-Clause License - -Copyright (c) 2017, MIPI-Alliance +Copyright (c) 2018, MIPI Alliance, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: +modification, are permitted provided that the following conditions +are met: -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. * Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/README.md b/README.md index bbcdca4..3bf5313 100644 --- a/README.md +++ b/README.md @@ -1 +1,378 @@ -# public-mipi-sys-t \ No newline at end of file +# MIPI System Software Trace (MIPI SyS-T) - Example Code # + +The **MIPI Alliance Specification for System Software-Trace (MIPI SyS-T℠**) +defines a platform-independent, low bandwidth trace data protocol and software +API for generating trace debug information from mobile or mobile influenced +devices. + +This project provides an example implementation of a MIPI SyS-T +instrumentation library as its main component. The library exposes the +MIPI SyS-T API which generates the MIPI SyS-T data protocol. + +The project includes the following additional components to provide a +working trace cross debug solution: + + * An example implementation for a MIPI SyS-T data protocol printer for + converting the binary protocol into comma separated value (CSV) + text format. + * A PERL based collateral generator that automates the creation and + updating of MIPI SyS-T decode collateral in XML format. The generator + parses the catalog instrumentation calls inside the client source. + It can be embedded into the software build process to keep builds + and decode collateral updated at the same time. + * Doxygen based documentation for the instrumentation library. + * A unit test suite for the instrumentation library + +## SyS-T Trace Debug Environment ## +SyS-T is intended for, but not limited to, cross-development environments +where two machines, named target system (TS) and debug test system (DTS), +exchange data over a transport layer. The TS uses the SyS-T library to generate +a trace data protocol that is sent via a transport to the DTS. The tool +stack on the DTS reads the data and decodes it into a format suitable for human +or automated analysis. The decode step utilizes collateral that +contains static trace data information like string to numeric key mappings. The +collateral is used to reduce both trace transport bandwidth and compiled +software space needs. + +![MIPI SyS-T Overview](library/doxygen/mipi_sys_t_overview.png) + +The MIPI specification for SyS-T is available from the +[MIPI Alliance Website](https://mipi.org/specifications/sys-t). + + +## Supported Platforms ## + + * Windows + * Mac OS X + * Linux + +## Requirements ## + +The instrumentation library is designed to have minimal dependencies for +building. The library core is written using self-contained C-language code. +Only the platform dependent adaptation software layer relies on C-runtime +headers and libraries. + +The protocol printer is written in C++11 and requires a C++11 compliant +compiler and runtime environment. + +The following third party components are used for building the project: + + * [CMake](https://cmake.org/) for generating the platform dependent build system (required). + * [Doxygen](http://www.stack.nl/~dimitri/doxygen/) for building the library documentation (optional). + * [Google Test](https://github.com/google/googletest) for building the library unit tests (optional). + * [PugiXML](https://github.com/zeux/pugixml) for building the printer project (required). + +The Google Test and PugiXML components are configured as git modules +in the external folder of this project. If the folders are not populated, +run the following command to pull the required components from GitHub. +``` +git submodule update --init --recursive +``` +## Building ## +The project is split into the following sub projects. + +| Project | Location | +| ---------------------------------|-------------| +| SyS-T instrumentation library | library | +| Instrumented code examples | examples | +| SyS-T protocol printer tool | printer | +| Collateral generator tool | collateral | + +The following chapters describe how to build the individual projects. + +### Building the SyS-T Instrumentation Library ### +The instrumentation library uses the CMake build system. Building +the project follows the normal CMake flow. It requires an initial CMake run +to generate the platform dependent build system, for example Makefiles on +Linux or Visual Studio Projects on Windows. The native build tools are then +used to do the actual build. Note that CMake follows the "out of source" +build concept. That means that you create a build folder for CMake +projects outside of the source sandbox. All build artifacts are +created inside this build folder. + +The CMake script for the instrumentation library uses the following +configuration switches: + +| Option | Description | Default Value | +| ---------------------------------|-------------|-----------------| +| CMAKE_INSTALL_PREFIX| Path prefix for the compiled library binaries and include files install location| (defined by CMake) | +| SYST_BUILD_PLATFORM_NAME|Name of the platform adaption code folder| example | +| SYST_BUILD_DOC|Enable build of Doxygen documentation| True if Doxygen installation was found, False otherwise | +| SYST_BUILD_GTEST_DIR|Installation location of Google Test sources. Set this for building the unit tests| (unset) | + +The following transcript shows an example for configuring and building the +library on a Linux console. Replace "../sys-t/library" with the location of +your SyS-T project sandbox. + +``` +$ mkdir build +$ cd build +$ cmake ../sys-t/library -DCMAKE_INSTALL_PREFIX=../deploy -DSYST_BUILD_PLATFORM_NAME=example -DCMAKE_BUILD_TYPE=Release +(...) +-- Configuring done +-- Generating done +-- Build files have been written to: /users/mipi/prj/build + + $ make install + (...) + -- Installing: /users/mipi/prj/deploy/lib/libmipi_syst.so + -- Installing: /users/mipi/prj/deploy/lib/libmipi_syst_static.a + -- Installing: /users/mipi/prj/deploy/include + $ +``` +The install target builds the projects and copies the libraries +and SyS-T header files to the deploy location. This location was defined +by the CMake variable ``CMAKE_INSTALL_PREFIX``. It forms a SyS-T SDK +that applications compile and link against. + +If the unit tests are built as well, they can be run using one of the +following commands: + +```bash +$ ctest -verbose +$ make RUN_TEST_VERBOSE +$ ./test/unit/syst_unittest +``` + +### Building the Example Applications ### +The project ships with example applications that show how to instrument +source code with the SyS-T API. The examples use the CMake build +system and require that the instrumentation library project was built and +installed first. The building depends on the SyS-T libraries and header +files in the install location. The location of the install folder needs +to be specified by setting the CMake variable ``SYST_SDK`` when configuring +the example project. + +The following transcript shows the configuring and building of the examples +in a Linux console. Replace "../sys-t/examples" with the location of +your SyS-T sandbox examples folder and replace the value for SYST_SDK +with the location of the install location from a previously built +instrumentation library. + + +``` +$ mkdir build_examples +$ cd build_examples +$ cmake ../sys-t/examples -DSYST_SDK=../deploy -DCMAKE_BUILD_TYPE=Release + +-- Found SYST: /users/mipi/prj/deploy/include +-- Configuring done +-- Generating done +-- Build files have been written to: /users/mipi/prj/build_examples + +$ make +Scanning dependencies of target hello +[ 20%] Building C object hello/CMakeFiles/hello.dir/hello.c.o +[ 40%] Linking C executable hello +[ 40%] Built target hello +Scanning dependencies of target systclient +[ 60%] Building C object client/CMakeFiles/systclient.dir/systclient.c.o +[ 80%] Building C object client/CMakeFiles/systclient.dir/othersource.c.o +[100%] Linking C executable systclient +[100%] Built target systclient +``` + +The examples code builds into standalone applications that can be run +directly from the console. To run the minimal hello example, enter the +following command: + +``` +$ hello/hello + in SyS-T platform init hook: "mipi_syst_platform_state_init()" + systh = 0x6250c0, platform_data = (nil) + in SyS-T platform handle init hook: systh = 0x1edd420 + +STP Protocol Output: + 0 01801042 + 1 704caea243544e49 + 2 35ea9c9ea7d1b5ab + 3 7953206f6c6c6548 + 4 21542d53 + 5 00 + 6 +SYS-T RAW DATA: 42108001494E5443A2AE4C70ABB5D1A79E9CEA3548656C6C6F205379532D542100 + + in SyS-T platform handle release hook:systh = 0x1edd420 +$ +``` + +The transcript shows the output from the example platform code in +the instrumentation library. The example platform code only prints +output actions to the console. It does not interface to any real +trace transport. The output shows the raw messages as hex dumps. +This output can be fed into the protocol printer tool to convert +it into human readable CSV textual data. + +### Building the Data Protocol Printer ### +The project includes a SyS-T data protocol pretty printer tool +in the printer subdirectory. The printer is a standalone application +written in C++11. It supports reading the output from instrumented +applications using the example platform from the SyS-T +instrumentation library. +It scans the output for lines starting with ``SYS-T RAW DATA:`` and +converts the hex dumps into binary data for decoding. The printer can +be easily adapted to real trace data transports by replacing the code +in ``printer/src/mipi_syst_main.cpp`` with an appropriate data reader. + +The following transcript shows how to build the printer on a Linux console. +The printer is a standalone application and independent from the +instrumentation or example projects. + +``` +$ cmake ../../sys-t/printer +-- The C compiler identification is GNU 5.4.0 +-- The CXX compiler identification is GNU 5.4.0 +-- Check for working C compiler: /usr/bin/cc +-- Check for working C compiler: /usr/bin/cc -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Detecting C compile features +-- Detecting C compile features - done +-- Check for working CXX compiler: /usr/bin/c++ +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done +-- Generating done +-- Build files have been written to: /users/mipi/prj/syst_build/printer + +$ make +Scanning dependencies of target systprint +[ 14%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_main.cpp.o +[ 28%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_collateral.cpp.o +[ 42%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_printf.cpp.o +[ 57%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_decode.cpp.o +[ 71%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_message.cpp.o +[100%] Linking CXX executable systprint +[100%] Built target systprint +``` + +The printer project comes with a self test feature. The ``printer/test`` +folder contains reference input and output files collected using the +``example/client`` example application. To run the printer test use the +following command (or the cmake test driver command ``ctest``) in the +printer build folder: + +``` +$ make test +Running tests... +Test project /users/mipi/prj/syst_build/printer + Start 1: print_client_example +1/3 Test #1: print_client_example ............... Passed 0.01 sec + Start 2: diff_output_with_32bit_reference +2/3 Test #2: diff_output_with_32bit_reference ... Passed 0.04 sec + Start 3: diff_output_with_64bit_reference +3/3 Test #3: diff_output_with_64bit_reference ... Passed 0.03 sec + +100% tests passed, 0 tests failed out of 3 + +Total Test time (real) = 0.11 sec +``` + +To actually see the printer output, run the printer directly using command +line arguments, or indirectly through the test driver in verbose mode +(```ctest --verbose```). The following transcript shows how to call the +printer directly: + +``` +$systprint --short_guid {494E5443-8A9C-4014-A65A-2F36A36D96E4} --collateral ../../sys-t/printer/test/collateral.xml ../../sys-t/printer/test/input_client64.txt + +Decode Status,Payload,Type,Severity,Origin,Unit,Message TimeStamp,Context TimeStamp,Location,Raw Length,Checksum,Collateral +OK,"0x0000000000010000 version banner string",BUILD:LONG,MAX,example,1,0x00054A4B376A70E9,0x0000000000000000,,62,0x4DDEF5B9,../../sys-t/printer/test/collateral.xml +OK,"SyS-T Library version 1.0.0",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000001,./systclient.c:64,48,0x7A34B527,../../sys-t/printer/test/collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000002,./othersource.c:40,36,0x7CBB44B6,../../sys-t/printer/test/collateral.xml +OK,"| ____ _____ _______ |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000003,./othersource.c:41,36,0x2761EBF4,../../sys-t/printer/test/collateral.xml +OK,"| / ___| / ____| |__ __| |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000004,./othersource.c:42,36,0x55C63EAB,../../sys-t/printer/test/collateral.xml +OK,"| | |___ __ _| |___ _____| | |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000005,./othersource.c:43,36,0xE3885FB4,../../sys-t/printer/test/collateral.xml +OK,"| \___ \| | | |\___ \_____| | |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000006,./othersource.c:44,36,0x4C13A7F5,../../sys-t/printer/test/collateral.xml +OK,"| ____| | |_| |____| | | | |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000007,./othersource.c:45,36,0xE2C8BDC2,../../sys-t/printer/test/collateral.xml +OK,"| |_____/ \__| |_____/ |_| |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000008,./othersource.c:46,36,0xD0734297,../../sys-t/printer/test/collateral.xml +OK,"| _/ / |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000009,./othersource.c:47,36,0x6D704426,../../sys-t/printer/test/collateral.xml +OK,"| |__/ |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x000000000000000A,./othersource.c:48,36,0x0A8FD609,../../sys-t/printer/test/collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x000000000000000B,./othersource.c:49,36,0x1E99CD8F,../../sys-t/printer/test/collateral.xml +OK,"| catalog Format | Printed Result |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x000000000000000C,./othersource.c:231,36,0xA17B5C1C,../../sys-t/printer/test/collateral.xml +OK,"|---------------------------------strings---------------|",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A74D1,0x000000000000000D,./othersource.c:232,36,0x11A215E6,../../sys-t/printer/test +(...) +$ +``` +## Decode Collateral Creation Tool ## +The project includes a PERL based collateral generator that automates the +creation and updating of SyS-T decode collateral in XML format. This +generator parses the catalog instrumentation points by scanning the +client source code. The tool can be embedded into a software build process to +keep software builds and decode collateral updated at the same time. The tool +is stored in the ```collateral\generator``` folder of the project with the +name ```syst_cgen.pl```. + +### Dependencies ### +The generator is written in PERL and requires a PERL installation with the +following optional modules installed. + * String::Escape + * Xml::Simple + +Refer to the documentation for your PERL installation on module installation. +On Linux, the following commands can be used: + +``` +$ perl -MCPAN -e 'install XML::Simple' +$ perl -MCPAN -e 'install String::Escape' +``` + +### Collateral Generation Process ### +The collateral generator takes a SyS-T collateral template and +a configuration file as input. The configuration file defines the locations +and file extensions of the source files to be scanned and how the catalog +message calls +inside the source code are named. The tool can then detect the catalog +calls, and extracts the format strings, source locations, and +catalog IDs to update the collateral template file. The result is a +new collateral file that matches the actual state of the source code. + +### Catalog Generation Example ### +The client application in ```example/client``` uses various catalog calls. +It therefore provides a configuration file for```syst_cgen.pl``` to detect +the SyS-T catalog message calls, and a collateral template file that is +updated by the generator. It is executed in the following way: + +``` +$ perl ../../collateral/generator/syst_cgen.pl -config collateral_config.xml +syst_catgen.pl: Parsing: ./othersource.c +syst_catgen.pl: Add ./othersource.c with file id 1 to file catalog +syst_catgen.pl: Parsing finished: ./othersource.c, found 127 call(s) +syst_catgen.pl: Parsing: ./systclient.c +syst_catgen.pl: Add ./systclient.c with file id 2 to file catalog +syst_catgen.pl: Parsing finished: ./systclient.c, found 4 call(s) +syst_catgen.pl: Generating XML structure +syst_catgen.pl: Loaded template collateral file template.xml +syst_catgen.pl: Generating XML structure finished +syst_catgen.pl: Writing XML file: generated_catalog.xml +syst_catgen.pl: Writing XML file finished +``` + +This call creates the file ``generated_catalog.xml``. It is used by +SyS-T data protocol processing tools to decode the catalog messages +from this application. For an example of such an application, see the +earlier section about the protocol printer. The printer tool uses the +``--collateral `` argument to load collateral files. + +## Integration Build Test ## +The bash script in ``examples/scripts/bldall.sh`` can be used to run an +integration test for the different projects. The script builds all projects +sequentially using the example library platform. It then runs components +tests and finally calls the printer tool to format the output of +the ``hello`` example application. The following transcript shows how to +run execute the script. The BLD_ROOT variable sets the location of the build +folder. If unset, the script creates a local build folder in the scripts +folder. + +``` +$ cd sys-t/examples/scripts +$ BLD_ROOT=/tmp/sys_t_test_bld ./bldall.sh +``` + +## License + +See [LICENSE](LICENSE) diff --git a/collateral/example_collateral.xml b/collateral/example_collateral.xml new file mode 100644 index 0000000..0992bbb --- /dev/null +++ b/collateral/example_collateral.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + displayAsField + + + + + + + + + + + + + + + + + + %x]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collateral/generator/readme.txt b/collateral/generator/readme.txt new file mode 100644 index 0000000..8214994 --- /dev/null +++ b/collateral/generator/readme.txt @@ -0,0 +1,8 @@ +syst_cgen.pl - a SYS-T message collateral generator + +Usage: +perl ./syst_cgen.pl --help + +Example: +An example project using the collateral generator +is located in /library/examples/client. diff --git a/collateral/generator/syst_cgen.pl b/collateral/generator/syst_cgen.pl new file mode 100644 index 0000000..c1cc4d4 --- /dev/null +++ b/collateral/generator/syst_cgen.pl @@ -0,0 +1,917 @@ +#!/usr/bin/perl + +# Copyright (c) 2018, MIPI Alliance, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Contributors: +# norbert.schulz@intel.com - initial API and implementation +# +use strict; +use warnings; +use File::Spec; +use XML::Simple; +use File::Find; +use Getopt::Long; +use Pod::Usage; +use String::Escape; +use bigint qw/hex/; + +use Data::Dumper; + +# ============================================================================= +# Globals +# ============================================================================= +my ( undef, undef, $TOOL ) = File::Spec->splitpath( $0 ); +my $INDENTATION = 2; +my $SRCLOCATION = 1; +my $CONFIG = (); +my $FILE_COUNTER = 0; +my $MSG_STRUCT = (); +my $FILE_STRUCT = (); +my $USED_IDS = (); +my %OPTIONS = (); + + +# ============================================================================= +# Main functions. +# ============================================================================= + +sub main { + read_options (); + + find({ + wanted => \&file_handler, + preprocess => \&filter_file_list }, @{$OPTIONS{src}}); + + sub file_handler { + my $file = $File::Find::name; + if (-f $_ && !is_file_existing ($file)) { + _i ("Parsing: ".$file."\n"); + add_file ($file); + my $count = parse_file ($_); + _i ("Parsing finished: ".$file.", found $count call(s)\n"); + } + } + + # + # Filters the file list before the file_handler functions will be + # called by File::find. + # + sub filter_file_list { + my @filtered_list = (); + # Filter files with wanted extensions. + foreach my $pattern (@{$CONFIG->{SrcFilePatterns}->{SrcFilePattern}}) { + push (@filtered_list, glob($pattern->{Pattern})); + } + # Add sub directories to scan whole trees. + foreach my $dir (grep { -d } @_) { + if ($dir ne '.' && $dir ne '..') { + push (@filtered_list, $dir); + } + } + return @filtered_list; + } + + if (!defined ($FILE_STRUCT)) { + _e ("No files found, which match the provided patterns!\n"); + } + + if (!defined ($MSG_STRUCT)) { + _e ("No messages found!\n"); + } + + my $xml = generate_xml ($MSG_STRUCT, $FILE_STRUCT); + + _i ("Writing XML file: ".$OPTIONS{catalog}."\n"); + open (CATALOG, ">".$OPTIONS{catalog}) + or _e ("Could not open file (w): $!\n"); + print CATALOG $xml; + close (CATALOG); + _i ("Writing XML file finished\n"); +} + +# +# generate_xml (, ) +# +# Description: +# Generate SyS-T catalog XML structure based on read message +# calls and scanned files. +# +sub generate_xml { + my $msg_struct = $_[0]; + my $file_struct = $_[1]; + + _i ("Generating XML structure\n"); + + my $output = load_template($OPTIONS{template}); + + # build sources section + # + if (defined $file_struct) { + if ($SRCLOCATION) { + my $source_list = ''."\n"; + foreach my $file_id (sort {$a <=> $b} keys %{$file_struct}) { + $source_list.= ' ' x ($INDENTATION*2); + $source_list.= ''; + $source_list.= '{$file_id}.']]>'; + $source_list.= ''."\n" + } + $source_list.= ' ' x $INDENTATION; + $source_list.= ''."\n"; + + $output =~ s//$source_list/sm; + } + + if (defined $msg_struct->{"32"}) { + if (index($output, '') != -1) { + my $section = generate_catalog_section($msg_struct, 32); + $output =~ s//$section/sm; + } else { + _w('32 bit catalog messages found, but template file '. + 'is missing the insertion pattern ""'."\n"); + } + } + if (defined $msg_struct->{"64"}) { + if (index($output, '') != -1) { + my $section = generate_catalog_section($msg_struct, 64); + $output =~ s//$section/sm; + } else { + _w('64 bit catalog messages found, but template file '. + 'is missing the insertion pattern ""'."\n"); + } + } + } else { + _w( "no source files to parse found." ); + } + + _i ("Generating XML structure finished\n"); + + return $output; +} + +# +# generate_catalog_section (, 32|64) +# +# Description +sub generate_catalog_section { + my $hits = $_[0]; + my $size = $_[1]+0; + + my $data = $hits->{$size}; + my $output =""; + + $output.= ''."\n"; + + foreach my $file_id (sort keys %{$data}) { + foreach my $line_id (sort {$a <=> $b} keys %{$data->{$file_id}}) { + foreach my $msg_id (sort {$a <=> $b} keys %{$data->{$file_id}->{$line_id}}) { + my $msg = $data->{$file_id}->{$line_id}->{$msg_id}; + my $idval= ""; + + if ($size == 32) { + $idval = sprintf("0x%08x", $msg_id); + } else { + $idval = sprintf("0x%016x", $msg_id); + } + $output.= ' ' x ($INDENTATION*2); + $output.= ''; + $output.= ''."\n"; + } + } + } + $output.= ' ' x $INDENTATION; + $output.= ''."\n"; + + return $output; +} + +# +# add_file () +# +# Description: +# Add a file to the file data structure and increment global +# file counter. +# +sub add_file { + my $file = $_[0]; + + $FILE_COUNTER++; + + if ($SRCLOCATION) { + _i ("Add $file with file id $FILE_COUNTER to file catalog\n"); + } + + if (defined($FILE_STRUCT->{$FILE_COUNTER})) { + _e ("File with file id $FILE_COUNTER already exists!\n"); + } + $FILE_STRUCT->{$FILE_COUNTER} = $file; +} + +# +# is_file_existing () +# +# Description: +# Check if file is already existing in the file data structure +# +sub is_file_existing { + return (grep {$FILE_STRUCT->{$_} eq $_[0]} keys %{$FILE_STRUCT}) > 0; +} + +# +# load_template () +# +# Description: +# Parse the given file as the catalog template file where the catalog +# messages get added into. +# +sub load_template { + my $file = $_[0]; + local $/ = undef; + open (FILE, $file) or _e ("Could not open input template file ".$file.": $!\n"); + my $content = ; + close FILE; + + _i("Loaded template collateral file ".$file."\n"); + + return $content; +} + +# +# parse_file () +# +# Description: +# Parse the given file to extract SyS-T catalog trace calls. Results will be +# stored into global catalog data structure. +# +sub parse_file { + my $file = $_[0]; + + open (FILE, $file) or _e ("Could not open file ".$file.": $!\n"); + my @content = ; + close FILE; + + my $add_count = 0; + + # loop over the input lines + # + for (my $i = 0; $i < $#content+1; $i++) { + my $calltype= undef; + + for my $idsize ( "32", "64" ) { + + my $calltype ="Catalog".$idsize; + my $callset = $CONFIG->{CatalogCalls}->{$calltype}->{CatalogCall}; + + foreach my $function_name (keys %{$callset}) + { + if (!defined ($callset->{$function_name}->{IdParamIdx})) { + _e ("Configuration: 'IdParamIdx' is not defined for function ". + "call: $function_name\n"); + } + if (!defined ($callset->{$function_name}->{StringParamIdx})) { + _e ("Configuration: 'StringParamIdx' is not defined for ". + "function call: $function_name\n"); + } + + # find the current function call + if ($content[$i] =~ /\b${function_name}\b/) { + my $call = strip_comments ($content[$i]); + my $line_no_start = $i+1; + my $line_no_end = $i+1; + + if (!strip_whitespaces ($call)) { + _i ("Catalog instrumentation call \@ ". + "$file:$line_no_start will be skipped.\n"); + next; + } + _vi ("function call start: $function_name at line ". + $line_no_start."\n"); + + # try to find the end of the function call, which is might + # not be at the same line. + while ($content[$i] !~ /\)(\s*|\t*);/) { + my $tmp = strip_comments ($content[++$i]); + $call.=$tmp; + } + $line_no_end = $i+1; + + _vi ("functon call end: $function_name at line ". + $line_no_end."\n"); + + # remove new line and extract arguments + $call =~ s/\n//g; + $call =~ m/${function_name}\b(\s*|\t*)\((.*)\)(\s*|\t*);/; + + my $arguments = $2; + + # now split the arguments by character + my @array = split(//, $arguments); + my $current_arg_no = 0; + my $inside_string = 0; + my $possible_end_of_call = 0; + my $bracket_count = 0; + my $found_quotes = 0; + my @function_args = (); + my $opening_quote = ""; + + # Iterate argument list character by character + for (my $i = 0; $i < $#array+1; $i++) { + # if a closing bracket will be found not inside the format + # string it may be the end of the call. + if ($array[$i] eq ")" && !$inside_string) { + $possible_end_of_call ^= 1; + if ($bracket_count == 0) { + last; + } + $bracket_count--; + } + # if opening bracket was found, reset possible end marker + if ($array[$i] eq "(" && !$inside_string) { + $bracket_count++; + $possible_end_of_call = 0; + } + + # if a semicolon was found, not inside the format string + # and one of the previous characters was a closing bracket, + # it's the end of the call. + if ($array[$i] eq ";" && !$inside_string + && $possible_end_of_call) { + _d ("End of call detected at line $line_no_start\n"); + last; + } + + # Find the argument separators + if ($array[$i] eq "," && !$inside_string) { + $current_arg_no++; + next; + } + + # If a format string was found, do not search + # for argument separators. + if ($array[$i] eq "\"" || $array[$i] eq "'") { + $found_quotes = 1; + # check if the previous character escaped the current + # one. + if ($i >= 0 && $array[$i-1] ne "\\") { + # Within a string, quotes match, so reset control variables. + if ($inside_string && $opening_quote eq $array[$i]) { + $opening_quote = ""; + $inside_string ^= 1; + next; + # Not within a string, start quote empty. Begin of a string. + } elsif (!$inside_string && $opening_quote eq "") { + $opening_quote = $array[$i]; + $inside_string ^= 1; + next; + } + } + } + + # Skip spaces outside of a string + if (!$inside_string && $found_quotes && ($array[$i] eq " " || $array[$i] eq "\t")) { + next; + } + + # Add argument to array. + $function_args[$current_arg_no].=$array[$i]; + } + + # remove leading and trailing whitespaces from the arguments + map { + $_ = strip_whitespaces ($_); + } @function_args; + + my $str_idx = $callset->{$function_name}->{StringParamIdx}; + my $file = (defined ($FILE_STRUCT->{$FILE_COUNTER}) ? + $FILE_STRUCT->{$FILE_COUNTER} : $FILE_COUNTER); + + my $message_id = undef; + my $message_str = $function_args[$str_idx-1]; + + my $algorithm = 'fromIdParam'; + if (defined( $callset->{$function_name}->{Algorithm})) { + $algorithm = $callset->{$function_name}->{Algorithm}; + } + _d("Algorithm = $algorithm\n"); + + my $id_idx = $callset->{$function_name}->{IdParamIdx}; + _d("IdParamIdx = $id_idx\n"); + if ($algorithm eq 'hash65599') { + $message_id = hash_x65599 ($message_str, $function_args[$id_idx-1]); + } else { + $message_id = to_value($function_args[$id_idx-1]); + } + + _d ("StringParamIdx = $str_idx\n"); + _d ("IdSize = $idsize\n"); + _d ("Found call: ".strip_whitespaces ($call)."\n"); + _d ("Arguments: ".strip_whitespaces ($arguments)."\n"); + + if (!$found_quotes) { + _e ("Catalog instrumentation call \@ ". + "$file:$line_no_start ". + "could not be parsed. ". + "No valid format string found.\n"); + } + if (!is_dec($message_id) && !is_hex($message_id)) { + _e ("Catalog instrumentation call \@ ". + "$file:$line_no_start '$message_id' ". + "is not decimal or hexadecimal.\n"); + } + + if (exists($USED_IDS->{$message_id})) { + if ($algorithm eq 'hash65599') { + _e ("Catalog instrumentation call \@ ". + "$file:$line_no_start hash based ID '$message_id' ". + "already exists. Change the offset value.\n"); + } else { + _e ("Catalog instrumentation call \@ ". + "$file:$line_no_start with ID '$message_id' ". + "also exists \@ ". + $FILE_STRUCT->{$USED_IDS->{$message_id}->{file}}. + ":". + $USED_IDS->{$message_id}->{line}.".\n"); + } + } + $MSG_STRUCT->{$idsize}->{$FILE_COUNTER}->{$line_no_start}->{$message_id} = $message_str; + + $USED_IDS->{$message_id} ={ + file => $FILE_COUNTER, + line => $line_no_start + }; + $add_count++; + + _d ("-" x 79 . "\n"); + } + } + } + } + close (FILE); + + return $add_count; +} + + +# ============================================================================= +# Helper functions. +# ============================================================================= + + +# +# read_options_from_config_file () +# +# Description: +# Read options from config file and store them into global data structure. +# The function also checks if the resp. option was overruled by a command +# line switch. +# +sub read_options_from_config_file { + $CONFIG = read_config ($OPTIONS{config}); + + if (!defined ($CONFIG->{CatalogConfigs}) + || !defined ($CONFIG->{CatalogConfigs}->{CatalogConfig})) { + return; + } + + my %new_options = (); + foreach my $config_record (@{$CONFIG->{CatalogConfigs}->{CatalogConfig}}) { + my $option = $config_record->{option}; + my $value = $config_record->{value}; + if (!defined($OPTIONS{$option})) { + if ($option eq "guid" || $option eq "src") { + if (!defined($new_options{$option})) { + @{$new_options{$option}} = (); + } + push (@{$new_options{$option}}, $value); + } else { + $new_options{$option} = $value; + } + } else { + _vi ("Config file option '$option' overruled by ". + "command line option\n"); + } + } + + # Merge the two hashes. + @OPTIONS{keys %new_options} = values %new_options; +} + +# +# read_options () +# +# Description: +# Read options from command line an store into global data structure. +# +sub read_options { + GetOptions (\%OPTIONS, + 'verbose|v', + 'debug|d', + 'src=s@', + 'catalog|cf=s', + 'config|c=s', + 'template|tpl=s', + 'nolocation|nl', + 'help|h' + ) or pod2usage(-exitval => 0, -verbose => 2, -noperldoc => 1); + + if (defined($OPTIONS{help})) { + pod2usage(-exitval => 0, -verbose => 2, -noperldoc => 1); + } + + if (!defined($OPTIONS{config})) { + _e ("-config option is missing\n"); + } elsif (!-f $OPTIONS{config}) { + _e ("Specified config is not a file\n"); + } + + read_options_from_config_file (); + + if (defined($OPTIONS{src})) { + map { + _e ("Not existing or not a directory: $_\n") if !-e $_ || !-d $_; + } @{$OPTIONS{src}}; + } else { + _e ("-src option is missing\n"); + } + + if (!defined($OPTIONS{catalog})) { + _e ("-catalog option is missing\n"); + } + + if (!defined($OPTIONS{template})) { + _e ("-template option is missing\n"); + } + + if (defined($OPTIONS{indentation})) { + $INDENTATION = $OPTIONS{indentation}; + } + + if (defined($OPTIONS{nolocation}) and + (uc($OPTIONS{nolocation}) eq "TRUE") or ($OPTIONS{nolocation} == 1) + ) + { + $SRCLOCATION = 0; + } +} + +sub parse_guid { + my $guid_expr = $_[0]; + my $ret = (); + + if ($guid_expr =~ /^(.*);(.*)$/) { + $ret->{guid} = $1; + $ret->{mask} = $2; + } else { + $ret->{guid} = $guid_expr; + } + + return $ret; +} + +# +# strip_comments () +# +# Description: +# Strip C-style comments. +# +sub strip_comments { + my $str = $_[0]; + $str =~ s/\/\/.*//; + $str =~ s/\/\*.*\*\///g; + + return $str; +} + +# +# strip_whitespaces () +# +# Description: +# Strip leading and trailing whitespaces/tabs. +# +sub strip_whitespaces { + my $str = $_[0]; + $str =~ s/^\s+//; + $str =~ s/\s+$//; + $str =~ s/^\t+//; + $str =~ s/\t+$//; + + return $str; +} + +# +# read_config () +# +# Description: +# Read configuration and return data structure. An error +# message will be printed for every missing required section. +# +sub read_config { + my $config_file = $_[0]; + + my $xml_ref = XMLin($config_file, + KeyAttr => { + 'CatalogCall' => 'Name' + }, + ForceArray => [ + 'CatalogCall', + 'SrcFilePattern', + 'CatalogConfig' + ] + ); + + if (!defined ($xml_ref->{SrcFilePatterns}) + || !defined ($xml_ref->{SrcFilePatterns}->{SrcFilePattern})) { + _e ("The specified config file does not contain a correct ". + "SrcFilePatterns/SrcFilePattern structure\n"); + } + + if (!defined ($xml_ref->{CatalogCalls}) || + (!defined ($xml_ref->{CatalogCalls}->{Catalog32}->{CatalogCall}) && + !defined ($xml_ref->{CatalogCalls}->{Catalog64}->{CatalogCall})) + ) + { + _e ("The specified config file does not contain a correct ". + "CatalogCalls/CatalogCall structure\n"); + } + + return $xml_ref; +} + +# +# hash_x65599 (, ) +# +# Description: +# Calculates a x65599 hash for the provided string and offset value. +# +sub hash_x65599 { + my $string = String::Escape::unbackslash($_[0]); + my $offset = int($_[1]); + + my $hash = 0; + my $tail256 = substr($string, -256); + + foreach my $char (split(//, $tail256 )) { + $hash = uint ($hash * 65599 + ord($char)); + } + + return $hash + $offset; +} + +# +# uint () +# +# Description: +# Mimics the unsigned int data type in Perl. Required for the x65599 hash +# calculation. +# +sub uint { + return unpack('I', pack('I', $_[0])); +} + +# +# to_value () +# +# Description: +# convert C-Language value to perl hex value +# +sub to_value { + my $input = $_[0]; + my $val=0; + + # Remove possible LL or ULL from the hex number in the C file. + $input =~ s/u?ll$//gi; + if (is_hex($input)) { + $val = hex($input); + } else { + $val = $input+0; + } + + return $val; +} + + +# +# is_hex () +# +# Description: +# Checks if a number is a hex value. +# +sub is_hex { + return ($_[0] =~ /^0x[0-9a-f]+$/i); +} + +# +# is_dec () +# +# Description: +# Checks if a number is a decimal value. +# +sub is_dec { + return ($_[0] =~ /^\d+$/); +} + +# +# _e () +# +# Description: +# Print error message on STDERR and exit with exist status 1. +# +sub _e { + _print (*STDERR, "[ERROR]", $_[0]); + exit (1); +} + +# +# _w () +# +# Description: +# Print warning message on STDOUT. +# +sub _w { + _print (*STDOUT, "[WARNING]", $_[0]); +} + +# +# _i () +# +# Description: +# Print general message on STDOUT. +# +sub _i { + _print (*STDOUT, "", $_[0]); +} + +# +# _vi () +# +# Description: +# Print verbose message on STDOUT. +# +sub _vi { + _i ($_[0]) if $OPTIONS{verbose}; +} + +# +# _d () +# +# Description: +# Print debug message on STDOUT. +# +sub _d { + _print (*STDOUT, "[DEBUG]", $_[0]) if $OPTIONS{debug}; +} + +# +# _print () +# +# Description: +# General print handler. +# +sub _print { + my $handle = $_[0]; + my $prefix = $_[1]; + my $msg = $_[2]; + + print $handle "$TOOL: ".($prefix ne "" ? $prefix.": " : ""). $msg; +} + +main (); +exit (0); + +__END__ +=head1 NAME + +B -- A SyS-T collateral generation script. + +=head1 DESCRIPTION + +Generate a SyS-T colleteral file with catalog call information from source +files. The script scans for pre-configured C-style macro calls and extracts +the message, its ID and the line number and puts it into a SyS-T collateral +XML structure. + +=head1 USAGE + +syst_cgen.pl + + -config + [-template ] + [-src ] [-src [...]] [-o ] + [-verbose] [-debug] + + -src Search path for the sources. + -catalog|-cf Destination catalog XML file. + -template|-tpl Catalog template to be extended with messages. + -config|c Catalog generation config file. + -nolocation|-nl Supress source location generation + -verbose|v Switch on verbose messages. + -debug|d Switch on debug messages. + + +=head1 CONFIGURATION + +The catalog configuration file specifies the parameters of the script, e.g. +the macro call names, the argument structure of the calls, and file extensions, +which should be scanned. + +=head2 EXAMPLE CATALOG CONFIGURATION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +=head2 SECTION SrcFileExtensions + + + + + +This sections defines the file extensions, which will be scanned by the script. + +=head2 SECTION CatalogCalls + + + + + + + +This section describes the used macro calls. It describes how the macro is +named and where the arguments of intereset can be found by the script. There +are different sections for 32 bit and 64 bit wide catalog calls. + +=head2 SECTION CatalogConfigs + + + + + +This section specifies pre-defined options for the catalog generation script. +The options will be overruled by the respective command line options. + +=cut diff --git a/collateral/sys-t_1-0.xsd b/collateral/sys-t_1-0.xsd new file mode 100644 index 0000000..248d3e6 --- /dev/null +++ b/collateral/sys-t_1-0.xsd @@ -0,0 +1,292 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..9c6874c --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,28 @@ +project(SYST_Examples) +cmake_minimum_required (VERSION 2.8) + +get_filename_component( + THIS_PATH "${CMAKE_CURRENT_SOURCE_DIR}" + ABSOLUTE +) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${THIS_PATH}/cmake") + +if (defined $ENV{SYST_SDK}) + set(SYST_SDK "ENV{SYST_SDK}" CACHE PATH "SYS-T header and library root folder") +else() + set(SYST_SDK "(not-set)" CACHE PATH "SYS-T header and library root folder") +endif() + +find_package(SyST REQUIRED) + +# static linking flags +# +add_definitions(-DMIPI_SYST_STATIC) +set(SYST_LIBRARIES ${SYST_LIBRARIES_STATIC}) + +#dynamic linking, requires location of mipi_syst.dll to be in the PATH. +#set(SYST_LIBRARIES ${SYST_LIBRARIES_DYNAMIC}) + +add_subdirectory(hello) +add_subdirectory(client) \ No newline at end of file diff --git a/examples/client/CMakeLists.txt b/examples/client/CMakeLists.txt new file mode 100644 index 0000000..6362dde --- /dev/null +++ b/examples/client/CMakeLists.txt @@ -0,0 +1,11 @@ +include_directories( + ${SYST_INCLUDE_DIRS} +) + +add_executable(systclient systclient.c othersource.c) +target_link_libraries(systclient ${SYST_LIBRARIES}) + +install(TARGETS systclient + RUNTIME DESTINATION bin + LIBRARY DESTINATION bin +) \ No newline at end of file diff --git a/examples/client/collateral_config.xml b/examples/client/collateral_config.xml new file mode 100644 index 0000000..76cacde --- /dev/null +++ b/examples/client/collateral_config.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/client/gencat.bat b/examples/client/gencat.bat new file mode 100644 index 0000000..7861c29 --- /dev/null +++ b/examples/client/gencat.bat @@ -0,0 +1 @@ +perl ..\..\collateral\generator\syst_cgen.pl -c collateral_config.xml \ No newline at end of file diff --git a/examples/client/gencat.sh b/examples/client/gencat.sh new file mode 100644 index 0000000..0fe3531 --- /dev/null +++ b/examples/client/gencat.sh @@ -0,0 +1 @@ +perl ../../collateral/generator/syst_cgen.pl -c collateral_config.xml diff --git a/examples/client/othersource.c b/examples/client/othersource.c new file mode 100644 index 0000000..e4ff5d5 --- /dev/null +++ b/examples/client/othersource.c @@ -0,0 +1,368 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "mipi_syst.h" + +extern struct mipi_syst_handle * systh; + +void banner() +{ + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("+-------------------------------------------------------+", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| ____ _____ _______ |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| / ___| / ____| |__ __| |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| | |___ __ _| |___ _____| | |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| \\___ \\| | | |\\___ \\_____| | |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| ____| | |_| |____| | | | |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| |_____/ \\__| |_____/ |_| |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| _/ / |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| |__/ |", 0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("+-------------------------------------------------------+", 1)); +} + +/* +* Use dynamic width settings with %*s formats to draw a sinus pattern +*/ +static int sin_wave[30] = { + 0, 5,11,16,20,24,26,27,27,26,24,20,16,11, 5, 0,-5,-11,-16,-20,-24,-26,-27,-27,-26,-24,-20,-16,-11,-5 +}; + +void sinewave() +{ + int i, ii, y; + + /* Show printf formatting capabilties of catalog and printf messages + */ + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_DEBUG, "|-------------------------------------------------------|"); + + for (i = 0; i < 1; ++i) { + for (ii = 0; ii < 30; ++ii) { + y = sin_wave[ii]; + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_DEBUG, + MIPI_SYST_HASH("| '%%*so%%*s | '%*so%*s ' |", 0), + MIPI_SYST_PARAM_INT(14 - y / 2), + MIPI_SYST_PARAM_CSTR(""), + MIPI_SYST_PARAM_INT(14 + y / 2), + MIPI_SYST_PARAM_CSTR("")); + } + } + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_DEBUG, "|-------------------------------------------------------|"); +} + +/* each client can use the 6-bit subtype value for tagging the write content */ +#define WRITE_DATA_TAG 0x1 + +/* raw data outputting + */ +void raw() +{ + unsigned char data[10]; + int i; + + for (i = 0; i < sizeof(data) / sizeof(data[0]); ++i) { + data[i] = i; + } + MIPI_SYST_WRITE(systh, MIPI_SYST_SEVERITY_MAX, WRITE_DATA_TAG, data, sizeof(data)); +} + +void short_messages() +{ + /* simple values + */ + MIPI_SYST_SHORT32(systh, 0x1234567); + MIPI_SYST_SHORT64(systh, 0x112233445566778); + + /* Example using a mask to classify values + * see collateral xml where mask is defined + */ +#define E_MASK 0x0E000000 /* 0xE in bits 24..28 means error, the lower bits error number */ +#define E_ONE E_MASK|1 +#define E_TWO E_MASK|2 + + MIPI_SYST_SHORT32(systh, E_ONE); + MIPI_SYST_SHORT32(systh, E_TWO); + +#define W_MASK 0x0F000000 /* 0xF in bits 24..28 means warning, the lower bits warning number */ +#define W_ONE W_MASK|1 +#define W_TWO W_MASK|2 + + MIPI_SYST_SHORT32(systh, W_ONE); + MIPI_SYST_SHORT32(systh, W_TWO); +} + +void foo() +{ + MIPI_SYST_CATALOG32_0(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("in function foo",0)); +} + +void bar() +{ + MIPI_SYST_CATALOG32_0(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("in function bar",0)); +} + +void printf_format_test() +{ + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|-------------------------------------------------------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| printf Format | printf Result |"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|---------------------------------strings---------------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30s' | '%30s' |", "right-justified"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30s' | '%-30s' |", "left-justified"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|---------------------------------ASCII-----------------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%s' | '%s' |", "!\"#$%&'()*+-./0123456789:;<=>"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%s' | '%s' |", "?@ABCDEFGHIJKLMNOPQRSTUVWXYZ["); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%s' | '%s' |", "\\]^_`qbcdefghijklmnopqrstuvwx"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%s' | '%s' |", "yz{|}~ "); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|---------------------------------decimals--------------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30d' | '%30d' |", 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30d' | '%30d' |", 10); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30d' | '%30d' |", 100); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30d' | '%30d' |", 1000); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30d' | '%30d' |", 10000); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30d' | '%30d' |", 100000); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30d' | '%-30d' |", 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30d' | '%-30d' |", 10); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30d' | '%-30d' |", 100); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30d' | '%-30d' |", 1000); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30d' | '%-30d' |", 10000); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30d' | '%-30d' |", 100000); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|----------------------------------hexadecimals---------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30x' | '%30x' |", 0xa); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30x' | '%30x' |", 0xab); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30x' | '%30x' |", 0xabc); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30x' | '%30x' |", 0xabcd); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30x' | '%30x' |", 0xabcde); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30x' | '%30x' |", 0xabcdef); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30x' | '%-30x' |", 0xa); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30x' | '%-30x' |", 0xab); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30x' | '%-30x' |", 0xabc); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30x' | '%-30x' |", 0xabcd); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30x' | '%-30x' |", 0xabcde); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30x' | '%-30x' |", 0xabcdef); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30X' | '%30X' |", 0xa); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30X' | '%30X' |", 0xab); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30X' | '%30X' |", 0xabc); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30X' | '%30X' |", 0xabcd); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30X' | '%30X' |", 0xabcde); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30X' | '%30X' |", 0xabcdef); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30X' | '%-30X' |", 0xa); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30X' | '%-30X' |", 0xab); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30X' | '%-30X' |", 0xabc); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30X' | '%-30X' |", 0xabcd); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30X' | '%-30X' |", 0xabcde); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30X' | '%-30X' |", 0xabcdef); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|-----------------------------------double--------------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.1f' | '%30.1f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.2f' | '%30.2f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.3f' | '%30.3f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.4f' | '%30.4f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.5f' | '%30.5f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.6f' | '%30.6f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.7f' | '%30.7f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.8f' | '%30.8f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.9f' | '%30.9f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.10f' | '%30.10f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.1f' | '%-30.1f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.2f' | '%-30.2f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.3f' | '%-30.3f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.4f' | '%-30.4f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.5f' | '%-30.5f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.6f' | '%-30.6f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.7f' | '%-30.7f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.8f' | '%-30.8f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.9f' | '%-30.9f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.10f' | '%-30.10f' |", 3.14159265359); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|-----------------------------------scientific----------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.1e' | '%30.1e' |", 1.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.2e' | '%30.2e' |", 10.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.3e' | '%30.3e' |", 10.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.4e' | '%30.4e' |", 100.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.5e' | '%30.5e' |", 1000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.6e' | '%30.6e' |", 10000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.7e' | '%30.7e' |", 10000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.8e' | '%30.8e' |", 10000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.9e' | '%30.9e' |", 100000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%30.10e' | '%30.10e' |", 1000000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.1e' | '%-30.1e' |", 1.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.2e' | '%-30.2e' |", 10.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.3e' | '%-30.3e' |", 10.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.4e' | '%-30.4e' |", 100.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.5e' | '%-30.5e' |", 1000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.6e' | '%-30.6e' |", 10000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.7e' | '%-30.7e' |", 10000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.8e' | '%-30.8e' |", 10000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.9e' | '%-30.9e' |", 100000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30.10e' | '%-30.10e' |", 1000000.5); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "|-----------------------------------exotics-------------|"); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030hhu' | '%030hhu' |", (unsigned char)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030hu' | '%030hu' |", (unsigned int)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030lu' | '%030lu' |", (unsigned long int) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030llu' | '%030llu' |", (unsigned long long) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030hho' | '%030hho' |", (unsigned char)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030ho' | '%030ho' |", (unsigned int)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030lo' | '%030lo' |", (unsigned long int) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030llo' | '%030llo' |", (unsigned long long) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030hhx' | '%030hhx' |", (unsigned char)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030hx' | '%030hx' |", (unsigned int)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030lx' | '%030lx' |", (unsigned long int) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%030llx' | '%030llx' |", (unsigned long long) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30hhu' | '%-30hhu' |", (unsigned char)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%-30hu' | '%-30hu' |", (unsigned int)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30lu' | '%#-30lu' |", (unsigned long int) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30llu' | '%#-30llu' |", (unsigned long long) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30hho' | '%#-30hho' |", (unsigned char)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30ho' | '%#-30ho' |", (unsigned int)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30lo' | '%#-30lo' |", (unsigned long int) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30llo' | '%#-30llo' |", (unsigned long long) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30hhx' | '%#-30hhx' |", (unsigned char)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30hx' | '%#-30hx' |", (unsigned int)-1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30lx' | '%#-30lx' |", (unsigned long int) - 1); + MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, "| '%%#-30llx' | '%#-30llx' |", (unsigned long long) - 1); +} + +/* same as printf, but now using catalog messaging*/ +void catalog_format_test() +{ + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| catalog Format | Printed Result |",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|---------------------------------strings---------------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30s' | '%30s' |", 0), MIPI_SYST_PARAM_CSTR("right-justified")); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30s' | '%-30s' |", 0), MIPI_SYST_PARAM_CSTR("left-justified")); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|---------------------------------ASCII-----------------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%s' | '%s' |",0), MIPI_SYST_PARAM_CSTR("!\"#$%&'()*+-./0123456789:;<=>")); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%s' | '%s' |",1), MIPI_SYST_PARAM_CSTR("?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[")); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%s' | '%s' |",2), MIPI_SYST_PARAM_CSTR("\\]^_`qbcdefghijklmnopqrstuvwx")); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%s' | '%s' |",3), MIPI_SYST_PARAM_CSTR("yz{|}~ ")); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|---------------------------------decimals--------------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30d' | '%30d' |",0), MIPI_SYST_PARAM_INT(1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30d' | '%30d' |",1), MIPI_SYST_PARAM_INT(10)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30d' | '%30d' |",2), MIPI_SYST_PARAM_INT(100)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30d' | '%30d' |",3), MIPI_SYST_PARAM_INT(1000)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30d' | '%30d' |",4), MIPI_SYST_PARAM_INT(10000)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30d' | '%30d' |",5), MIPI_SYST_PARAM_INT(100000)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30d' | '%-30d' |",0), MIPI_SYST_PARAM_INT(1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30d' | '%-30d' |",1), MIPI_SYST_PARAM_INT(10)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30d' | '%-30d' |",2), MIPI_SYST_PARAM_INT(100)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30d' | '%-30d' |",3), MIPI_SYST_PARAM_INT(1000)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30d' | '%-30d' |",4), MIPI_SYST_PARAM_INT(10000)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30d' | '%-30d' |",5), MIPI_SYST_PARAM_INT(100000)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|----------------------------------hexadecimals---------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30x' | '%30x' |",0), MIPI_SYST_PARAM_INT(0xa)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30x' | '%30x' |",1), MIPI_SYST_PARAM_INT(0xab)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30x' | '%30x' |",2), MIPI_SYST_PARAM_INT(0xabc)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30x' | '%30x' |",3), MIPI_SYST_PARAM_INT(0xabcd)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30x' | '%30x' |",4), MIPI_SYST_PARAM_INT(0xabcde)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30x' | '%30x' |",5), MIPI_SYST_PARAM_INT(0xabcdef)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30x' | '%-30x' |",0), MIPI_SYST_PARAM_INT(0xa)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30x' | '%-30x' |",1), MIPI_SYST_PARAM_INT(0xab)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30x' | '%-30x' |",2), MIPI_SYST_PARAM_INT(0xabc)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30x' | '%-30x' |",3), MIPI_SYST_PARAM_INT(0xabcd)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30x' | '%-30x' |",4), MIPI_SYST_PARAM_INT(0xabcde)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30x' | '%-30x' |",5), MIPI_SYST_PARAM_INT(0xabcdef)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30X' | '%30X' |",0), MIPI_SYST_PARAM_INT(0xa)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30X' | '%30X' |",1), MIPI_SYST_PARAM_INT(0xab)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30X' | '%30X' |",2), MIPI_SYST_PARAM_INT(0xabc)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30X' | '%30X' |",3), MIPI_SYST_PARAM_INT(0xabcd)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30X' | '%30X' |",4), MIPI_SYST_PARAM_INT(0xabcde)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30X' | '%30X' |",5), MIPI_SYST_PARAM_INT(0xabcdef)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30X' | '%-30X' |",0), MIPI_SYST_PARAM_INT(0xa)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30X' | '%-30X' |",1), MIPI_SYST_PARAM_INT(0xab)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30X' | '%-30X' |",2), MIPI_SYST_PARAM_INT(0xabc)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30X' | '%-30X' |",3), MIPI_SYST_PARAM_INT(0xabcd)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30X' | '%-30X' |",4), MIPI_SYST_PARAM_INT(0xabcde)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30X' | '%-30X' |",5), MIPI_SYST_PARAM_INT(0xabcdef)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|-----------------------------------double--------------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.1f' | '%30.1f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.2f' | '%30.2f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.3f' | '%30.3f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.4f' | '%30.4f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.5f' | '%30.5f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.6f' | '%30.6f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.7f' | '%30.7f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.8f' | '%30.8f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.9f' | '%30.9f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.10f' | '%30.10f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.1f' | '%-30.1f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.2f' | '%-30.2f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.3f' | '%-30.3f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.4f' | '%-30.4f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.5f' | '%-30.5f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.6f' | '%-30.6f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.7f' | '%-30.7f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.8f' | '%-30.8f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.9f' | '%-30.9f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.10f' | '%-30.10f' |",0), MIPI_SYST_PARAM_FLOAT(3.14159265359)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|-----------------------------------scientific----------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.1e' | '%30.1e' |",0), MIPI_SYST_PARAM_DOUBLE(1.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.2e' | '%30.2e' |",0), MIPI_SYST_PARAM_DOUBLE(10.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.3e' | '%30.3e' |",0), MIPI_SYST_PARAM_DOUBLE(10.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.4e' | '%30.4e' |",0), MIPI_SYST_PARAM_DOUBLE(100.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.5e' | '%30.5e' |",0), MIPI_SYST_PARAM_DOUBLE(1000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.6e' | '%30.6e' |",0), MIPI_SYST_PARAM_DOUBLE(10000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.7e' | '%30.7e' |",0), MIPI_SYST_PARAM_DOUBLE(10000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.8e' | '%30.8e' |",0), MIPI_SYST_PARAM_DOUBLE(10000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.9e' | '%30.9e' |",0), MIPI_SYST_PARAM_DOUBLE(100000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%30.10e' | '%30.10e' |",0), MIPI_SYST_PARAM_DOUBLE(1000000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.1e' | '%-30.1e' |",0), MIPI_SYST_PARAM_DOUBLE(1.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.2e' | '%-30.2e' |",0), MIPI_SYST_PARAM_DOUBLE(10.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.3e' | '%-30.3e' |",0), MIPI_SYST_PARAM_DOUBLE(10.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.4e' | '%-30.4e' |",0), MIPI_SYST_PARAM_DOUBLE(100.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.5e' | '%-30.5e' |",0), MIPI_SYST_PARAM_DOUBLE(1000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.6e' | '%-30.6e' |",0), MIPI_SYST_PARAM_DOUBLE(10000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.7e' | '%-30.7e' |",0), MIPI_SYST_PARAM_DOUBLE(10000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.8e' | '%-30.8e' |",0), MIPI_SYST_PARAM_DOUBLE(10000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.9e' | '%-30.9e' |",0), MIPI_SYST_PARAM_DOUBLE(100000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30.10e' | '%-30.10e' |",0), MIPI_SYST_PARAM_DOUBLE(1000000.5)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("|-----------------------------------exotics-------------|",0)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030hhu' | '%030hhu' |",0), MIPI_SYST_PARAM_CHAR((unsigned char)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030hu' | '%030hu' |",0), MIPI_SYST_PARAM_INT((unsigned int)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030lu' | '%030lu' |",0), MIPI_SYST_PARAM_LONG((unsigned long int) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030llu' | '%030llu' |",0), MIPI_SYST_PARAM_LONGLONG((unsigned long long) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030hho' | '%030hho' |",0), MIPI_SYST_PARAM_CHAR((unsigned char)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030ho' | '%030ho' |",0), MIPI_SYST_PARAM_INT((unsigned int)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030lo' | '%030lo' |",0), MIPI_SYST_PARAM_LONG((unsigned long int) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030llo' | '%030llo' |",0), MIPI_SYST_PARAM_LONGLONG((unsigned long long) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030hhx' | '%030hhx' |",0), MIPI_SYST_PARAM_CHAR((unsigned char)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030hx' | '%030hx' |",0), MIPI_SYST_PARAM_INT((unsigned int)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030lx' | '%030lx' |",0), MIPI_SYST_PARAM_LONG((unsigned long int) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%030llx' | '%030llx' |",0), MIPI_SYST_PARAM_LONGLONG((unsigned long long) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30hhu' | '%-30hhu' |",0), MIPI_SYST_PARAM_CHAR((unsigned char)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%-30hu' | '%-30hu' |",0), MIPI_SYST_PARAM_INT((unsigned int)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30lu' | '%#-30hu' |",0), MIPI_SYST_PARAM_LONG((unsigned long int) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30llu' | '%#-30llu' |",0), MIPI_SYST_PARAM_LONGLONG((unsigned long long) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30hho' | '%#-30hho' |",0), MIPI_SYST_PARAM_CHAR((unsigned char)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30ho' | '%#-30ho' |",0), MIPI_SYST_PARAM_INT((unsigned int)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30lo' | '%#-30lo' |",0), MIPI_SYST_PARAM_LONG((unsigned long int) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30llo' | '%#-30llo' |",0), MIPI_SYST_PARAM_LONGLONG((unsigned long long) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30hhx' | '%#-30hhx' |",0), MIPI_SYST_PARAM_CHAR((unsigned char)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30hx' | '%#-30hx' |",0), MIPI_SYST_PARAM_INT((unsigned int)-1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30lx' | '%#-30lx' |",0), MIPI_SYST_PARAM_LONG((unsigned long int) - 1)); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("| '%%#-30llx' | '%#-30llx' |",0), MIPI_SYST_PARAM_LONGLONG((unsigned long long) - 1)); +} \ No newline at end of file diff --git a/examples/client/systclient.c b/examples/client/systclient.c new file mode 100644 index 0000000..d0ab0bb --- /dev/null +++ b/examples/client/systclient.c @@ -0,0 +1,96 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the +distribution. + +* Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "mipi_syst.h" + +/* Example SyS-T client code using various instrumentation call types */ + +const struct mipi_syst_origin origin = +MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0x8A9C, 0x4014, 0xA65A, 0x2F36A36D96E4, 1); +struct mipi_syst_handle * systh; + +void banner(); +void sinewave(); +void raw(); +void printf_format_test(); +void catalog_format_test(); +void short_messages(); + +int main(int argc, char* argv[]) +{ +#if defined(MIPI_SYST_STATIC) + MIPI_SYST_INIT(mipi_syst_platform_init, 0); +#endif + + systh = MIPI_SYST_ALLOC_HANDLE(&origin); + + /* add optional fields */ + MIPI_SYST_ENABLE_HANDLE_CHECKSUM(systh, 1); + MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(systh, 1); + + MIPI_SYST_BUILD(systh, MIPI_SYST_SEVERITY_MAX, 0x00010000, "version banner string", sizeof("version banner string")); + + MIPI_SYST_CATALOG32_3(systh, MIPI_SYST_SEVERITY_INFO, + MIPI_SYST_HASH("SyS-T Library version %d.%d.%d",0), + MIPI_SYST_VERSION_MAJOR, + MIPI_SYST_VERSION_MINOR, + MIPI_SYST_VERSION_PATCH); + + banner(); + catalog_format_test(); + printf_format_test(); + sinewave(); + raw(); + short_messages(); + + /* Different catalog calls */ + MIPI_SYST_CATPRINTF64_0(systh, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, "Hello world\n"); + MIPI_SYST_CATPRINTF32(systh, MIPI_SYST_SEVERITY_INFO, 2, "%s=%d\n", + MIPI_SYST_PARAM_CSTR("state"), + MIPI_SYST_PARAM_INT(10) + ); + MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, MIPI_SYST_HASH("%s=%d\n", 0), + MIPI_SYST_PARAM_CSTR("state"), + MIPI_SYST_PARAM_INT(10) + ); + + /* Release any resources associated with this SyS-T handle. + */ + MIPI_SYST_DELETE_HANDLE(systh); + +#if defined(MIPI_SYST_STATIC) + MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy); +#endif + + return 0; +} \ No newline at end of file diff --git a/examples/client/template.xml b/examples/client/template.xml new file mode 100644 index 0000000..1708730 --- /dev/null +++ b/examples/client/template.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + displayAsField + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/cmake/FindSyST.cmake b/examples/cmake/FindSyST.cmake new file mode 100644 index 0000000..006238a --- /dev/null +++ b/examples/cmake/FindSyST.cmake @@ -0,0 +1,74 @@ +# - Try to find the SyS-T headers and libraries +# +# This module defines +# SYST_INCLUDE_DIRS, where to find header files +# SYST_LIBRARIES, the libraries to link against +# SYST_FOUND, true if SyS-T installation found + + +if (NOT SYST_SDK AND NOT $ENV{SYST_SDK} STREQUAL "") + set(SYST_SDK $ENV{SYST_SDK}) +endif() + +set (SYST_INCLUDE_SEARCH_DIRS + ../include + /usr/include + /usr/local/include +) + +set (SYST_LIBRARIES_SEARCH_DIRS + ../lib + /usr/lib + /usr/local/lib +) + +if (SYST_SDK) + file(TO_CMAKE_PATH ${SYST_SDK} SYST_SDK) + + + set (SYST_INCLUDE_SEARCH_DIRS + ${SYST_SDK}/include + ${SYST_INCLUDE_SEARCH_DIRS} + ) + + set (SYST_LIBRARIES_SEARCH_DIRS + ${SYST_SDK}/bin + ${SYST_SDK}/lib + ${SYST_INCLUDE_SEARCH_DIRS} + ) +endif () + +find_path (SYST_INCLUDE_DIRS + mipi_syst.h + HINTS + ${SYST_INCLUDE_SEARCH_DIRS} +) + +find_library(SYST_LIBRARIES_STATIC + mipi_syst_static + HINTS + ${SYST_LIBRARIES_SEARCH_DIRS} +) + +find_library(SYST_LIBRARIES_DYNAMIC + mipi_syst + HINTS + ${SYST_LIBRARIES_SEARCH_DIRS} +) + + +include(FindPackageHandleStandardArgs) + +set (SYST_notfound_msg + "Could not find MIPI SyS-T SDK. Try setting SYST environment variable." +) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS ( + SYST DEFAULT_MSG SYST_INCLUDE_DIRS SYST_LIBRARIES_STATIC SYST_LIBRARIES_DYNAMIC +) + +mark_as_advanced ( + SYST_INCLUDE_DIRS + SYST_LIBRARIES_STATIC + SYST_LIBRARIES_DYNAMIC +) diff --git a/examples/hello/CMakeLists.txt b/examples/hello/CMakeLists.txt new file mode 100644 index 0000000..e6657d1 --- /dev/null +++ b/examples/hello/CMakeLists.txt @@ -0,0 +1,11 @@ +include_directories( + ${SYST_INCLUDE_DIRS} +) + +add_executable(hello hello.c) +target_link_libraries(hello ${SYST_LIBRARIES}) + +install(TARGETS hello + RUNTIME DESTINATION bin + LIBRARY DESTINATION bin +) \ No newline at end of file diff --git a/examples/hello/hello.c b/examples/hello/hello.c new file mode 100644 index 0000000..b2924db --- /dev/null +++ b/examples/hello/hello.c @@ -0,0 +1,73 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include "mipi_syst.h" /* SyS-T definitions */ + + +/* Define origin used by this example as the message client ID + */ +static const struct mipi_syst_origin origin = +MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + + +int main(int argc, char* argv[]) +{ + struct mipi_syst_handle* systh; + +#if defined(MIPI_SYST_STATIC) + /* Initialize SyS-T subsystem when using static linking to SyS-T. + * Note: The call to MIPI_SYS_INIT() is done by the shared library + * loader initialization function when dyanmic linking is used. + */ + MIPI_SYST_INIT(mipi_syst_platform_init, 0); +#endif + + /* Initialize a SyS-T output handle structure + */ + systh = MIPI_SYST_ALLOC_HANDLE( &origin ); + + /* Send a string message with payload "Hello World!" + */ + MIPI_SYST_DEBUG(systh, MIPI_SYST_SEVERITY_INFO, "Hello SyS-T!" ,sizeof("Hello SyS-T!")); + + /* Release any resources associated with this SyS-T handle. + */ + MIPI_SYST_DELETE_HANDLE(systh); + +#if defined(MIPI_SYST_STATIC) + /* Perform SyS-T subsystem cleanup when using static linking. + */ + MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy); +#endif + return 0; +} \ No newline at end of file diff --git a/examples/scripts/bldall.sh b/examples/scripts/bldall.sh new file mode 100644 index 0000000..37a48d6 --- /dev/null +++ b/examples/scripts/bldall.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# +# Integration build test script for all components +# +# * Build all components using example platform of the SyS-T library. +# * Run the "hello" example and feed it's output into the printer. +# +# The script will end with printing "Hello SyS-T" on success. +set -e +SELF_DIR="$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)" + +#BUILDMODE=Debug +BUILDMODE=MinSizeRel +BLD_ROOT=${BLD_ROOT:="$SELF_DIR/build"} +DEPLOY_DIR="$BLD_ROOT/sdk" +mkdir -p $DEPLOY_DIR + +echo +echo ----- Building SyS-T library ... ---------------------------------------- +echo + +mkdir -p $BLD_ROOT/lib +pushd $BLD_ROOT/lib +cmake \ + -DSYST_BUILD_TEST=ON \ + -DSYST_BUILD_DOC=ON \ + -DSYST_BUILD_PLATFORM_NAME=example \ + -DCMAKE_INSTALL_PREFIX="$DEPLOY_DIR" \ + -DCMAKE_BUILD_TYPE=$BUILDMODE \ + "$SELF_DIR/../../library" + +cmake --build . --target install +cmake --build . --target RUN_TEST_VERBOSE +pushd + +echo +echo ----- Building Examples ... --------------------------------------------- +echo + +mkdir -p $BLD_ROOT/examples +pushd $BLD_ROOT/examples + +cmake \ + -DCMAKE_INSTALL_PREFIX="$DEPLOY_DIR" \ + -DSYST_SDK="$DEPLOY_DIR" \ + -DCMAKE_BUILD_TYPE=$BUILDMODE \ + "$SELF_DIR/.." + +cmake --build . --target install +pushd + +echo +echo ----- Building printer ... ---------------------------------------------- +echo + +mkdir -p $BLD_ROOT/printer +pushd $BLD_ROOT/printer + +cmake \ + -DCMAKE_INSTALL_PREFIX="$DEPLOY_DIR" \ + -DCMAKE_BUILD_TYPE=$BUILDMODE \ + "$SELF_DIR/../../printer" + +cmake --build . --target install +cmake --build . --target RUN_TEST_VERBOSE +pushd + + +echo +echo ----- Running the SyS-T 'hello world' example -------------------------- +echo +pushd "$DEPLOY_DIR/bin" > /dev/null +echo "$PWD/hello | $PWD/systprint -p -" +echo +./hello | ./systprint -p - +popd > /dev/null +exit 0 diff --git a/external/googletest b/external/googletest new file mode 160000 index 0000000..a6f06bf --- /dev/null +++ b/external/googletest @@ -0,0 +1 @@ +Subproject commit a6f06bf2fd3b832822cd4e9e554b7d47f32ec084 diff --git a/external/pugixml b/external/pugixml new file mode 160000 index 0000000..c53fdab --- /dev/null +++ b/external/pugixml @@ -0,0 +1 @@ +Subproject commit c53fdab93af76106b963216d85897614b996f8b6 diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt new file mode 100644 index 0000000..e641b3e --- /dev/null +++ b/library/CMakeLists.txt @@ -0,0 +1,136 @@ +project (mipi_syst_library) +cmake_minimum_required (VERSION 2.8) +enable_testing() + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "") + +find_package(Doxygen) + +if (NOT DEFINED SYST_CFG_CONFORMANCE_LEVEL) + message(WARNING "SYST_CFG_CONFORMANCE_LEVEL not set, defaulting to leval 30 (complete implementation)") +else() + message(STATUS "Building for SyS-T conformance level ${SYST_CFG_CONFORMANCE_LEVEL}.") +endif() +# SYS-T API version settings +# +set(SYST_CFG_VERSION_MAJOR "1" CACHE STRING "Supported MIPI SyS-T major specification version.") +set(SYST_CFG_VERSION_MINOR "0" CACHE STRING "Supported MIPI SyS-T minor specification version.") +set(SYST_CFG_CONFORMANCE_LEVEL "30" CACHE STRING "Supported MIPI SyS-T API conformance level. (10=min, 20=low overhead, 30=complete)") + +# SYS-T Implementation patch level +# +set(SYST_CFG_VERSION_PATCH "0" CACHE PATH "SyS-T Library patch level.") + + + +# External build dependencies: +# * Google Test https://github.com/google/googletest (for unit tests) +# +if (NOT DEFINED SYST_BUILD_GTEST_DIR) + get_filename_component(GTEST_DIR "${CMAKE_CURRENT_LIST_DIR}/../external/googletest/googletest" ABSOLUTE) +endif() +set(SYST_BUILD_GTEST_DIR "${GTEST_DIR}" CACHE PATH "Location of Google Test sources, which are needed for unit tests") +if (NOT EXISTS "${SYST_BUILD_GTEST_DIR}/include/gtest/gtest.h") + message(WARNING + "SYST_BUILD_GTEST_DIR=${SYST_BUILD_GTEST_DIR} does not point to a Google Test source location. Unittests will not be build. Try running \n" + "git submodule update --init --recursive\n" + "to populate the external folder git submodules or change SYST_BUILD_GTEST_DIR to point to Google Test sources.") + set(BUILD_TEST "OFF") +else() + set(BUILD_TEST "ON") +endif() + +option(SYST_BUILD_DOC "Create documentation (requires Doxygen)" ${DOXYGEN_FOUND}) +option(SYST_BUILD_TEST "Build unit test (requires GoogleTest)" ${BUILD_TEST}) +option(SYST_BUILD_HW_CRC "Use CPU crc32 instruction support if supported by architecture." ON) + +if (NOT DEFINED SYST_BUILD_PLATFORM_NAME) + set (SYST_BUILD_PLATFORM_NAME "example" CACHE STRING "Directory name of platform specific source code") + message(WARNING "SYST_BUILD_PLATFORM_NAME directory name variable is not set, using 'example' as default.") +endif() + + +# HW CRC support enabling +# +if (SYST_BUILD_HW_CRC) + if (CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86|x86_64.*|i?86.*|AMD64.*") + add_definitions(-D MIPI_SYST_CRC_INTRINSIC_ON) + message(STATUS "Enabling x86 crc32 CPU instruction support (SSE 4.2). Unset SYST_BUILD_HW_CRC to disable." ) + if (NOT WIN32) + add_definitions(-msse4.2) + endif() + endif() +endif() + +configure_file(include/mipi_syst.h.in ${CMAKE_CURRENT_BINARY_DIR}/include/mipi_syst.h) + +set (mipi_syst_Includes + include/mipi_syst.h.in + include/mipi_syst/api.h + include/mipi_syst/compiler.h + include/mipi_syst/crc32.h + include/mipi_syst/message.h + include/mipi_syst/inline.h +) + +set (mipi_syst_Sources + src/mipi_syst_api.c + src/mipi_syst_compiler.c + src/mipi_syst_crc32.c + src/mipi_syst_init.c + src/mipi_syst_inline.c + src/mipi_syst_writer.c +) + +set (mipi_syst_Platform_inc platform/${SYST_BUILD_PLATFORM_NAME}/include) +set (mipi_syst_Platform_src platform/${SYST_BUILD_PLATFORM_NAME}/src/mipi_syst_platform.c) + +file(GLOB mipi_syst_Platform_includes "${mipi_syst_Platform_inc}/*.h") + +include_directories( + ${mipi_syst_Platform_inc} + ${CMAKE_CURRENT_BINARY_DIR}/include + include +) + +add_library(mipi_syst + SHARED + ${mipi_syst_Platform_includes} + ${mipi_syst_Includes} + ${mipi_syst_Sources} + ${mipi_syst_Platform_src} +) + +add_library(mipi_syst_static + STATIC + ${mipi_syst_Platform_includes} + ${mipi_syst_Includes} + ${mipi_syst_Sources} + ${mipi_syst_Platform_src} +) + +set_target_properties(mipi_syst PROPERTIES + VERSION ${SYST_CFG_VERSION_MAJOR}.${SYST_CFG_VERSION_MINOR}.${SYST_CFG_VERSION_PATCH} + COMPILE_FLAGS "-DMIPI_SYST_EXPORTS" + FOLDER "Instrumentation Library" +) + +set_target_properties(mipi_syst_static PROPERTIES + VERSION ${SYST_CFG_VERSION_MAJOR}.${SYST_CFG_VERSION_MINOR}.${SYST_CFG_VERSION_PATCH} + COMPILE_FLAGS "-DMIPI_SYST_STATIC" + FOLDER "Instrumentation Library" +) + +install(TARGETS mipi_syst mipi_syst_static + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) + +install(DIRECTORY include/mipi_syst DESTINATION include) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/ DESTINATION include) +install(DIRECTORY ${mipi_syst_Platform_inc}/ DESTINATION include) + +add_subdirectory(doxygen) +add_subdirectory(test) diff --git a/library/doxygen/Adapting.md b/library/doxygen/Adapting.md new file mode 100644 index 0000000..3a6e546 --- /dev/null +++ b/library/doxygen/Adapting.md @@ -0,0 +1,71 @@ +\page mipi_syst_adapting_page Adapting the SyS-T Library + +[TOC] + +SyS-T Platform Code {#mipi_syst_adapting_platform} +============================================================================== +The SyS-T library uses a platform concept for integrating it into a system. +A platform is responsible for the following: + + * Providing the low level trace output code that interfaces with the + underlying trace transport system. This is typically trace aggregating + hardware or a protocol driver. The ``example`` platform code + simply prints the SyS-T protocol output to stdout. + + * Providing platform hook functions for SyS-T global and handle state + manipulations. This is platform specific code that allows efficient + processing of SyS-T. + +SyS-T ships with the following example platforms: + +Platform Directory| Description +------------|-------------------------------------------- +example | Simple trace output driver that prints all IOs as hexadecimal data strings to ``stdout``. The [printer](@ref mipi_syst_printer_page) project can consume this output and decode it into human readable text using comma separated value format (CSV). +mipi_stp_sim| [MIPI System Trace Protocol](https://mipi.org/specifications/stp) format file writer. It shows how to connect the library with an STP generator. In this example code, a software encoder is used to produce the STP data. +nop | A minimal boilerplate platform implementation that allows the library to compile but doesn't produce any output. + +Adapting SyS-T means providing your own platform code. The recommended procedure +is to clone an existing platform folder and adapt it as needed. The following +chapter shows an example of how this can be done. + +Copy an Existing Platform {#mipi_syst_adapting_copy} +============================================================================== + +Example: + + $ cd platform + $ cp -rv example myplatform + +Adapting the Platform {#mipi_syst_adapting_adapt} +============================================================================== + +Modify the copied platfrom code to interface with the system by performing +the following changes + + * Implement the hook functions for state and handle initialisation and + destruction. + * Interface the data output writer code with the trace transport. + The writer routine in the library assumes a MIPI STP protocol style + output processor and calls a set of STP tailored macros named + ```MIPI_SYST_OUTPUT_*``` for the actual write operations. These macros + are defined in ```platform.h```. See #MIPI_SYST_OUTPUT_D32TS for an example + macro definition to emit a SyS-T message header which will turn into a MIPI + STP D32TS packet when using STP output. Alternatively replace the entire + writer code in a case where the MIPI STP writer cannot be efficently + interfaced with the transport. + +Edit the Build Configuration {#mipi_syst_adapting_build} +============================================================================== +Define the CMake symbol ```SYST_BUILD_PLATFORM_NAME``` to point to the new +platform directory name. See the page @ref mipi_syst_building_page +for further information on building SyS-T. + +Specify the API conformance level by setting the CMAKE symbol +```SYST_CFG_CONFORMANCE_LEVEL``` to one of the following: + +| Conformance level | Data Size | +| ------------------|--------------------------------------------------------| +| 10 | Minimal - only Short and Compact Messages | +| 20 | Low overhead - excluding printf and crc32 | +| 30 | complete - All messages and options | + diff --git a/library/doxygen/ApiOverview.md b/library/doxygen/ApiOverview.md new file mode 100644 index 0000000..5ab5161 --- /dev/null +++ b/library/doxygen/ApiOverview.md @@ -0,0 +1,172 @@ +\page mipi_syst_api_overview Instrumentation API Overview + +[TOC] + +Overview {#mipi_syst_api} +============================================================================== +The SyS-T instrumentation API is exposed as a set of CPP Macros with the +prefix `MIPI_SYST_`. The definitions for the instrumentation API are provided by +the C-Language header file `mipi_syst.h`. This is the only header needed for +adding instrumentation calls to your software. + +See the @ref mipi_syst_example_page for a `hello world` style example that uses +the instrumentation API. + +SyS-T Library States {#mipi_syst_api_state} +============================================================================== + +The SyS-T library has 2 levels of data states to store information. These are: + +1. global state (mipi_syst_header structure) +2. per handle state (mipi_syst_handle structure) + +The global state contains data for the operation of the library itself and +is shared between SyS-T handles. The global state is initialized and +destroyed using the #MIPI_SYST_INIT and #MIPI_SYST_SHUTDOWN functions. + +SyS-T can operate with multiple global state structures. In this case the +initialization functions with the "_STATE" suffix in their names must be used +to specify the intended state (See #MIPI_SYST_INIT_STATE, +#MIPI_SYST_SHUTDOWN_STATE, #MIPI_SYST_INIT_HANDLE_STATE and #MIPI_SYST_ALLOC_HANDLE_STATE). + +The handle state is unique for each SyS-T +handle and allows sending trace data without causing data races with other +SyS-T handles. + +SyS-T Handles {#mipi_syst_api_handles} +============================================================================== +Each message generating instrumentation API expects a pointer to a `SyS-T handle` +as the first parameter. This handle builds the connection between the +Software API and trace emitting hardware or driver code. It can best be seen +as something similar to a FILE * in traditional C/C++ file IO. + +A SyS-T handle is obtained by using one of the #MIPI_SYST_ALLOC_HANDLE, +#MIPI_SYST_ALLOC_HANDLE_STATE, #MIPI_SYST_INIT_HANDLE, or +#MIPI_SYST_INIT_HANDLE_STATE macros. A handle is destroyed by calling +#MIPI_SYST_DELETE_HANDLE on it. + +SyS-T and Multi-threading {#mipi_syst_api_threading} +============================================================================== +The SyS-T library provides a thread safe usage model that, for performance +reasons, does not use any data locking techniques. It is important to +understand this model to avoid incorrect usage that would result in hard to +analyze data races or corrupted message data output. The threading model is +defined by the following rules: + +- SyS-T operates thread safe, as long as __SyS-T handles are not shared + between simultaneously executing threads__. +- Sharing a SyS-T handle between threads requires locking around each + instrumentation API call in the code using SyS-T. +- Platform adaption code that modifies the global library mipi_syst_header + state may need locking inside its hook functions to protect state data + members. See the mipi_stp_sim platform code in + platform/mipi_stp_sim/src/mipi_syst_platform.c for an example where locking + is required. + +The recommended SyS-T usage is to create a SyS-T handle exclusively for each +thread and to store it in thread local storage. This usage provides low +software overhead, as no locking is required while utilizing trace arbiter +hardware or trace creating drivers that are capable of supporting multiple +data channels in parallel. + +API Name Conventions {#mipi_syst_api_conventions} +============================================================================== +All API functions are provided as CPP macros with the prefix `MIPI_SYST_`. + +The data transmitting instrumentation calls exist in up to 4 variants for +generating additional location information. Location information describes +the instrumentation position of the API as either an instruction pointer +address, or a source "file:line" ID pair. This information is used during +trace decoding to map message data back to source locations. The name +conventions for the variants are: + +- **MIPI_SYST_(...)**
+ API without location information generation + +- **MIPI_SYST__LOC16(..,f, ...)**
+ API variant that includes the instrumentation source position as a + "file:line" id pair of 16-bit width each. The file id is user defined + and passed as an additional parameter. This API requires the SyS-T platform + feature define #MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD. + +- **MIPI_SYST__LOC32(..,f, ...)**
+ API variant that includes the instrumentation source position as a + "file:line" id pair of 32-bit width each. The file id is user defined + and passed as an additional parameter. This API requires the SyS-T platform + feature define #MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD. + +- **MIPI_SYST__LOCADDR(...)**
+ API variant that includes the instrumentation instruction address as + location. This API requires the SyS-T platform feature defines + #MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD and #MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS. + +See description of the #MIPI_SYST_DEBUG API call as an example showing all +variants. + +SyS-T Message Attributes {#mipi_syst_api_attributes} +============================================================================== +The SyS-T message produced by an API call contains mandatory and optional +data attributes. This chapter describes the attributes and how they are +defined when adding instrumentation calls.The message attributes are: + +- A 32-bit header describing the message type and content +- An optional 128-bit wide GUID identifying the message originating software + module. +- An optional location record +- An optional payload length +- API specific payload data of up to 64 Kbytes +- An optional CRC-32C checksum. + +![SyS-T Message Anatomy](mipi_sys_t_message_anatomy.png) + +SyS-T Message Header {#mipi_syst_api_header} +------------------------------------------------------------------------------ +Each SyS-T message starts with a 32-bit header, which is defined by the data +structure mipi_syst_msg_tag. The header contains the following information: + +- __Type and Subtype__ fields identifying the Message Type.
+ These fields are set internally by the API call. + +- Software __Module__ and __Unit__ IDs
+ These fields identify the software module that originated the message. They + are taken from the SyS-T handle used in the call. See the API calls + #MIPI_SYST_SET_HANDLE_GUID_UNIT and #MIPI_SYST_SET_HANDLE_MODULE_UNIT for an + example how the origin fields are used. + +- __Message Severity__
+ Each message contains a 3-bit severity level defined by the mipi_syst_severity + enumeration. + +- __Content__ Bits
+ These bits define what other optional attributes are present in the message. + +Message Origin GUID {#mipi_syst_api_guid} +------------------------------------------------------------------------------ +A message can contain a 128-bit wide GUID to identify the instrumented SW +module in a unique way. The GUID is emitted directly after the header if +the handle was initialized using the #MIPI_SYST_SET_HANDLE_GUID_UNIT API. The +GUID structure follows the RFC 4122 conventions and can be obtained +using various tools. One example is the `uuidgen` command on Linux. + +Message Location Information {#mipi_syst_api_loc} +------------------------------------------------------------------------------ +A message can contain location information describing the position of its +instrumentation call either as an instruction pointer address or as a +"file:line" ID pair. This location information is generated if one of the +API variants with the `_LOCADDR`, `_LOC16` or `_LOC32` suffix in the name is +used. + +Message Payload {#mipi_syst_api_payload} +------------------------------------------------------------------------------ +A message contains type-specific payload of up to 64 Kbytes, which is +generated internally by the API function from its parameters. These functions +also insert a 16-bit payload length field when when enabled by +the MIPI_SYST_ENABLE_HANDLE_LENGTH API. + +Message Checksum {#mipi_syst_api_chkssum} +------------------------------------------------------------------------------ +A message can end with a 32-bit CRC32C checksum calculated over all of the +message bytes, excluding the checksum value itself. The CRC generation is a +per SyS-T handle choice. It is enabled or disabled by the +#MIPI_SYST_ENABLE_HANDLE_CHECKSUM API. The default is disabled. + diff --git a/library/doxygen/Building.md b/library/doxygen/Building.md new file mode 100644 index 0000000..5f8f459 --- /dev/null +++ b/library/doxygen/Building.md @@ -0,0 +1,122 @@ +\page mipi_syst_building_page Building SyS-T + +[TOC] + +Building the SyS-T Library {#mipi_syst_building} +========================================================================= + +The SyS-T library includes CMake build support scripts. CMake is an +open-source, cross-platform build environment that is available for all major +platforms. The CMake tooling is available from https://cmake.org. + +Requirements for building SyS-T {#mipi_syst_build_req} +========================================================================= +The SyS-T Library requires the following tooling for building + +Component |Description +-----------------------|-------------------------- +CMake (https://cmake.org)|Build and packaging system +C-Compiler | Needed to build library from its C-Source code +C++-Compiler | Needed for building the unit test suite +Google Test (https://github.com/google/googletest)|Needed for building the unit test suite +Doxygen(www.doxygen.org)| Needed for building the HTML documentaion + +Configuring the build {#mipi_syst_build_conf} +========================================================================= +CMake based projects require configuration for generating the platform native +build support files from the CMake scripts. Configuring the SyS-T CMake scripts +follows CMake standard methodologies. Use the CMake documentation to familiarize +yourself with the CMake build environment. + +The SyS-T project uses the following configuration options: + +Configuration |Description +--------------------------|-------------------------------- +SYST_CFG_CONFORMANCE_LEVEL| The library conformance level setting (10=minimal, 20=cpu low overhead, 30=complete). +SYST_BUILD_PLATFORM_NAME | The name of the platform adaptation code directory (see also: @ref mipi_syst_adapting_platform). +SYST_BUILD_GTEST_DIR | File system location of the Google Test framework source code. This code is needed for the library unit tests only. +SYST_BUILD_TEST | Option to enable/disable generation of unit tests. +SYST_BUILD_DOC | Option to enable/disable generation of the HTML documentation (requires Doxygen) +CMAKE_INSTALL_PREFIX | File System location for installing the SyS-T build. + +Configuring using the CMake Gui +------------------------------------------------------------------------------ +The CMake distribution includs a GUI front end for setting up a configuration. +The GUI front end is started using the cmake-gui command. + +Perform the following steps inside the CMake Gui: + +- Point the "Where is the source code:" field to the library directory inside + the SyS-T distribution. +- Point the "Where to build the binaries:" field to a temporary location. This + directory will hold build artifacts like object files. Note: This is not the + installation location for the build result. +- Press "Configure". + A new dialog appears for selecting the desired native platform build tooling. + Select the desired tooling and press "Finish". CMake now parses the build + scripts and populates the variable table with build configuration options. +- Update the path for the variable ``CMAKE_INSTALL_PREFIX`` to point to your + desired install location. +- To build the unit tests, update the ``SYST_BUILD_GTEST_DIR`` variable to point + to the Google Test sources and check the ``SYST_BUILD_TEST`` field. +- To build the HTML documentation, verify that doxygen was found by CMake and + check the ``SYST_BUILD_DOC`` option. +- Press "Configure" again to activate the changed settings. +- Press "Generate" to generate the native build configuration files. + +Configuring using the CMake command line +------------------------------------------------------------------------------ +The SyS-T project can be configured with command line option, following +CMake standard methodologies. Follow these steps to setup a project using the +command line. + +- Create a new directory for holding the build artifact files and enter this + directory + + $ mkdir syst_build + $ cd syst_build + +- Run the configuration using the cmake tool. The following call shows an + example with all options set: + + ``` + $ cmake \ + -DSYST_BUILD_GTEST_DIR=/home/username/googletest \ + -DSYST_BUILD_TEST=ON \ + -DSYST_BUILD_DOC=ON \ + -DSYST_BUILD_PLATFORM=example \ + -DCMAKE_INSTALL_PREFIX=/opt/mipi_syst \ + /home/jdoe/src/sys_t +``` + +Building and Installing {#mipi_syst_building_deploy} +========================================================================= +The build system provides various targets for building and installing the +SyS-T library, header files and documentation. The following table shows which +targets exist: + +Target Name |Description +----------------|-------------------------------- +all | Build binaries and, if enabled, the unit tests +doc | Build HTML documentation +syst_unittest | Build unit tests +install | Install to CMAKE_INSTALL_PREFIX location, implies 'all' +clean | Remove build artifacts +RUN_TEST | Run the tests (not showing test output) +RUN_TEST_VERBOSE| Run the tests (showing test output) + +Integration Build and Test Script +========================================================================= +A bash script in ``examples/scripts/bldall.sh`` can be used to run an +integration test using the different projects. The script builds all projects +sequentially using the example library platform. It then runs their components +tests and finally calls the printer tool to format the output of +the ``hello`` example application. The following transcript shows how to +run execute the script. The BLD_ROOT variable sets the location of the build +folder. If unset, the script creates a local build folder inside the scripts +folder. + +``` +$ cd sys-t/examples/scripts +$ BLD_ROOT=/tmp/sys_t_test_bld ./bldall.sh +``` diff --git a/library/doxygen/CMakeLists.txt b/library/doxygen/CMakeLists.txt new file mode 100644 index 0000000..bad16b3 --- /dev/null +++ b/library/doxygen/CMakeLists.txt @@ -0,0 +1,27 @@ + +if (SYST_BUILD_DOC) + if (NOT DOXYGEN_FOUND) + message( + WARNING + "SYST_BUILD_DOC variable set, but Doxygen was not found -skipping documentation" + ) + else() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../include/mipi_syst.h.in + ${CMAKE_CURRENT_BINARY_DIR}/gensrc/mipi_syst.h @ONLY + ) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in + ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY + ) + + add_custom_target(doc + ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Generating Doxygen manual for ${CMAKE_PROJECT_NAME} in ${CMAKE_CURRENT_BINARY_DIR}" + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${DOXYGEN_IDE_FILES} + ) + + set_target_properties(doc PROPERTIES + FOLDER "Instrumentation Library" + ) + endif() +endif(SYST_BUILD_DOC) diff --git a/library/doxygen/Catgen.md b/library/doxygen/Catgen.md new file mode 100644 index 0000000..c9fdfe5 --- /dev/null +++ b/library/doxygen/Catgen.md @@ -0,0 +1,250 @@ +\page mipi_syst_catgen_page Automated Catalog Generation + +[TOC] + +Catalog Example {#mipi_syst_catgen_sample} +============================================================================== +The distribution includes an example application that uses catalog +messages generated by the [MIPI_SYST_CATPRINTF](@ref PrintfApi), +[MIPI_SYST_CATALOG64](@ref CatAPI64) or [MIPI_SYST_CATALOG32](@ref CatAPI32) +families of instrumentation API calls. The example also includes the necessary +configuration to support the automated decode collateral generation tool. This +tool scans the source code and extracts the catalog decode information into +collateral needed by SyS-T decoders. + +The example is stored under `examples/client` in the source code distribution. + +Decode Collateral Creation Tool {#mipi_syst_catgen_tool} +============================================================================== +The project includes a PERL based collateral generator that automates the +creation and updating of SyS-T decode collateral in XML format. This +generator parses the catalog instrumentation points by scanning the +client source code. The tool can be embedded into a software build process to +keep software builds and decode collateral updated at the same time. The tool +is stored in the ```collateral/generator``` directory of the project with the +name ```syst_cgen.pl```. + +Dependencies {#mipi_syst_catgen_deps} +------------------------------------------------------------------------------ +The generator is written in PERL and requires a PERL installation with the +following optional modules installed. + * String::Escape + * Xml::Simple + +Refer to the documentation for your PERL installation on module installation. +On Linux, the following commands can be used: + +``` +$ perl -MCPAN -e 'install XML::Simple' +$ perl -MCPAN -e 'install String::Escape' +``` + +Collateral Generation Process {#mipi_syst_catgen_process} +------------------------------------------------------------------------------ +The collateral generator takes a SyS-T collateral template and +a configuration file as input. The configuration file defines the locations +and file extensions of the source files to be scanned and how the catalog +message calls +inside the source code are named. The tool can then detect the catalog +calls, and extract the format strings, source locations, and +catalog IDs to update the collateral template file. The result is a +new collateral file that matches the actual state of the source code. + +Catalog Generation Example {#mipi_syst_catgen_example_generation} +------------------------------------------------------------------------------ +The client application in ```example/client``` uses various catalog calls. +It provides a configuration file for ```syst_cgen.pl``` to detect +the SyS-T catalog message calls, and a collateral template file that is +updated by the generator. It is executed in the following way: + +``` +$ perl ../../collateral/generator/syst_cgen.pl -config collateral_config.xml +syst_cgen.pl: Parsing: ./othersource.c +syst_cgen.pl: Add ./othersource.c with file id 1 to file catalog +syst_cgen.pl: Parsing finished: ./othersource.c, found 127 call(s) +syst_cgen.pl: Parsing: ./systclient.c +syst_cgen.pl: Add ./systclient.c with file id 2 to file catalog +syst_cgen.pl: Parsing finished: ./systclient.c, found 4 call(s) +syst_cgen.pl: Generating XML structure +syst_cgen.pl: Loaded template collateral file template.xml +syst_cgen.pl: Generating XML structure finished +syst_cgen.pl: Writing XML file: generated_catalog.xml +syst_cgen.pl: Writing XML file finished +``` +Catalog Generator Configuration Example {#mipi_syst_catgen_example_config} +------------------------------------------------------------------------------ +The following XML file shows the example configuration file from the client +example. The file lists the SyS-T catalog instrumentation call patterns and +can be reused for other clients. Only the options at the beginning may require +adaptations. + +```{.xml} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +Catalog Generator Template File {#mipi_syst_catgen_example_template} +------------------------------------------------------------------------------ +The following XML file shows the template collateral file that is updated by +the generator tool with the source code information. Note the empty XML +elements called ````, ````, and +````. The generator replaces these empty elements with the +collected information. The remaining contents are kept unchanged. +```{.xml} + + + + + + + + + + + + + + + + + + + + + displayAsField + + + + + + + + + + + + + + + + + + %x]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` \ No newline at end of file diff --git a/library/doxygen/Doxyfile.in b/library/doxygen/Doxyfile.in new file mode 100644 index 0000000..8998cd2 --- /dev/null +++ b/library/doxygen/Doxyfile.in @@ -0,0 +1,1893 @@ +# Doxyfile 1.8.3.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "MIPI System Software Trace Library" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = "1.0" + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Instrumentation Library for MIPI SyS-T" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = . + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = @CMAKE_CURRENT_SOURCE_DIR@ + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented classes, +# or namespaces to their corresponding documentation. Such a link can be +# prevented in individual cases by by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if section-label ... \endif +# and \cond section-label ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = @CMAKE_CURRENT_SOURCE_DIR@/DoxygenLayout.xml + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. Do not use +# file names with spaces, bibtex cannot handle them. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = @CMAKE_CURRENT_SOURCE_DIR@ \ + @CMAKE_CURRENT_SOURCE_DIR@/../src \ + @CMAKE_CURRENT_BINARY_DIR@/gensrc \ + @CMAKE_CURRENT_SOURCE_DIR@/../include \ + @CMAKE_CURRENT_SOURCE_DIR@/../platform/example + + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = @CMAKE_CURRENT_SOURCE_DIR@/test \ + @CMAKE_CURRENT_SOURCE_DIR@/examples \ + @CMAKE_CURRENT_SOURCE_DIR@/obj \ + @CMAKE_CURRENT_SOURCE_DIR@/platform/mipi_stp_sim \ + @CMAKE_CURRENT_SOURCE_DIR@/platform/linux \ + @CMAKE_CURRENT_SOURCE_DIR@/sdk \ + @CMAKE_CURRENT_SOURCE_DIR@/example.c + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page (index.html). +# This can be useful if you have a project on for instance GitHub and want reuse +# the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = mainpage.md + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = YES + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = NO + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = @CMAKE_CURRENT_BINARY_DIR@/html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = @CMAKE_CURRENT_SOURCE_DIR@/mipi_sys_t_message_anatomy.png \ + @CMAKE_CURRENT_SOURCE_DIR@/mipi_sys_t_library_flow.png \ + @CMAKE_CURRENT_SOURCE_DIR@/mipi_sys_t_event_header.png + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = "C:\Program Files (x86)\HTML Help Workshop\hhc.exe" + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and +# SVG. The default value is HTML-CSS, which is slower, but has the best +# compatibility. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. +# There are two flavours of web server based search depending on the +# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for +# searching and an index file used by the script. When EXTERNAL_SEARCH is +# enabled the indexing and searching needs to be provided by external tools. +# See the manual for details. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain +# the search results. Doxygen ships with an example indexer (doxyindexer) and +# search engine (doxysearch.cgi) which are based on the open source search engine +# library Xapian. See the manual for configuration details. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will returned the search results when EXTERNAL_SEARCH is enabled. +# Doxygen ships with an example search engine (doxysearch) which is based on +# the open source search engine library Xapian. See the manual for configuration +# details. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id +# of to a relative location where the documentation can be found. +# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/../include \ + @CMAKE_CURRENT_BINARY_DIR@/gensrc \ + @CMAKE_CURRENT_SOURCE_DIR@/../platform/example/include + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = *.h + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD \ + MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS \ + MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA \ + MIPI_SYST_PCFG_ENABLE_CATID64_API \ + MIPI_SYST_PCFG_ENABLE_CATID32_API \ + MIPI_SYST_PCFG_ENABLE_WRITE_API \ + MIPI_SYST_PCFG_ENABLE_BUILD_API \ + MIPI_SYST_PCFG_ENABLE_STRING_API \ + MIPI_SYST_PCFG_ENABLE_64BIT_IO \ + MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY \ + MIPI_SYST_PCFG_ENABLE_TIMESTAMP \ + __GNUC__ \ + __x86_64__ \ + _DOXYGEN_ + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/library/doxygen/DoxygenLayout.xml b/library/doxygen/DoxygenLayout.xml new file mode 100644 index 0000000..b1040f1 --- /dev/null +++ b/library/doxygen/DoxygenLayout.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/library/doxygen/Example.md b/library/doxygen/Example.md new file mode 100644 index 0000000..ac32783 --- /dev/null +++ b/library/doxygen/Example.md @@ -0,0 +1,68 @@ +\page mipi_syst_example_page Instrumentation API Examples + +[TOC] + +SyS-T ships with various example applications that show how to use +instrumentation calls. The examples are stored inside the examples +directory of the distribution file set. A CMake script is provided for +building the examples on CMake supported platforms. To build the +examples without CMake, add the SyS-T include directory to the list of +include directories for the compiler being used and tell the linker +to link against the SyS-T library. + +Example for building a SyS-T example on Linux: + + $ export MIPI_SYST_SDK= + $ gcc -o hello hello.c -I$MIPI_SYST_SDK/include -L$MIPI_SYST_SDK/lib -lmipi_syst + + +SyS-T "hello world" Style Application +=========================================================================== +This example is stored in the examples/hello directory of the SyS-T +distribution. + +Example source code: + +\code{.c} +#include "mipi_syst.h" /* SyS-T definitions */ + + +/* Define origin used by this example as the message client ID + */ +static const struct mipi_syst_origin origin = +MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + +int main(int argc, char* argv[]) +{ + struct mipi_syst_handle* systh; + + /* Initialize a SyS-T output handle structure + */ + systh = MIPI_SYST_ALLOC_HANDLE( &origin ); + + /* Send a string message with payload "Hello World!" + */ + MIPI_SYST_DEBUG(systh, MIPI_SYST_SEVERITY_INFO, "Hello world!" , /*length*/ 12); + + /* Release any resources associated with this SyS-T handle. + */ + MIPI_SYST_DELETE_HANDLE(systh); + + return 0; +} +\endcode + +The example will produce output like that below if the ``example`` platform is used. +It shows which MIPI STP protocol packets are created to transport the +SYS-T message data. + +``` +STP Protocol Output: + 0 01800242 // SyS-T header + 1 704caea243544e49 // GUID part #1 + 2 35ea9c9ea7d1b5ab // GUID part #2 + 3 6f77206f6c6c6548 // Payload part #1 + 4 21646c72 // Payload part #2 + 5 // end of record +SYS-T RAW DATA: 42108001494E5443A2AE4C70ABB5D1A79E9CEA3548656C6C6F20776F726C6421 +``` diff --git a/library/doxygen/License.md b/library/doxygen/License.md new file mode 100644 index 0000000..4856f60 --- /dev/null +++ b/library/doxygen/License.md @@ -0,0 +1,34 @@ +SyS-T Source Code License {#mipi_syst_license_page} +========================================================================= + + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/library/doxygen/Printer.md b/library/doxygen/Printer.md new file mode 100644 index 0000000..647ca7f --- /dev/null +++ b/library/doxygen/Printer.md @@ -0,0 +1,103 @@ +\page mipi_syst_printer_page Instrumentation API Examples + +[TOC] + +SyS-T Protocol Printer {#mipi_syst_printer} +============================================================================== +The project includes a SyS-T data protocol pretty printer tool +in the printer subdirectory. The printer is a standalone application +written in C++11. It supports reading the output from instrumented +applications using the example platform from the SyS-T +instrumentation library. +The tool scans the output for lines starting with ``SYS-T RAW DATA:`` and +converts the hex dumps into binary data for decoding. The printer can +be easily adapted to real trace data transports by replacing the code +in ``printer/src/mipi_syst_main.cpp`` with an appropriate data reader. + +Building the Printer +------------------------------------------------------------------------------ +The following transcript shows how to build the printer on a Linux console. +The printer is a standalone application and independent from the +instrumentation library or example projects. + +``` +$ cmake ../../sys-t/printer +-- The C compiler identification is GNU 5.4.0 +-- The CXX compiler identification is GNU 5.4.0 +-- Check for working C compiler: /usr/bin/cc +-- Check for working C compiler: /usr/bin/cc -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Detecting C compile features +-- Detecting C compile features - done +-- Check for working CXX compiler: /usr/bin/c++ +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Detecting CXX compile features +-- Detecting CXX compile features - done +-- Configuring done +-- Generating done +-- Build files have been written to: /users/mipi/prj/syst_build/printer + +$ make +Scanning dependencies of target systprint +[ 14%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_main.cpp.o +[ 28%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_collateral.cpp.o +[ 42%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_printf.cpp.o +[ 57%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_decode.cpp.o +[ 71%] Building CXX object CMakeFiles/systprint.dir/src/mipi_syst_message.cpp.o +[100%] Linking CXX executable systprint +[100%] Built target systprint +``` + +Testing the Printer +------------------------------------------------------------------------------ +The printer project comes with a self test feature. The ``printer/test`` +directory contains reference input and output files collected using the +``example/client`` example application. To run the printer test use the +following command (or the cmake test driver command ``ctest``) in the +printer build directory: + +``` +$ make test +Running tests... +Test project /users/mipi/prj/syst_build/printer + Start 1: print_client_example +1/3 Test #1: print_client_example ............... Passed 0.01 sec + Start 2: diff_output_with_32bit_reference +2/3 Test #2: diff_output_with_32bit_reference ... Passed 0.04 sec + Start 3: diff_output_with_64bit_reference +3/3 Test #3: diff_output_with_64bit_reference ... Passed 0.03 sec + +100% tests passed, 0 tests failed out of 3 + +Total Test time (real) = 0.11 sec +``` + +To actually see the printer output, run the printer directly using command +line arguments, or indirectly through the test driver in verbose mode +(```ctest --verbose```). The following transcript shows how to call the +printer directly: + +``` +$systprint --short_guid {494E5443-8A9C-4014-A65A-2F36A36D96E4} --collateral ../../sys-t/printer/test/collateral.xml ../../sys-t/printer/test/input_client64.txt + +Decode Status,Payload,Type,Severity,Origin,Unit,Message TimeStamp,Context TimeStamp,Location,Raw Length,Checksum,Collateral +OK,"0x0000000000010000 version banner string",BUILD:LONG,MAX,example,1,0x00054A4B376A70E9,0x0000000000000000,,62,0x4DDEF5B9,../../sys-t/printer/test/collateral.xml +OK,"SyS-T Library version 1.0.0",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000001,./systclient.c:64,48,0x7A34B527,../../sys-t/printer/test/collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000002,./othersource.c:40,36,0x7CBB44B6,../../sys-t/printer/test/collateral.xml +OK,"| ____ _____ _______ |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000003,./othersource.c:41,36,0x2761EBF4,../../sys-t/printer/test/collateral.xml +OK,"| / ___| / ____| |__ __| |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000004,./othersource.c:42,36,0x55C63EAB,../../sys-t/printer/test/collateral.xml +OK,"| | |___ __ _| |___ _____| | |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000005,./othersource.c:43,36,0xE3885FB4,../../sys-t/printer/test/collateral.xml +OK,"| \___ \| | | |\___ \_____| | |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000006,./othersource.c:44,36,0x4C13A7F5,../../sys-t/printer/test/collateral.xml +OK,"| ____| | |_| |____| | | | |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000007,./othersource.c:45,36,0xE2C8BDC2,../../sys-t/printer/test/collateral.xml +OK,"| |_____/ \__| |_____/ |_| |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000008,./othersource.c:46,36,0xD0734297,../../sys-t/printer/test/collateral.xml +OK,"| _/ / |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x0000000000000009,./othersource.c:47,36,0x6D704426,../../sys-t/printer/test/collateral.xml +OK,"| |__/ |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x000000000000000A,./othersource.c:48,36,0x0A8FD609,../../sys-t/printer/test/collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x000000000000000B,./othersource.c:49,36,0x1E99CD8F,../../sys-t/printer/test/collateral.xml +OK,"| catalog Format | Printed Result |",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A70E9,0x000000000000000C,./othersource.c:231,36,0xA17B5C1C,../../sys-t/printer/test/collateral.xml +OK,"|---------------------------------strings---------------|",CATALOG:ID32P64,INFO,example,1,0x00054A4B376A74D1,0x000000000000000D,./othersource.c:232,36,0x11A215E6,../../sys-t/printer/test +(...) +$ +``` \ No newline at end of file diff --git a/library/doxygen/Protocol.md b/library/doxygen/Protocol.md new file mode 100644 index 0000000..498e9e9 --- /dev/null +++ b/library/doxygen/Protocol.md @@ -0,0 +1,318 @@ +\page mipi_syst_decoder_protocol SyS-T Data Protocol + +[TOC] + +Overview {#syst_decoder_prot_overview} +============================================================================== +The SyS-T Data Protocol is a byte sequence that represents a list of variable +length SyS-T Messages without additional padding bytes between them. The +SyS-T Data Protocol is intended for transmission over a lower level transport +protocol. The lower level protocol is expected to provide indicators that +identify the start and end of a SyS-T Message. One example of a lower level +transport protocol is the +[MIPI System Trace Protocol](http://mipi.org/specifications/debug#STP) (STP). +SyS-T includes message frame definitions that provides time stamping +and framing of a SyS-T Message based on STP packet types. The usage of +other lower level transports protocols is possible by adapting the message +writer or low level trace output functions from the platform level code. + +The SyS-T Data Protocol includes various optional fields for ensuring data +integrity or time stamping. Depending on the capabilities of the lower level +protocol, these SyS-T Message fields may be redundant and so be omitted to +save trace bandwidth. + + +Data Field Byte Ordering {#syst_decoder_prot_byteorder} +------------------------------------------------------------------------------ +All numeric data fields of the SyS-T Data Protocol follow little-endian byte +ordering where less significant bytes precede more significant ones. Only the +optional 128-bit Guid field is an exception to this rule. Its byte odering +follows RFC 4122 which defines Guid fields following big-endian ordering. + +MIPI STPv2 Protocol Encoding {#syst_decoder_prot_format} +------------------------------------------------------------------------------ +In order to timestamp packets and to give an indication of a valid SyS-T +Message beginning and end, each SyS-T Message starts with a +TIMESTAMPED STP data packet and ends with either a FLAG packet or a +MARKED data packet. +For environments that can only afford light weight value style traces, a +short message encoding is also available. This encoding uses a single IO to +generate an STP packet that is both MARKED and TIMESTAMPED. The following +table shows the supported STP packet sequences for a SyS-T Message. Dn means +either a D8, D16, D32 or D64 data packet. +The Dn* stands for a sequence of 0-x repeated Dn packets (of any sizes). Dn +packets with a smaller payload size can be combined into a Dn with a larger +size to reduce the number of IO's. For example, two D16 IO's can be combined +into a single D32 as long as the resulting binary payload data produces the +same result when being copied into memory. + + MIPI STPv2 Sequences | Description +---------------------------|-------------------------------------------- +DnMTS |Single IO short message with Dn sized payload. This message is intended for numeric value only tracing. +DnTS-Dn*-DnM |Arbitrary length sequence starting with a time stamped data value and followed by a sequence of zero or more payload data values. The last data value is MARKED to indicate the end of the sequence. +DnTS-Dn*-FLAG |Arbitrary length sequence starting with time stamped data value and followed by a sequence of zero or more payload data values. The sequence is terminated with a FLAG packet. + +The reason for supporting sequences terminated with either a MARKED or a +FLAG packet is to simplify the implementation for SW and HW trace generators. +HW based generates may prefer the MARKED method to save additional logic for +issuing a FLAG. SW trace generators may prefer the FLAG variant as it +avoids special handling for the last Dn. + + + +Message Anatomy {#syst_decoder_prot_anatomy} +------------------------------------------------------------------------------ +A SyS-T Message is a byte sequence that starts with a 32-bit header, followed by +mandatory and optional data attributes. The following picture shows the layout +of a SyS-T Message with all fields present. + +![SyS-T Message Anatomy](mipi_sys_t_message_anatomy.png) + + +The message fields are: + - A 32-bit [header] (#syst_decoder_prot_header) describing the message type and content + - An optional 128-bit wide [GUID] (#syst_decoder_prot_guid) identifying the message originating software module. + - An optional [location record] (#syst_decoder_prot_location) + - An optional [payload length] (#syst_decoder_prot_length) + - An optional [SyS-T timestamp] (#syst_prot_timestamp) + - API specific [payload data] (#syst_decoder_prot_payload) from zero up to 64 Kbytes. + - An optional CRC-32C [checksum] (#syst_decoder_prot_checksum) + +Attributes are stored one after the other without any additional alignment bytes. + +SyS-T Protocol Overhead {#syst_decoder_prot_overhead} +------------------------------------------------------------------------------ +The typical data overhead of the SyS-T Data Protocol is 4 bytes (32 bits) per +message unless optional elements like CRC32 checksums are enabled. +These 4 bytes come from the 32-bit message header at the beginning +of each message. + +In addition to the typical usage as a message trace, SyS-T protocol offers also +the following protocol types for small value or bulk data transfer support: + + - Single value onle traces can utilize SHORT messages. These provide a + zero data overhead method on STP hardware using single DnMTS + packets to hold the data. + - SyS-T raw messages can be used to stream up to 64 Kbytes of payload data + in a single SyS-T Message to tunnel another Data Protocol through SyS-T. + + +Data Protocol Details {#syst_decoder_prot_details} +============================================================================== + +Header {#syst_decoder_prot_header} +------------------------------------------------------------------------------ +A SyS-T header is 32-bit value using the following layout: + +![SyS-T Message header](mipi_sys_t_event_header.png) + +The meaning of the individual fields is explained in the table below. + +Field |Bits |Description +--------|------|----------------------------------------------------- +RES31 |31..31|Reserved, Must be set to zero. +RES30 |30..30|Reserved, Must be set to zero. +SUBTYPE |24..29|Additional message type information that depends on TYPE. +GUID |23..23|Indicates whether the optional GUID is present +ORIGIN |12..22|message origin and/or unit information +TS |11..11|Indicates whether the optional message time stamp is present. +CHK |10..10|Indicates whether the optional Checksum is present at the end. +LEN |9..9 |Indicates whether the optional Payload length is present. +LOC |8..8 |Indicates whether the optional Location Record field is present. +RES7 |7..7 |Reserved, Must be set to zero. +SEVERITY|4..6 |Severity level of the message. +TYPE |0..3 |Message type + +C-Definition (struct mipi_syst_msg_tag): +\code{.cpp} +struct mipi_syst_msg_tag { + mipi_syst_u32 et_type:4; /**< SyS-T message type ID */ + mipi_syst_u32 et_severity:3; /**< severity level of message */ + mipi_syst_u32 et_res7:1; /**< reserved for future use */ + mipi_syst_u32 et_location:1; /**< indicate location information */ + mipi_syst_u32 et_length:1; /**< indicate variable length message */ + mipi_syst_u32 et_chksum:1; /**< indicate 32bit CRC */ + mipi_syst_u32 et_timestamp:1;/**< indicate 64 bit timestamp */ + mipi_syst_u32 et_modunit:11; /**< unit for GUID or module:unit */ + mipi_syst_u32 et_guid:1; /**< 128 bit GUID present */ + mipi_syst_u32 et_subtype:6; /**< type dependent sub category */ + mipi_syst_u32 et_res30:1; /**< reserved for future use */ + mipi_syst_u32 et_res31:1; /**< reserved for future use */ +}; +\endcode + +Severity {#syst_decoder_prot_header_severity} +------------------------------------------------------------------------------ + +An optional severity level is assigned to a SyS-T Message to distinguish +informational messages from warnings and errors. Severity levels are used +for message classification and filtering. The severity levels are ordered +by ascending numerical values. + +Severity |Value | Description +---------------------------|:-----:|---------------------------------------------- +MIPI_SYST_SEVERITY_MAX | 0 |No assigned severity. This is used for messages that should bypass filtering. This is typically used with RAW message that tunnel other protocols over SyS-T Messages. +MIPI_SYST_SEVERITY_FATAL | 1 |Indicates a fatal level message. Such messages provide information about a failure condition from which the system cannot recover or cannot continue to function properly. +MIPI_SYST_SEVERITY_ERROR | 2 |Indicates an error level message. Such messages provide information about an operation failure or inappropriate action that the system is not designed to handle. Errors may or may not cause a feature or system to subsequently fail. +MIPI_SYST_SEVERITY_WARNING | 3 |Indicates a warning level message. Such messages provide information about an undesirable, but recoverable situation that may result in problems if no actions are taken. Warning message information can be utilized to adaptively adjust system operations to avoid failures or to improve performance based on the use case. +MIPI_SYST_SEVERITY_INFO | 4 |Indicates an information level message. Such messages provide component specific information about operational actions and progress. They are intended for component specialists to analyze system behavior. +MIPI_SYST_SEVERITY_USER1 | 5 |Indicates a first user-defined message level for information with a higher verbosity than MIPI_SYST_SEVERITY_INFO. They are intended for component specialists to analyze system behavior in greater detail. +MIPI_SYST_SEVERITY_USER2 | 6 |Indicates a second user-defined level for informational messages with a higher verbosity than MIPI_SYST_SEVERITY_USER1. They are intended for component specialists to analyze system behavior in even greater detail. +MIPI_SYST_SEVERITY_DEBUG | 7 |Indicate a debug level message. Such messages provide information that is intended for system developers for detailed analysis and debug of system behavior. It provides the finest granularity of trace information and is typically used during verification and debug phases. + + +Message Origin or GUID {#syst_decoder_prot_guid} +------------------------------------------------------------------------------ +A SyS-T Message may contain a 128-bit wide GUID to identify the instrumented +software module in a unique way. A GUID is used if the guid bit in the header +is set. Otherwise the header origin field defines the message origin, +saving the bandwidth and space that would be used for the additional GUID bits. + +Omitting the GUID is possible when the origin field or transport layer +information sufficiently identifies the trace emitting source. An example +for transport layer information are the Master and Channel pairs for transports +using MIPI System Trace Protocol. If the message was sent from a dynamically +assigned master and channel pool, then these values are not sufficient and a +GUID must be used to describe the origin. If the handle got initialized using +the #MIPI_SYST_SET_HANDLE_GUID_UNIT API then the GUID is emitted directly after +the header in each message. +Note: +The GUID structure follows https://www.ietf.org/rfc/rfc4122.txt. + +Location {#syst_decoder_prot_location} +------------------------------------------------------------------------------ + +A SyS-T Message can contain location information describing the position of +its instrumentation call either as an instruction pointer address or as a +"file:line" ID pair. This location information is generated if one of the +API variants with the `_LOCADDR`, `_LOC16` or `_LOC32` suffix in the name is +used. + +### C Definition of Location ### + +\code{.cpp} +/** + * Specify format of used message location information that is added to the + * message data if tag.et_location == 1 + */ +struct mipi_syst_msglocation { + /** Message format + * 0 = 16-Bit file and 16-Bit line (total: 32-bit) + * 1 = 32-Bit file and 32-Bit line (total: 64-bit) + * 2 = 32-bit code address + * 3 = 64-bit code address + */ + mipi_syst_u8 el_format; + union { + union mipi_syst_msglocation32 loc32; /**< data for 32-bit variant */ + union mipi_syst_msglocation64 loc64; /**< data for 64-bit variant */ + } el_u; +}; + + +/** + * Location information inside a message (32-bit format) + * Location is either the source position of the instrumentation call, or + * the call instruction pointer value. + */ +union mipi_syst_msglocation32 { + struct { + mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ + mipi_syst_u16 etls_lineNo; /**< line number in file */ + } etls_source_location; + mipi_syst_u32 etls_code_location:32; + /**< instruction pointer value */ +}; + +/** + * Location information inside a message (64-bit format) + * Location is either the source position of the instrumentation call, or + * the call instruction pointer value. + */ +union mipi_syst_msglocation64 { + struct { + mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ + mipi_syst_u32 etls_lineNo; /**< line number in file */ + } etls_source_location; + mipi_syst_u64 etls_code_location:64; + /**< instruction pointer value */ +}; + +\endcode + +Length {#syst_decoder_prot_length} +------------------------------------------------------------------------------ + +The location information is followed by a 16-bit length field if the header bit +et_length is set. This length indicates the number of message payload bytes that +follow. + +### C Definition of Length ### + +\code{.cpp} + syst_u16_t ed_len; +\endcode + + +Message Payload {#syst_decoder_prot_payload} +------------------------------------------------------------------------------ +A SyS-T Message can contain a type specific payload of up to 64 Kbytes. The payload +appears after the optional message fields, but before the optional checksum. + +Checksum {#syst_decoder_prot_checksum} +------------------------------------------------------------------------------ +A SyS-T Message can end with a 32-bit CRC-32C checksum calculated over all of +the message bytes, excluding the checksum value itself. The CRC generation is +a per SyS-T handle choice. It is enabled or disabled by the +#MIPI_SYST_ENABLE_HANDLE_CHECKSUM API. The default is disabled. + +Protocol Timestamp Handling {#syst_prot_timestamp} +============================================================================== +The default usage for the SyS-T protocol is to rely on a transport timestamp +generated by, for example, trace arbiter hardware or a trace creating driver. +In this case, a SyS-T Message does not carry its own timestamp information. In +scenarios where no hardware time stamp exists, or this timestamp is not +accurate, SyS-T Messages can include their own time stamp. An example scenario +for this is when messages are buffered by a trace source before they are sent. +In this case, the hardware time stamp will reflect a later message submission +time, not the message creation time, which is typically what is desired. + +Clock Synchronization {#syst_prot_timestamp_sync} +------------------------------------------------------------------------------ +The SyS-T protocol facilitates correlating messages that use a time stamp of +their own with the trace timestamp of the underlying transport protocol. This +correlation is done using a synchronisation message, which contains both the +transport protocol timestamp and the source clock value and frequency from +the SyS-T message clock. + +These data values build a time correlation point between the transport +clock and the SyS-T message clock. If MIPI STP is the transport protocol then +the D32TS header time stamp will define the transport time stamp. The message +is expected to be sent periodically from any source that requires time +synchronisation with the transport protocol. Host side tooling needs at least +one of these records in a trace stream to do the time correlation. Typically +these synchronization messages are sent either periodically, such as once +every second, or at the beginning of trace emitting phases. + + +SyS-T Messages Types {#syst_decoder_prot_msg_types} +============================================================================== +This chapter shows the major SyS-T message types. +The type can be one of the following (See [C Definition] (@ref mipi_syst_msgtype) ): + + + +Value |SyS-T Name |Description +--------|-------------------------|------------------------------------- +0 |MIPI_SYST_TYPE_BUILD |SyS-T client build version information +1 |MIPI_SYST_TYPE_SHORT32 |32 Bit message with user defined payload value +2 |MIPI_SYST_TYPE_STRING |Text message output for UTF-8 encoded strings +3 |MIPI_SYST_TYPE_CATALOG |Catalog message output support formatting string with parameters +4,5 |RESERVED-FOR-FUTURE-USE |Reserved +6 |MIPI_SYST_TYPE_RAW |Raw binary payload +7 |MIPI_SYST_TYPE_SHORT64 |64 Bit message with user defined payload value +8 |MIPI_SYST_TYPE_CLOCK |Timing synchronization +9..15 |RESERVED-FOR-FUTURE-USE |Reserved + +For further information on the different message type contents, read chapter 8 +in the MIPI Alliance Specification for System Software-Trace (SyS-T). diff --git a/library/doxygen/Reference.md b/library/doxygen/Reference.md new file mode 100644 index 0000000..f6d02e1 --- /dev/null +++ b/library/doxygen/Reference.md @@ -0,0 +1,347 @@ +API Quick-Reference {#mipi_syst_api_page} +====================================== +This page provides a quick reference for the SyS-T API macros. A +detailed description of these APIs and their their parameter +definitions is available by clicking on the individual API names. + +## State lifetime handling macros ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
API DefineDescription
+ MIPI_SYST_INIT(f,p) + SyS-T global platform initialization using an internal shared state header +
+ MIPI_SYST_INIT_STATE(s, f,p) + SyS-T platform initialization using a provided state header structure +
+ MIPI_SYST_SHUTDOWN() + SyS-T global platform shutdown +
+ MIPI_SYST_SHUTDOWN_STATE(s) + SyS-T platform shutdown using a provided state header structure +
+ MIPI_SYST_INIT_HANDLE(h,p) + Initialize a static (not heap allocated) SyS-T handle. +
+ MIPI_SYST_INIT_HANDLE_STATE(s, h,p) + Initialize a static (not heap allocated) SyS-T handle using a provided state header structure. +
+ MIPI_SYST_ALLOC_HANDLE(p) + Initialize heap allocated SyS-T handle. +
+ MIPI_SYST_ALLOC_HANDLE_STATE(s, p) + Initialize heap allocated SyS-T handle using a provided state header structure. +
+ MIPI_SYST_DELETE_HANDLE(p) + Delete a SyS-T handle. +
+ MIPI_SYST_SET_HANDLE_ORIGIN(h, o) + Set the client origin for the given SyS-T handle based on a mipi_syst_origin structure. +
+ MIPI_SYST_SET_HANDLE_MODULE_UNIT(h,m,u) + Specify module and unit ID of the given SyS-T handle. +
+ MIPI_SYST_SET_HANDLE_GUID_UNIT(h, g, u) + Specify GUID and unit ID of the given SyS-T handle. +
+ MIPI_SYST_ENABLE_HANDLE_LENGTH(h, v) + Enable or disable length field generation over the given SyS-T handle. +
+ MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h,v) + Enable or disable checksum generation over the given SyS-T handle. +
+ MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h, v) + Enable or disable additional protocol times tamps over the + given SyS-T handle. +
+The availability of the macros #MIPI_SYST_ALLOC_HANDLE, #MIPI_SYST_SET_HANDLE_GUID_UNIT, +and #MIPI_SYST_ENABLE_HANDLE_CHECKSUM depend on +platform feature enable defines. Attempting to use an unsupported API will result +in a compile error. +
+ +## String emitting macros ## + + + + + + + + + + + + + + + + + + + + + + + + + +
API DefineDescription
+ MIPI_SYST_DEBUG(svh,sev,str,len)
+ MIPI_SYST_DEBUG_LOC16(svh,sev,file,str,len)
+ MIPI_SYST_DEBUG_LOC32(svh,sev,file,str,len)
+ MIPI_SYST_DEBUG_LOCADDR(svh,sev,str,len) +
Send A UTF-8 character string with given severity and length
+
+ \link MIPI_SYST_PRINTF MIPI_SYST_PRINTF(svh,sev,str, ...)\endlink
+ \link MIPI_SYST_PRINTF_LOC16 MIPI_SYST_PRINTF_LOC16(svh,sev,file,str, ...)\endlink
+ \link MIPI_SYST_PRINTF_LOC32 MIPI_SYST_PRINTF_LOC32(svh,sev,file,str, ...)\endlink
+ \link MIPI_SYST_PRINTF_LOCADDR MIPI_SYST_PRINTF_LOCADDR(svh,sev,str, ...)\endlink +
Send a C-language style *printf()* API format string and its + arguments. This API follows the calling convention of + printf() as defined by the C99 C-Language standard.
+ Notes: This API is enabled by the SyS-T platform + define @ref MIPI_SYST_PCFG_ENABLE_PRINTF_API that must be set in + addition to @ref MIPI_SYST_PCFG_ENABLE_STRING_API.
+ Enabling this API implies the availability of the C-Language + standard header files stdarg.h and stddef.h. These are needed + due to the variable argument support of the *printf()* calling + convention. +
+ MIPI_SYST_FUNC_ENTER(svh,sev)
+ MIPI_SYST_FUNC_ENTER_LOC16(svh,sev,file)
+ MIPI_SYST_FUNC_ENTER_LOC32(svh,sev,file)
+ MIPI_SYST_FUNC_ENTER_LOCADDR(svh,sev) +
Send function enter string message. The payload is the + UTF-8 name of the surrounding function. +
+ MIPI_SYST_FUNC_EXIT(svh,sev)
+ MIPI_SYST_FUNC_EXIT_LOC16(svh,sev,file)
+ MIPI_SYST_FUNC_EXIT_LOC32(svh,sev,file)
+ MIPI_SYST_FUNC_EXIT_LOCADDR(svh,sev) +
Send function exit string message. The payload is the + UTF-8 name of the surrounding function. +
+ MIPI_SYST_ASSERT(svh,sev,cond)
+ MIPI_SYST_ASSERT_LOC16(svh,sev,file,cond)
+ MIPI_SYST_ASSERT_LOC32(svh,sev,file,cond)
+ MIPI_SYST_ASSERT_LOCADDR(svh,sev,cond) +
Send [file]:[line] assertion notice string message if the passed + condition is false +
+The string emitting macros must be enabled by the SyS-T platform +define #MIPI_SYST_PCFG_ENABLE_STRING_API, otherwise they expand to nothing +inside the code. +
+## Catalog message macros ## + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
API DefineDescription
+ \link MIPI_SYST_CATALOG64(svh,sev,id, ...)\endlink
+
Send catalog message with variable number of parameters defined + by the format string that matches the 64-bit catalog ID.
+ MIPI_SYST_CATALOG64_0(svh,sev,id)
+ ...
+ MIPI_SYST_CATALOG64_6(svh, sev, id,p1,p2,p3,p4,p5,p6) +
Send catalog message with 0-6 parameters.The MIPI_SYST_CATALOG64* + defines build a family of macros that are used to send 64-bit wide + user defined catalog message IDs with up to six 32-bit wide + parameters into the trace stream.
+ MIPI_SYST_CATPRINTF64_0(svh, sev, id, fmt)
+ ...
+ MIPI_SYST_CATPRINTF64_6(svh, sev, id, fmt, p1,p2,p3,p4,p5,p6) +
Printf style wrapper for the catalog functions that support an + additional fmt string parameter. The functions directly map to + their matching catalog call by dropping the fmt parameter. + Their purpose is to use printf style instrumentation in source + code together with catalog messages. The format strings are not + part of the message but can be extracted from source code to + pretty print catalog messages during trace decode.
+ \link MIPI_SYST_CATALOG32(svh,sev,id, ...)\endlink
+
Send catalog message with variable number of parameters defined + by the format string that matches the 32-bit catalog ID.
+ MIPI_SYST_CATALOG32_0(svh, sev, id)
+ ...
+ MIPI_SYST_CATALOG32_6(svh, sev, id,p1,p2,p3,p4,p5,p6) +
Send catalog message with 0-6 parameters. The MIPI_SYST_CATALOG32* + defines build a family of macros that are used to send 32-bit wide + user defined catalog message IDs with up to six 32-bit wide + parameters into the trace stream.
+ MIPI_SYST_CATPRINTF32_0(svh, sev, id, fmt)
+ ...
+ MIPI_SYST_CATPRINTF32_6(svh, sev, id, fmt, p1,p2,p3,p4,p5,p6) +
Printf style wrapper for the catalog functions that support an + additional fmt string parameter. The functions directly map to + their matching catalog call by dropping the fmt parameter. Their purpose is + to use printf style instrumentation in source code together with + catalog messages. The format strings are not part of the message + but can be extracted from source code to pretty print catalog + messages during trace decode.
+ MIPI_SYST_HASH(fmt, offset)
+
The MIPI_SYST_HASH macro computes a 32-bit hash value for the fmt + string constant that is usable as a numeric CatalogID parameter. + The offset parameter is used to change the result in case of hash + value collisions with other strings. It is initially set to zero + and is only changed to a different value if a collision occurs. + It is used together with automated catalog ID generation + decribed here: \link mipi_syst_catgen_page\endlink.
+The catalog message macros must be enabled by the SyS-T platform +defines #MIPI_SYST_PCFG_ENABLE_CATID32_API or #MIPI_SYST_PCFG_ENABLE_CATID64_API, +otherwise they expand to nothing inside the code. + + +## Raw data message macros ## + + + + + + + + + + + + + + + + + +
API DefineDescription
+ MIPI_SYST_SHORT32(h, v) + Send short data message with 28-bit user defined payload. + This API is intended for space and cpu restricted environments + that cannot support more complex message types.
+ MIPI_SYST_SHORT64(h, v) + Send short data message with 60-bit user defined payload. + This API is intended for space and cpu restricted environments + that cannot support more complex message types.
+ MIPI_SYST_WRITE(h, sev, id, p, len) + Send raw data message with user defined payload.
+The #MIPI_SYST_WRITE API message macro must be enabled by the SyS-T platform +define #MIPI_SYST_PCFG_ENABLE_WRITE_API, otherwise it expands to nothing inside +the code. The #MIPI_SYST_SHORT32 and MIPI_SYST_SHORT64 APIs are always available. + +## Client software build ID message macros ## + + + + + + + + + + + + + + + + + +
API DefineDescription
+ MIPI_SYST_BUILD(h, sev, ver, text, len) + Send 64-bit client software build ID number and optional version text.
+ MIPI_SYST_BUILD_COMPACT32(h, v) + Send a 32-bit compact client software build ID message with 22-bit wide build number. +
+ MIPI_SYST_BUILD_COMPACT64(h, v) + Send a 64-bit compact client software build ID message value with a 54-bit wide build number. +
\ No newline at end of file diff --git a/library/doxygen/mainpage.md b/library/doxygen/mainpage.md new file mode 100644 index 0000000..d2a3501 --- /dev/null +++ b/library/doxygen/mainpage.md @@ -0,0 +1,57 @@ +MIPI SyS-T Instrumentation Library {#mipi_syst_mainpage} +============================================================================== + +About the SyS-T instrumentation library +============================================================================== +The MIPI System Software Trace (SyS-T) library is a customizable, low +overhead example implementation of the SyS-T API and data protocol described +here: +https://www.mipi.org/specifications/sys-t + +The library is written as a self-contained C-language module and does not +depend on other runtime library or system include files. The SyS-T library is +usable in very different software environments, including OS user mode code, OS +kernel mode code, or controller firmware. + +This library provides the SyS-T instrumentation API to other software +components. The SyS-T API calls generate the @ref mipi_syst_decoder_protocol +and typically write it to a trace aggregator for bundling the data with other +trace sources. The SyS-T API offers advanced trace capabilities, such as: + +* String formatting in C-language printf style +* Catalog messages to save data size and trace I/O bandwidth +* Tunnelling of other data protocols +* Hardware and Software provided message time stamping and synchronisation + +The following picture shows the library execution flow left to +right. The SyS-T API is a set of preprocessor macros that are calling library +functions for generating trace messages based on the API input parameters. +These parameters are encoded into an internal format and written out by +platform specific code to the systems trace transport layer. + +![SyS-T Library Environment](mipi_sys_t_library_flow.png) + + +Documentation for using SyS-T to instrument software +============================================================================== + - [Instrumentation API Overview](@ref mipi_syst_api_overview) + - [API Quick Reference](@ref mipi_syst_api_page) + - [API Sets](@ref ApiSets) + +Click here for a minimal "Hello World" style example of +a SyS-T instrumented application: @ref mipi_syst_example_page + + +Documentation for building and integrating SyS-T +============================================================================== +- [Building the SyS-T Library](@ref mipi_syst_building_page) +- [Adapting the SyS-T Library](@ref mipi_syst_adapting_page) +- [Automated Collateral Generation](@ref mipi_syst_catgen_page) +- [Decoding and printing the SyS-T data protocol] (@ref mipi_syst_printer_page) + + +SyS-T License +============================================================================== +The SyS-T library code is Copyright (c) MIPI Alliance, Inc. and distributed +under a permissive open source license. The detailed license information can +be found [here](@ref mipi_syst_license_page). diff --git a/library/doxygen/mipi_sys_t_event_header.png b/library/doxygen/mipi_sys_t_event_header.png new file mode 100644 index 0000000000000000000000000000000000000000..18135afc70d2b4ff7256200ec235ca4ec27b113d GIT binary patch literal 7210 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 literal 0 HcmV?d00001 diff --git a/library/doxygen/mipi_sys_t_library_flow.png b/library/doxygen/mipi_sys_t_library_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..e279768c47c9833853f5d63bf7fdc9d2df23b671 GIT binary patch literal 45058 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 literal 0 HcmV?d00001 diff --git a/library/doxygen/mipi_sys_t_library_flow.vsd b/library/doxygen/mipi_sys_t_library_flow.vsd new file mode 100644 index 0000000000000000000000000000000000000000..2241e809fad5d10dcdb049d1b30e49fe468e8a57 GIT binary patch literal 135168 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 Yy@U>yg;5Qrs}R{#J2 literal 0 HcmV?d00001 diff --git a/library/doxygen/mipi_sys_t_message_anatomy.png b/library/doxygen/mipi_sys_t_message_anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..e69736c3f293101706da7ec6199217ef3edfa0fd GIT binary patch literal 10801 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 bcW;O#yYb;e|0JNz6Qp%TN2Bzz^~3)FIxlT3 literal 0 HcmV?d00001 diff --git a/library/doxygen/mipi_sys_t_overview.png b/library/doxygen/mipi_sys_t_overview.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7a9bd8ec39e531552245e7bd08c0d48f7e962d GIT binary patch literal 58002 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 fw8?rqhZ)i=h7lwk5*6 literal 0 HcmV?d00001 diff --git a/library/include/mipi_syst.h.in b/library/include/mipi_syst.h.in new file mode 100644 index 0000000..e0856d5 --- /dev/null +++ b/library/include/mipi_syst.h.in @@ -0,0 +1,783 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_H_INCLUDED +#define MIPI_SYST_H_INCLUDED + +/* SyS-T API version information + */ +#define MIPI_SYST_VERSION_MAJOR @SYST_CFG_VERSION_MAJOR@ /**< Major version, incremented if API changes */ +#define MIPI_SYST_VERSION_MINOR @SYST_CFG_VERSION_MINOR@ /**< Minor version, incremented on compatible extensions */ +#define MIPI_SYST_VERSION_PATCH @SYST_CFG_VERSION_PATCH@ /**< Patch for existing major, minor, usually 0 */ + +/** Define SyS-T API conformance level + * + * 10 = minimal (only short events) + * 20 = low overhead (exluding varag functions and CRC32) + * 30 = full implementation + */ +#define MIPI_SYST_CONFORMANCE_LEVEL @SYST_CFG_CONFORMANCE_LEVEL@ + +/** Compute SYS-T version value + * + * Used to compare SYS-T Major.Minor.patch versions numerically at runtime. + * + * @param ma major version number + * @param mi minor version number + * @param p patch version number + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #if MIPI_SYST_VERSION_CODE >= MIPI_SYST_MAKE_VERSION_CODE(1,5,0) + * // do what only >= 1.5.x supports + * #endif + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_MAKE_VERSION_CODE(ma, mi, p) (((ma) << 16) | ((mi)<<8) | (p)) + +/** Numeric SYS-T version code */ +#define MIPI_SYST_VERSION_CODE MIPI_SYST_MAKE_VERSION_CODE(\ + MIPI_SYST_VERSION_MAJOR,\ + MIPI_SYST_VERSION_MINOR,\ + MIPI_SYST_VERSION_PATCH) + +/* Macros to trick numeric values like __LINE__ into a string + */ +#define _MIPI_SYST_STRINGIFY(x) #x +#define _MIPI_SYST_CPP_TOSTR(x) _MIPI_SYST_STRINGIFY(x) + +#define _MIPI_SYST_VERSION_STRING(a, b, c)\ + _MIPI_SYST_CPP_TOSTR(a)"."_MIPI_SYST_CPP_TOSTR(b)"."_MIPI_SYST_CPP_TOSTR(c) + +/** Textual version string */ +#define MIPI_SYST_VERSION_STRING \ + _MIPI_SYST_VERSION_STRING(\ + MIPI_SYST_VERSION_MAJOR,\ + MIPI_SYST_VERSION_MINOR,\ + MIPI_SYST_VERSION_PATCH) + +#ifndef MIPI_SYST_COMPILER_INCLUDED +#include "mipi_syst/compiler.h" +#endif + +/* String hash macros for compile time computation of catalog ID's. + * Notes: + * These macros will only be used with optimized builds, otherwise + * a lot of runtime code will be generated. + * + * Only the last 64 bytes of the string are considered for hashing + */ +#define _MIPI_SYST_HASH1(s,i,x,l) (x*65599u+(mipi_syst_u8)s[(i)<(l)?((l)-1-(i)):(l)]) +#define _MIPI_SYST_HASH4(s,i,x,l) _MIPI_SYST_HASH1(s,i,_MIPI_SYST_HASH1(s,i+1,_MIPI_SYST_HASH1(s,i+2,_MIPI_SYST_HASH1(s,i+3,x,l),l),l),l) +#define _MIPI_SYST_HASH16(s,i,x,l) _MIPI_SYST_HASH4(s,i,_MIPI_SYST_HASH4(s,i+4,_MIPI_SYST_HASH4(s,i+8,_MIPI_SYST_HASH4(s,i+12,x,l),l),l),l) +#define _MIPI_SYST_HASH64(s,i,x,l) _MIPI_SYST_HASH16(s,i,_MIPI_SYST_HASH16(s,i+16,_MIPI_SYST_HASH16(s,i+32,_MIPI_SYST_HASH16(s,i+48,x,l),l),l),l) + +#define _MIPI_SYST_HASH_x65599(s,l) ((mipi_syst_u32)_MIPI_SYST_HASH64(s,0,0,l)) + +#define _MIPI_SYST_HASH_AT_CPP_TIME(str, offset) (_MIPI_SYST_HASH_x65599(str, sizeof(str)-1) + (offset)) +#define _MIPI_SYST_HASH_AT_RUN_TIME(str, offset) (mipi_syst_hash_x65599(str, sizeof(str)-1) + (offset)) + +#if defined(_MIPI_SYST_OPTIMIZER_ON) +#define MIPI_SYST_HASH(a, b) _MIPI_SYST_HASH_AT_CPP_TIME((a), (b)) +#else +#define MIPI_SYST_HASH(a, b) _MIPI_SYST_HASH_AT_RUN_TIME((a),(b)) +#endif + +#if defined(__cplusplus) +extern "C" { +#endif + +/** Major Message Types + */ +enum mipi_syst_msgtype { + MIPI_SYST_TYPE_BUILD = 0, /**< client build id message */ + MIPI_SYST_TYPE_SHORT32 = 1, /**< value only message */ + MIPI_SYST_TYPE_STRING = 2, /**< text message output */ + MIPI_SYST_TYPE_CATALOG = 3, /**< catalog message output */ + MIPI_SYST_TYPE_RAW = 6, /**< raw binary data */ + MIPI_SYST_TYPE_SHORT64 = 7, /**< value only message */ + MIPI_SYST_TYPE_CLOCK = 8, /**< clock sync message */ + + MIPI_SYST_TYPE_MAX +}; + +/** MIPI_SYST_TYPE_DEBUG_STRING Sub-Types + */ +enum mipi_syst_subtype_string { + MIPI_SYST_STRING_GENERIC = 1, /**< string generic debug */ + MIPI_SYST_STRING_FUNCTIONENTER = 2, /**< string is function name */ + MIPI_SYST_STRING_FUNCTIONEXIT = 3, /**< string is function name */ + MIPI_SYST_STRING_INVALIDPARAM = 5, /**< invalid SyS-T APIcall */ + MIPI_SYST_STRING_ASSERT = 7, /**< Software Assert: failure */ + MIPI_SYST_STRING_PRINTF_32 = 11, /**< printf with 32-bit packing */ + MIPI_SYST_STRING_PRINTF_64 = 12, /**< printf with 64-bit packing */ + + MIPI_SYST_STRING_MAX +}; + +/** MIPI_SYST_TYPE_CATALOG Sub-Types + */ +enum mipi_syst_subtype_catalog { + MIPI_SYST_CATALOG_ID32_P32 = 1, /**< 32-bit catalog ID, 32-bit packing */ + MIPI_SYST_CATALOG_ID64_P32 = 2, /**< 64-bit catalog ID, 32-bit packing */ + MIPI_SYST_CATALOG_ID32_P64 = 5, /**< 32-bit catalog ID, 64-bit packing */ + MIPI_SYST_CATALOG_ID64_P64 = 6, /**< 64-bit catalog ID, 64-bit packing */ + + MIPI_SYST_CATALOG_MAX +}; + +/** MIPI_SYST_TYPE_CLOCK Sub-Types + */ +enum mipi_syst_subtype_clock{ + MIPI_SYST_CLOCK_TRANSPORT_SYNC = 1, /**< SyS-T clock & frequency sync */ + MIPI_SYST_CLOCK_MAX +}; + +enum mipi_syst_subtype_build { + MIPI_SYST_BUILD_ID_COMPACT32 = 0, /**< compact32 build id */ + MIPI_SYST_BUILD_ID_COMPACT64 = 1, /**< compact64 build id */ + MIPI_SYST_BUILD_ID_LONG = 2, /**< normal build message */ + MIPI_SYST_BUILD_MAX +}; + +struct mipi_syst_header; +struct mipi_syst_handle; +struct mipi_syst_scatter_prog; + +/** 128-bit GUID style message origin ID */ +struct mipi_syst_guid { + union { + mipi_syst_u8 b[16]; + mipi_syst_u64 ll[2]; + } u; +}; + +/** GUID initializer code + * + * This macro simplifies converting a GUID from its string representation + * into the mipi_syst_guid data structure. The following example shows + * how the values from a GUID string are used with the macro. Each numeric + * component from the GUID string gets converted into a hex value parameter + * when invoking the macro. + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * // Guid: f614b99d-99a1-4c04-8c30-90999ab5fe05 + * + * struct mipi_syst_guid guid = + * MIPI_SYST_GEN_GUID(0xf614b99d, 0x99a1, 0x4c04, 0x8c30, 0x90999ab5fe05); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GEN_GUID(l1, w1, w2, w3, l2) \ + {{\ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 24), \ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 16), \ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 8), \ + (mipi_syst_u8)((mipi_syst_u32)(l1) >> 0), \ + (mipi_syst_u8)((mipi_syst_u16)(w1) >> 8), \ + (mipi_syst_u8)((mipi_syst_u16)(w1) >> 0), \ + (mipi_syst_u8)((mipi_syst_u16)(w2) >> 8), \ + (mipi_syst_u8)((mipi_syst_u16)(w2) >> 0), \ + (mipi_syst_u8)((mipi_syst_u16)(w3) >> 8), \ + (mipi_syst_u8)((mipi_syst_u16)(w3) >> 0), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 40), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 32), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 24), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 16), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 8), \ + (mipi_syst_u8)((mipi_syst_u64)(l2) >> 0) \ + }} + + /** SyS-T client origin data + * + * This structure holds the GUID or header origin and unit data + * used by SyS-T handles. The structure gets passed into the handle + * creation functions to initialize the values that identify clients. + * @see MIPI_SYST_SET_HANDLE_GUID_UNIT + * @see MIPI_SYST_SET_HANDLE_MODULE_UNIT + * @see MIPI_SYST_SET_HANDLE_ORIGIN + */ +struct mipi_syst_origin { + struct mipi_syst_guid guid; /**< origin GUID or module value */ + mipi_syst_u16 unit; /**< unit value */ +}; + +/** Origin structure initializer code using GUID +* +* This macro simplifies initializing a mipi_syst_origin structure. The +* first 5 parameters are GUID values as used by the MIPI_SYST_GEN_GUID +* macro. The last parameter is the unit value (11-Bits). +* @see MIPI_SYST_GEN_GUID +* +* +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* // Guid: {494E5443-B659-45AF-B786-9DB0786248AE} + +* +* struct mipi_syst_origin = origin +* MIPI_SYST_GEN_ORIGIN_GUID( +* 0x494E5443, 0xB659, 0x45AF, 0xB786, 0x9DB0786248AE, +* 0x1); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_GEN_ORIGIN_GUID(l1, w1, w2, w3, l2 , u) \ + {\ + MIPI_SYST_GEN_GUID(l1, w1, w2, w3, l2) ,\ + u\ + } + +/** Origin structure initializer code using header module value +* +* This macro simplifies initializing a mipi_syst_origin structure. The +* first parameter is the header origin value (7-Bits). The second parameter +* is the unit value (4-bits) +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* // Guid: {494E5443-B659-45AF-B786-9DB0786248AE} + +* #define MODULE_X 0x10 +* struct mipi_syst_origin = +* MIPI_SYST_GEN_ORIGIN_MODULE(MODULE_X, 0x1); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_GEN_ORIGIN_MODULE(m , u) \ + {\ + MIPI_SYST_GEN_GUID(0,0,0, ((mipi_syst_u16)(m & 0x7F)) << 8, 0 ),\ + u\ + } +/** + * Global state initialization hook definition + * + * This function gets called in the context of the mipi_syst_init() API + * function after the generic state members of the global state + * structure syst_hdr have been setup. It's purpose is to initialize the + * platform dependent portion of the state and other necessary + * platform specific initialization steps. + * + * @param systh Pointer to global state structure + * @param p user defined value or pointer to data + * @see mipi_syst_header + */ +typedef void (MIPI_SYST_CALLCONV *mipi_syst_inithook_t)(struct mipi_syst_header *systh, + const void *p); + +/** + * Global state destroy hook definition + * + * This function gets called in the context of the mipi_syst_destroy() API + * function before the generic state members of the global state + * structure syst_hdr have been destroyed. Its purpose is to free resources + * used by the platform dependent portion of the global state. + * + * @param systh Pointer to global state structure + */ +typedef void (MIPI_SYST_CALLCONV *mipi_syst_destroyhook_t)(struct mipi_syst_header *systh); + +/** + * SyS-T handle state initialization hook definition + * + * This function gets called in the context of IO handle generation. + * Its purpose is to initialize the platform dependent portion of +* the handle and other necessary platform specific initialization steps. + * + * @param systh Pointer to new SyS-T handle + * @see syst_handle_t + */ +typedef void (*mipi_syst_inithandle_hook_t)(struct mipi_syst_handle *systh); + +/** + * SyS-T handle state release hook definition + * + * This function gets called when a handle is about to be destroyed.. + * Its purpose is to free any resources allocated during the handle + * generation. + * + * @param systh Pointer to handle that is destroyed + * @see syst_handle_t + */ +typedef void (*mipi_syst_releasehandle_hook_t)(struct mipi_syst_handle *systh); + +/** + * Low level message write routine definition + * + * This function is called at the end of an instrumentation API to output + * the raw message data. + * + * @param systh pointer to a SyS-T handle structure used in the API call, + * @param scatterprog pointer to a list of scatter write instructions that + * encodes how to convert the descriptor pointer by + * pdesc into raw binary data. This list doesn't include + * the mandatory first 32 tag byte value pointed by pdesc. + * @param pdesc pointer to a message descriptor, which containing at least + * the 32-bit message tag data + */ +typedef void (*mipi_syst_msg_write_t)( + struct mipi_syst_handle *systh, + struct mipi_syst_scatter_prog *scatterprog, + const void *pdesc); + +#ifdef __cplusplus +} /* extern C */ +#endif +#ifndef MIPI_SYST_PLATFORM_INCLUDED + +/** + * @defgroup PCFG_Config Platform Feature Configuration Defines + * + * Defines to customize the SyS-T feature set to match the platform needs. + * + * Each optional library feature can be disabled by not defining the related + * MIPI_SYST_PCFG_ENABLE define. Removing unused features in this way reduces + * both memory footprint and runtime overhead of SyS-T. + */ + +/** + * @defgroup PCFG_Global Platform Wide Configuration + * @ingroup PCFG_Config + * + * These defines enable global features in the SyS-T library. + * @{ + */ + + + /** + * Extend Platform global SyS-T data state + * + * This define extends the global SyS-T state data structure + * mipi_syst_header with platform private content. A platform typically + * stores data for SyS-T handle creation processing in this structure. + * + * Note: This data is not touched by the library code itself, but typically + * is used by platform hook functions for handle creation and destruction. + * **These hook function calls are not lock protected and may happen + * concurrently!** The hook functions need to implement locking if they + * modify the platform state data. + * + * The platform example uses #mipi_syst_platform_state as data state extension. + */ +#define MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA + +/** + * Extend SyS-T handle data state + * + * This define extends the SyS-T handle state data structure + * mipi_syst_handle with platform private content. A platform typically + * stores data for fast trace hardware access in the handle data, for + * example a volatile pointer to an MMIO space. + * + * The platform example uses #mipi_syst_platform_handle as handle state + * extension. + */ +#define MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA + +/** + * Enable HEAP usage for handle generation + * + * This macro tells the SyS-T library to enable the heap allocation handle + * creation API #MIPI_SYST_ALLOC_HANDLE. + * The platform must provide the macros #MIPI_SYST_HEAP_MALLOC and + * #MIPI_SYST_HEAP_FREE to point SyS-T to the platform malloc and free + * functions. + * + * Note: In OS kernel space environments, you must use unpaged memory + * allocation functions. + */ +#define MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY + +/* MSVC and GNU compiler 64-bit mode */ + +/** + * Enable 64-bit instruction addresses + * + * Set this define if running in 64-bit code address space. + */ +#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) +#define MIPI_SYST_PCFG_ENABLE_64BIT_ADDR +#endif +/** + * Enable atomic 64-bit write operations + * + * Set this define if your platform supports an atomic 64-bit data write + * operation. This results in fewer MMIO accesses.The SyS-T library + * defaults to 2 consecutive 32-Bit writes otherwise. + */ +#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) +#define MIPI_SYST_PCFG_ENABLE_64BIT_IO +#endif + +/** + * Enable helper function code inlining + * + * Set this define if speed is more important than code size on your platform. + * It causes several helper function to get inlined, producing faster, but + * also larger, code. + */ +#define MIPI_SYST_PCFG_ENABLE_INLINE + +/** @} */ + +/** + * @defgroup PCFG_ApiSet Supported API sets + * @ingroup PCFG_Config + * + * These defines enable API sets in the SyS-T library. They are set by default + * depending on the SyS-T API conformance level. The level is specified using + * the define #MIPI_SYST_CONFORMANCE_LEVEL. + * @{ + */ + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 + /** + * Use SyS-T scatter write output function + * + * The library comes with an output routine that is intended to write data out + * to an MMIO space. It simplifies a SyS-T platform integration as + * only low-level access macros must be provided for outputting data. These + * macros follow MIPI System Trace Protocol (STP) naming convention, also + * non STP generators can use this interface. + * + * These low level output macros are: + * + * #MIPI_SYST_OUTPUT_D32MTS, #MIPI_SYST_OUTPUT_D64MTS, + * #MIPI_SYST_OUTPUT_D32TS, #MIPI_SYST_OUTPUT_D64, + * #MIPI_SYST_OUTPUT_D32, #MIPI_SYST_OUTPUT_D16, #MIPI_SYST_OUTPUT_D8 and + * #MIPI_SYST_OUTPUT_FLAG + * + * Note: This version of the write function always starts messages + * using a 32-bit timestamped record also other sized timestamped + * packets are allowed by the SyS-T specification. + */ +#define MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE + +/** + * Enable the Catalog API for 32-Bit Catalog IDs. + */ +#define MIPI_SYST_PCFG_ENABLE_CATID32_API + +/** + * Enable the Catalog API for 64-Bit Catalog IDs. + */ +#define MIPI_SYST_PCFG_ENABLE_CATID64_API + +/** + * Enable plain UTF-8 string output APIs. + */ +#define MIPI_SYST_PCFG_ENABLE_STRING_API + +/** + * Enable raw data output APIs + */ +#define MIPI_SYST_PCFG_ENABLE_WRITE_API + +/** + * Enable Build API + */ +#define MIPI_SYST_PCFG_ENABLE_BUILD_API +#endif /* MIPI_SYST_CONFORMANCE_LEVEL > 10 */ + +#if MIPI_SYST_CONFORMANCE_LEVEL > 20 + /** + * Enable printf API support + * + * Note: + * Enabling printf requires compiler var_arg support as defined by the + * header files stdarg.h stddef.h. + */ + +#define MIPI_SYST_PCFG_ENABLE_PRINTF_API + +/** + * Maximum size of printf payload in bytes. + * Adjust this value if larger strings shall be supported by the library. + * The buffer space is located in stack memory when calling one of the printf + * style APIs. + */ +#define MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE 1024 + +#endif /* #if MIPI_SYST_CONFORMANCE_LEVEL > 20 */ + +/* @} */ + +/** + * @defgroup PCFG_Message Optional Message Attributes + * @ingroup PCFG_Config + * + * These defines enable optional message components. They are set by default + * depending on the SyS-T API conformance level. The level is specified using + * the define #MIPI_SYST_CONFORMANCE_LEVEL. + * @{ + */ + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 +/** + * Enable 128-bit origin GUID support. + */ +#define MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID + +/** + * Enable the API variants that send file:line ID pair location records. + */ +#define MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + +/** + * Enable the API variants that send the address of the instrumentation location. + * + * This API requires #MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD to be set as well. + * It uses its own define as it additionally requires the function + * @ref mipi_syst_return_addr() to be implemented for your platform. + */ +#define MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + +/** + * Enable protocol timestamp. + * + * This option adds a timestamp into the SyS-T protocol. This + * option is used if the SyS-T protocol is not embedded into a hardware + * timestamped trace protocol like MIPI STP or if the HW timestamp cannot + * be used for other reasons. Setting this option creates the need to define + * the macros #MIPI_SYST_PLATFORM_CLOCK and #MIPI_SYST_PLATFORM_FREQ to + * return a 64-bit clock tick value and its frequency. + */ +#define MIPI_SYST_PCFG_ENABLE_TIMESTAMP + +#if defined(_DOXYGEN_) /* only for doxygen, remove the #if to enable */ + /** + * Enable generation of length field + * + * Set this define if the message data shall include the optional length + * field that indicates how many payload bytes follow. + */ +#define MIPI_SYST_PCFG_LENGTH_FIELD +#endif + +#endif + +#if MIPI_SYST_CONFORMANCE_LEVEL > 20 +/** + * Enable message data CRC32 generation. + */ +#define MIPI_SYST_PCFG_ENABLE_CHECKSUM + +#endif /* #if MIPI_SYST_CONFORMANCE_LEVEL */ + +/** @} */ + +#include "mipi_syst/platform.h" +#endif +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_INLINE) +#define MIPI_SYST_INLINE static MIPI_SYST_CC_INLINE +#else +#define MIPI_SYST_INLINE MIPI_SYST_EXPORT +#endif + +/** SyS-T global state structure. + * This structure is holding the global SyS-T library state + */ +struct mipi_syst_header { + mipi_syst_u32 systh_version; /**< SyS-T version ID */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + mipi_syst_inithandle_hook_t systh_inith; /**< handle init hook function*/ + mipi_syst_releasehandle_hook_t systh_releaseh; /**< handle release hook */ +#endif + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 + mipi_syst_msg_write_t systh_writer; /**< message output routine */ +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) + struct mipi_syst_platform_state systh_platform; + /**< platform specific state */ +#endif +}; + +/** + * Message data header tag definition + * + * Each SyS-T message starts with a 32-bit message tag. The tag defines the + * message originator and decoding information for the data following + * the tag. + */ + +struct mipi_syst_msg_tag { +#if defined(MIPI_SYST_BIG_ENDIAN) + mipi_syst_u32 et_res31 : 1; /**< reserved for future use */ + mipi_syst_u32 et_res30 : 1; /**< reserved for future use */ + mipi_syst_u32 et_subtype : 6; /**< type dependent sub category */ + mipi_syst_u32 et_guid : 1; /**< 128-bit GUID present */ + mipi_syst_u32 et_modunit : 11; /**< unit for GUID or module:unit */ + mipi_syst_u32 et_timestamp : 1;/**< indicate 64-bit timestamp */ + mipi_syst_u32 et_chksum : 1; /**< indicate 32-bit CRC */ + mipi_syst_u32 et_length : 1; /**< indicate length field */ + mipi_syst_u32 et_location : 1; /**< indicate location information */ + mipi_syst_u32 et_res7 : 1; /**< reserved for future use */ + mipi_syst_u32 et_severity : 3; /**< severity level of message */ + mipi_syst_u32 et_type : 4; /**< SyS-T message type ID */ +#else + mipi_syst_u32 et_type : 4; /**< SyS-T message type ID */ + mipi_syst_u32 et_severity : 3; /**< severity level of message */ + mipi_syst_u32 et_res7 : 1; /**< reserved for future use */ + mipi_syst_u32 et_location : 1; /**< indicate location information */ + mipi_syst_u32 et_length : 1; /**< indicate length field */ + mipi_syst_u32 et_chksum : 1; /**< indicate 32-bit CRC */ + mipi_syst_u32 et_timestamp : 1;/**< indicate 64-bit timestamp */ + mipi_syst_u32 et_modunit : 11; /**< unit for GUID or module:unit */ + mipi_syst_u32 et_guid : 1; /**< 128-bit GUID present */ + mipi_syst_u32 et_subtype : 6; /**< type dependent sub category */ + mipi_syst_u32 et_res30 : 1; /**< reserved for future use */ + mipi_syst_u32 et_res31 : 1; /**< reserved for future use */ +#endif +}; +#define _MIPI_SYST_MK_MODUNIT_ORIGIN(m,u) (((u) & 0xF)|(m<<4)) + +/** + * Message severity level enumeration + */ +enum mipi_syst_severity { + MIPI_SYST_SEVERITY_MAX = 0, /**< no assigned severity */ + MIPI_SYST_SEVERITY_FATAL = 1, /**< critical error level */ + MIPI_SYST_SEVERITY_ERROR = 2, /**< error message level */ + MIPI_SYST_SEVERITY_WARNING = 3,/**< warning message level */ + MIPI_SYST_SEVERITY_INFO = 4, /**< information message level */ + MIPI_SYST_SEVERITY_USER1 = 5, /**< user defined level 5 */ + MIPI_SYST_SEVERITY_USER2 = 6, /**< user defined level 6 */ + MIPI_SYST_SEVERITY_DEBUG = 7 /**< debug information level */ +}; + +/** + * Location information inside a message (64-bit format) + * Location is either the source position of the instrumentation call, or + * the call instruction pointer value. + */ +union mipi_syst_msglocation32 { + struct { +#if defined(MIPI_SYST_BIG_ENDIAN) + mipi_syst_u16 etls_lineNo; /**< line number in file */ + mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ +#else + mipi_syst_u16 etls_fileID; /**< ID of instrumented file */ + mipi_syst_u16 etls_lineNo; /**< line number in file */ +#endif + } etls_source_location; + + mipi_syst_u32 etls_code_location:32; /**< instruction pointer value */ +}; + +/** + * Location information inside a message (32-bit format) + * Location is either the source position of the instrumentation call, or + * the call instruction pointer value. + */ +union mipi_syst_msglocation64 { + struct { +#if defined(MIPI_SYST_BIG_ENDIAN) + mipi_syst_u32 etls_lineNo; /**< line number in file */ + mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ +#else + mipi_syst_u32 etls_fileID; /**< ID of instrumented file */ + mipi_syst_u32 etls_lineNo; /**< line number in file */ +#endif + } etls_source_location; + mipi_syst_u64 etls_code_location; /**< instruction pointer value */ +}; + +/** + * Location information record descriptor + */ +struct mipi_syst_msglocation { + /** Message format + * 0 = 16-Bit file and 16-Bit line (total: 32-bit) + * 1 = 32-Bit file and 32-Bit line (total: 64-bit) + * 2 = 32-bit code address + * 3 = 64-bit code address + */ + mipi_syst_u8 el_format; + union { + union mipi_syst_msglocation32 loc32; /**< data for 32-bit variant */ + union mipi_syst_msglocation64 loc64; /**< data for 64-bit variant */ + } el_u; +}; + +/** internal handle state flags + */ +struct mipi_syst_handle_flags { + mipi_syst_u32 shf_alloc:1; /**< set to 1 if heap allocated handle */ +}; + +/** SyS-T connection handle state structure + * + * This structure connects the instrumentation API with the underlying SyS-T + * infrastructure. It plays a similar role to a FILE * in traditional + * C file IO. + */ + struct mipi_syst_handle { + struct mipi_syst_header* systh_header; /**< global state */ + struct mipi_syst_handle_flags systh_flags; /**< handle state */ + struct mipi_syst_msg_tag systh_tag; /**< tag flags */ + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + struct mipi_syst_guid systh_guid; /**< module GUID */ +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + struct mipi_syst_msglocation systh_location; /**< location record */ +#endif + + mipi_syst_u32 systh_param_count; /**< number of parameters */ + mipi_syst_u32 systh_param[6]; /**< catalog msg parameters */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + struct mipi_syst_platform_handle systh_platform; + /**< platform specific state */ +#endif +}; + + +#ifdef __cplusplus +} /* extern C */ +#endif +#ifndef MIPI_SYST_API_INCLUDED +#include "mipi_syst/api.h" +#endif + +#endif diff --git a/library/include/mipi_syst/api.h b/library/include/mipi_syst/api.h new file mode 100644 index 0000000..e07dd8b --- /dev/null +++ b/library/include/mipi_syst/api.h @@ -0,0 +1,2989 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* SyS-T Instrumentation API defintions + */ + +#ifndef MIPI_SYST_API_INCLUDED +#define MIPI_SYST_API_INCLUDED + +#ifndef MIPI_SYST_H_INCLUDED +#include "mipi_syst.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Define away all instrumentation calls if one if the following global + * disable switches is set + */ +#if !defined(MIPI_SYST_DISABLE_ALL) + +/** + * @defgroup ApiSets API Sets + * + * SyS-T provided Instrumentation API sets + * + * SyS-T provides different API sets. Most sets can be individually enabled + * or disabled using the @ref PCFG_ApiSet platform feature defines. + */ + +/** + * @defgroup API_global State and Lifetime handling macros + * @ingroup ApiSets + * + * State and handle lifetime related macros + * @{ + */ + +/** + * SyS-T platform initialization with user provided state structure + * + * This function must be called during system startup to initialize the SyS-T + * execution environment. This function expects a user provided SyS-T state + * structure pointer. This call supports environments with different + * library states at the same time. To initialize SyS-T for using a global + * shared state, call #MIPI_SYST_INIT(f,p) instead. + * + * @param s Pointer to SyS-T state header variable + * @param f Pointer to platform initialization hook function + * @param p Pointer value that gets passed to the initialization hook function + */ +#define MIPI_SYST_INIT_STATE(s, f, p) \ + mipi_syst_init((s), (f), (p)) + +/** + * SyS-T platform shutdown with user provided state structure + * + * This function expects a user provided SyS-T state + * structure pointer. This call supports environments with different + * library states at the same time. To shutdown SyS-T using a global + * shared state, call #MIPI_SYST_SHUTDOWN(f) instead. + * + * @param s Pointer to SyS-T state header variable + * @param f pointer to platform resource destruction hook function + */ +#define MIPI_SYST_SHUTDOWN_STATE(s, f) \ + mipi_syst_destroy((s), (f)) + +/** + * SyS-T global platform initialization + * + * This function must be called during system startup to initialize the SyS-T + * execution environment. + * + * @param f pointer to platform initialization hook function + * @param p pointer value that gets passed to the initialization hook function + */ +#define MIPI_SYST_INIT(f, p) \ + MIPI_SYST_INIT_STATE((struct mipi_syst_header*)0, (f), (p)) + +/** + * SyS-T global platform shutdown + * + * @param f pointer to platform resource destruction hook function + */ +#define MIPI_SYST_SHUTDOWN(f) \ + MIPI_SYST_SHUTDOWN_STATE((struct mipi_syst_header*)0, (f)) + +/** + * Initialize non-heap SyS-T handle with custom global state + * + * This function is used in platforms that don't support heap allocations. + * The caller has to provide a pointer to a memory location that can hold + * a mipi_syst_handle data structure. This function expect a user provided + * SyS-T state structure pointer as its first parameter. To create a + * handle for the shared global state, call #MIPI_SYST_INIT_HANDLE(h,p) instead. + * + * @param s Pointer to SyS-T state header variable + * @param h Pointer to handle data structure on the stack or data segment. + * @param p Pointer to data that get passed to the platform handle init hook + * function. + * + * Example + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * extern struct mipi_syst_header systh_header; + * static struct mipi_syst_handle systh_data; + * + * void foo() + * { + * struct mipi_syst_handle* svh; + * + * svh = MIPI_SYST_INIT_HANDLE_STATE(&systh_header, &systh_data, NULL); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_INIT_HANDLE_STATE(s, h, p) \ + mipi_syst_init_handle((s), (h), (p), 0) + +/** + * Initialize non-heap SyS-T handle + * + * This function is used in platforms that don't support heap allocations. + * The caller has to provide a pointer to a memory location that can hold + * a mipi_syst_handle data structure. + * + * @param h Pointer to handle data structure on the stack or data segment. + * @param p Pointer to mipi_syst_origin structure with client + * identifying information, or NULL if not used + * + * Example + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * static struct mipi_syst_handle systh_data; + * + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_INIT_HANDLE(&systh_data, NULL); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_INIT_HANDLE(h, p) \ + MIPI_SYST_INIT_HANDLE_STATE((struct mipi_syst_header*)0, (h), (p)) + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +/** + * Heap allocate and initialize a new SyS-T handle for a custom global state + * + * This function is only supported if the platform supports the + * feature #MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY. Use + * #MIPI_SYST_INIT_HANDLE if no heap support is enabled. + * + * @param s Pointer to SyS-T state header variable + * @param p Pointer to mipi_syst_origin structure with client + * identifying information, or NULL if not used + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * extern struct mipi_syst_header systh_header; + * + * static const struct mipi_syst_origin origin = + * MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + * + * void foo() + * { + * struct mipi_syst_handle* svh; + * + * svh = MIPI_SYST_ALLOC_HANDLE_STATE(&systh_header, &origin); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ALLOC_HANDLE_STATE(s, p) \ + mipi_syst_init_handle(\ + (s),\ + (struct mipi_syst_handle*)MIPI_SYST_HEAP_MALLOC(sizeof(struct mipi_syst_handle)),\ + (p), 1) + +/** + * Heap allocate and initialize a new SyS-T handle + * This function is only supported if the platform supports the + * feature #MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY. Use + * #MIPI_SYST_INIT_HANDLE if no heap support is enabled. + * + * @param p Pointer to mipi_syst_origin structure with client + * identifying information, or NULL if not used + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * * static const struct mipi_syst_origin origin = + * MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + * + * + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(&origin); + * + * ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ALLOC_HANDLE(p) \ + MIPI_SYST_ALLOC_HANDLE_STATE((struct mipi_syst_header*)0, (p)) + +#else +#define MIPI_SYST_ALLOC_HANDLE(p) \ +CFG_ERROR_ALLOC_HANDLE_CALLED_WITHOUT_PCFG_ENABLE_HEAP_MEMORY +#define MIPI_SYST_ALLOC_HANDLE_STATE(s, p) \ +CFG_ERROR_SYST_ALLOC_HANDLE_STATE_CALLED_WITHOUT_PCFG_ENABLE_HEAP_MEMORY +#endif + + +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) || defined (_DOXYGEN_) + /** + * Enable or disable length generation over the given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param v 0 disable length field, otherwise enable length + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // enable checksums + * // + * MIPI_SYST_ENABLE_HANDLE_LENGTH(svh, 1); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ENABLE_HANDLE_LENGTH(h, v) \ + ((h) && ((h)->systh_tag.et_length = (v) ? 1 : 0)) +#else +#define MIPI_SYST_ENABLE_HANDLE_LENGTH(h, v) +#endif + + /** + * Get length field generation state from given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @return 0 if disabled, otherwise enabled + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * if (MIPI_SYST_GET_HANDLE_LENGTH(svh)) { + * // length field enabled ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GET_HANDLE_LENGTH(h) \ + (((h) &&(h)->systh_tag.et_length) ? 1 : 0) + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) +/** + * Enable or disable checksum generation over the given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param v 0 disable checksum, otherwise enable checksum + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // enable checksums + * // + * MIPI_SYST_ENABLE_HANDLE_CHECKSUM(svh, 1); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h, v) \ + ((h) && ((h)->systh_tag.et_chksum = (v) ? 1 : 0)) + + /** + * Get checksum generation state from given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @return 0 if disabled, otherwise enabled + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * if (MIPI_SYST_GET_HANDLE_CHECKSUM(svh)) { + * // checksums enabled ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GET_HANDLE_CHECKSUM(h) \ + (((h) && (h)->systh_tag.et_chksum) ? 1 : 0) +#endif + +/** + * Change module and unit ID of the given SyS-T handle. + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param module module id (0..0x7F) + * @param unit unit id (0x0..0xF) + * + * @see #MIPI_SYST_SET_HANDLE_GUID_UNIT mipi_syst_msg_tag + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // tag message with 5:1 as module:unit id pair + * // + * MIPI_SYST_SET_MODULE_UNIT(svh, 5, 1); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SET_HANDLE_MODULE_UNIT(h, module, unit) \ +do { \ + if (h) { \ + (h)->systh_tag.et_guid = 0; \ + (h)->systh_tag.et_modunit = \ + _MIPI_SYST_MK_MODUNIT_ORIGIN((module), (unit)); \ + } \ +} while (0) + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + +/** + * Change GUID and unit ID of the given SyS-T handle. + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param guid mipi_syst_guid data structure + * @param unit unit id (0x0..0xF) + * + * @see mipi_syst_msg_tag + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * // + * static const struct mipi_syst_guid guid = + * MIPI_SYST_GEN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35); + * + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // tag message with GUID and 1 as unit id + * // + * MIPI_SYST_SET_HANDLE_GUID_UNIT(svh, guid, 1); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(h, guid, unit) \ +do { \ + if (h) { \ + (h)->systh_guid.u.ll[0] = MIPI_SYST_HTOLE64((guid).u.ll[0]); \ + (h)->systh_guid.u.ll[1] = MIPI_SYST_HTOLE64((guid).u.ll[1]); \ + (h)->systh_tag.et_modunit = (unit); \ + (h)->systh_tag.et_guid = 1;\ + } \ +} while (0) + + /** + * Change message origin using mipi_sys_t_origin structure + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param o origin structure + * + * @see #MIPI_SYST_SET_HANDLE_GUID_UNIT mipi_syst_origin + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * // Define origin used by this example as the message client ID + * // + * static const struct mipi_syst_origin origin = + * MIPI_SYST_GEN_ORIGIN_GUID(0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, 1); + * + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // tag message with GUID and 1 as unit id + * // + * MIPI_SYST_SET_HANDLE_ORIGIN(svh, origin); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SET_HANDLE_ORIGIN(h, o) \ +do { \ + /* Guid byte 8 bit 7 indicates if full GUID or \ + * short module header is used. This bit is never \ + * 0 for RFC4122 compliant guids. \ + */ \ + if (0 != ((o).guid.u.b[8] & 0x80)) { \ + MIPI_SYST_SET_HANDLE_GUID_UNIT( \ + (h), \ + (o).guid, \ + (o).unit); \ + } else { \ + MIPI_SYST_SET_HANDLE_MODULE_UNIT( \ + (h), \ + (o).guid.u.b[8], \ + (o).unit); \ + } \ +} while(0) + +#else +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(p, g, u) \ +CFG_ERROR_SET_HANDLE_GUID_UNIT_WITHOUT_MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +/** + * Enable protocol specific time stamp support on this SyS-T handle. + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @param v 0 disable, 1 enable + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + + * MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(svh, 1); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h, v) \ + ((h) && ((h)->systh_tag.et_timestamp = (v) ? 1 : 0)) + +/** + * Get timestamp generation state from given SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * @return 0 if disabled, otherwise enabled + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * if (MIPI_SYST_GET_HANDLE_TIMESTAMP(svh)) { + * // timestamp enabled ... + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_GET_HANDLE_TIMESTAMP(h) \ + (((h) && (h)->systh_tag.et_timestamp) ? 1 : 0) + +#else +#define MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h,v ) \ +CFG_ERROR_MIPI_SYST_ENABLE_HANDLE_TIMESTAMP_WITHOUT_MIPI_SYST_PCFG_ENABLE_TIMESTAMP +#endif + + + +/** + * Delete a SyS-T handle + * + * @param h SyS-T handle from #MIPI_SYST_INIT_HANDLE or #MIPI_SYST_ALLOC_HANDLE + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * struct mipi_syst_handle* svh = MIPI_SYST_ALLOC_HANDLE(NULL); + * + * // ... + * + * MIPI_SYST_DELETE_HANDLE(svh); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DELETE_HANDLE(h) \ + mipi_syst_delete_handle(h) + +/** @} */ + +/** + * Pass null to instrumentation API to skip location information generation. + */ +#define MIPI_SYST_NOLOCATION (struct mipi_syst_msglocation *)0 + +/** + * @defgroup WriteAPI Raw Data Writing Macros + * @ingroup ApiSets + * + * Raw data writing macros: + * @{ + */ + +/** + * Send short data message with 28-bit payload.
+ * + * This API is indented for space and speed restricted environments that + * cannot support the more complex message types. + * @param h mipi_syst_handle* SyS-T handle + * @param v 28-bit output value. The upper 4 bits of the parameter value + * are discarded + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define INIT_START 1 + * #define INIT_DONE 2 + * + * foo() + * { + * MIPI_SYST_SHORT32(svh, INIT_START); + * // processing .. + * // + * + * MIPI_SYST_SHORT32(svh, INIT_DONE); + * // .. + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SHORT32(h, v) \ + MIPI_SYST_OUTPUT_D32MTS(h,\ + (((v)<<4) | (mipi_syst_u32)MIPI_SYST_TYPE_SHORT32)) + +/** + * Send short data message with 60-bit payload.
+ * + * This API is indented for space and speed restricted environments that + * cannot support the more complex message types. + * @param h mipi_syst_handle* SyS-T handle + * @param v 60-bit output value. The upper 4 bits of the parameter value + * are discarded. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define INIT_START 1 + * #define INIT_DONE 2 + * + * foo() + * { + * MIPI_SYST_SHORT64(svh, INIT_START); + * // processing .. + * // + * + * MIPI_SYST_SHORT64(svh, INIT_DONE); + * // .. + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_SHORT64(h, v) \ + MIPI_SYST_OUTPUT_D64MTS(h,\ + (((v)<<4) | (mipi_syst_u64)MIPI_SYST_TYPE_SHORT64)) + + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + +/** + * Send a timesync Message that helps the decode Software to synchronize the + * transport protocol clock value (e.g., the MIPI STP timestamp) with trace + * hardware generated clocks. This API depends on the platform define + * #MIPI_SYST_PCFG_ENABLE_TIMESTAMP. + * @param h mipi_syst_handle* SyS-T handle + * @param c 64-bit clock value from message timestamp clock + * @param f 64-bit message timestamp clock frequency value in Herz + */ +#define MIPI_SYST_CLOCK_SYNC(h, c, f)\ + mipi_syst_write_clock((h),\ + MIPI_SYST_NOLOCATION,\ + MIPI_SYST_CLOCK_TRANSPORT_SYNC,\ + (c),\ + (f)) + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_clock(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_clock fmt, + mipi_syst_u64 clock, + mipi_syst_u64 freq); +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) + +/** + * Send raw data message with user defined payload.
+ * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id 8-bit message protocol ID. This ID is used to identify + * the data protocol in the payload of this message for pretty + * printing in trace decoders. The protocol ID must uniquely + * identify the contents within the SyS-T handle's + * #mipi_syst_msg_tag.et_modunit id or + * #mipi_syst_handle.systh_guid value. The protocol decoder + * uses this value to route data from `MIPI_SYST_WRITE()` calls + * to other cascaded decoders to actually + * process the contents. + * @param p pointer to raw data to send + * @param len 16-bit length of data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * // emit raw data under user defined decode ID 5 + * // + * unsigned char data[] = { 0,1,2,3,4,5,6,7,8,9 }; + * + * MIPI_SYST_WRITE(systh, MIPI_SYST_SEVERITY_INFO, 5, data, sizeof(data)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_WRITE(h, sev, id, p, len) \ + mipi_syst_write_raw_message((h), \ + MIPI_SYST_NOLOCATION, (sev), (id), (p), (len)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +/** @copydoc MIPI_SYST_WRITE(h, sev, id, p, len) */ +#define MIPI_SYST_WRITE_LOCADDR(h, sev, id, p, len) \ + mipi_syst_write_raw_message((h),\ + mipi_syst_make_address_location((h), mipi_syst_return_addr()),\ + (sev), (id), (p), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +/** +* Send raw data message with user defined payload.
+* +* @param h mipi_syst_handle* SyS-T handle +* @param sev mipi_syst_severity severity level (0..7) +* @param file file ID as 16-bit value +* @param id 8-bit message protocol ID. This ID is used to identify +* the data protocol in the payload of this message for pretty +* printing in trace decoders. The protocol ID must uniquely +* identify the contents within the SyS-T handle's +* #mipi_syst_msg_tag.et_modunit id or +* #mipi_syst_handle.systh_guid value. The protocol decoder +* uses this value to route data from `MIPI_SYST_WRITE()` calls +* to other cascaded decoders to actually +* process the contents. +* @param p pointer to raw data to send +* @param len 16-bit length of data to send +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* #define THIS_FILE 100 +* +* // emit raw data under user defined decode ID 5 +* // +* unsigned char data[] = { 0,1,2,3,4,5,6,7,8,9 }; +* +* MIPI_SYST_WRITE_LOC16(systh, MIPI_SYST_SEVERITY_INFO, + THIS_FILE, 5, data, sizeof(data)); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_WRITE_LOC16(h, sev, file, id, p, len) \ + mipi_syst_write_raw_message((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id), (p), (len)) + +/** +* Send raw data message with user defined payload.
+* +* @param h mipi_syst_handle* SyS-T handle +* @param sev mipi_syst_severity severity level (0..7) +* @param file file ID as 32-bit value +* @param id 8-bit message protocol ID. This ID is used to identify +* the data protocol in the payload of this message for pretty +* printing in trace decoders. The protocol ID must uniquely +* identify the contents within the SyS-T handle's +* #mipi_syst_msg_tag.et_modunit id or +* #mipi_syst_handle.systh_guid value. The protocol decoder +* uses this value to route data from `MIPI_SYST_WRITE()` calls +* to other cascaded decoders to actually +* process the contents. +* @param p pointer to raw data to send +* @param len 16-bit length of data to send +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* +* #define THIS_FILE 100 +* +* // emit raw data under user defined decode ID 5 +* // +* unsigned char data[] = { 0,1,2,3,4,5,6,7,8,9 }; +* +* MIPI_SYST_WRITE_LOC16(systh, MIPI_SYST_SEVERITY_INFO, +THIS_FILE, 5, data, sizeof(data)); +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_WRITE_LOC32(h, sev, file, id, p, len) \ + mipi_syst_write_raw_message((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id), (p), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** @} */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_raw_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u8 subtype, + const void *data, mipi_syst_u16 length); + +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) */ + +/** +* @defgroup BuildAPI Build Number Message Macros +* @ingroup ApiSets +* +* Build Number writing macros: +* @{ +*/ +/** + +* Send compact client build number message with 22-bit payload.
+* +* This API is indented for space and speed restricted environments that +* cannot support the more complex message types. +* @param h mipi_syst_handle* SyS-T handle +* @param n 22-bit output value. The upper 10 bits of the parameter value +* are discarded. +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* #define MY_BUILDID 0x3FFFFF +* +* foo() +* { +* MIPI_SYST_BUILD_COMPACT32(svh, MY_BUILDID); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_BUILD_COMPACT32(h, n) \ + if (h) { MIPI_SYST_OUTPUT_D32MTS(h, (\ + (((n) & 0x000FFFFF) << 4) | \ + ((n) & 0xFFF00000) << 10));} + +/** +* Send compact client build number message with 54-bit payload.
+* +* This API is indented for space and speed restricted environments that +* cannot support the more complex message types. +* @param h mipi_syst_handle* SyS-T handle +* @param n 54-bit output value. The upper 10 bits of the parameter value +* are discarded. +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* #define MY_BUILDID 0x3FFFFFFFFFFFFFull +* +* foo() +* { +* MIPI_SYST_BUILD_COMPACT64(svh, MY_BUILDID); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_BUILD_COMPACT64(h, n) \ + if (h) { MIPI_SYST_OUTPUT_D64MTS(h, (\ + (0x00000000001000000ull | \ + ((n) & 0x00000000000FFFFFull) << 4) | \ + ((n) & 0xFFFFFFFFFFF00000ull) << 10));} + + +#if defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) + +/** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param bld 64-bit build ID. + * @param txt pointer to textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD(systh, MIPI_SYST_SEVERITY_INFO, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD(h, sev, bld, txt, len) \ + mipi_syst_write_build_message((h), \ + MIPI_SYST_NOLOCATION, (sev), (bld), (txt), (len)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param bld 64-bit build ID. + * @param txt pointer to textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD_LOCADDR(h, sev, bld, txt, len) \ + mipi_syst_write_build_message((h),\ + mipi_syst_make_address_location((h), mipi_syst_return_addr()),\ + (sev), (bld), (txt), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + + /** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param bld 64-bit build ID. + * @param txt pointer to textual textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD_LOC16(h, sev, file, bld, txt, len) \ + mipi_syst_write_build_message((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (bld), (txt), (len)) + + /** + * Send client build number data message + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param bld 64-bit build ID. + * @param txt pointer to textual build description + * @param len 16-bit length of text data to send + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * #define BUILD_NUMBER 0x1122334455667788ull + * #define BUILD_BANNER "MyApp-v1.2.3 (April 16 2018)" + * + * MIPI_SYST_BUILD_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * BUILD_NUMBER, + * BUILD_BANNER, sizeof(BUILD_BANNER) + * ); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_BUILD_LOC32(h, sev, file, bld, txt, len) \ + mipi_syst_write_build_message((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (bld), (txt), (len)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** @} */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_build_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 id, + const char *text, mipi_syst_u16 length); +#endif /* defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) */ + +/* public API prototypes */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_init(struct mipi_syst_header* header, mipi_syst_inithook_t pfinit, + const void * init_data); +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_destroy(struct mipi_syst_header* + header, + mipi_syst_destroyhook_t + pfdestroy); +MIPI_SYST_EXPORT struct mipi_syst_handle* MIPI_SYST_CALLCONV +mipi_syst_init_handle(struct mipi_syst_header* header, struct mipi_syst_handle* svh, + const struct mipi_syst_origin *origin, + mipi_syst_u32 heap); +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_delete_handle(struct mipi_syst_handle* + svh); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +MIPI_SYST_EXPORT void *MIPI_SYST_CALLCONV mipi_syst_return_addr(void); +#endif + +/* Inline helper functions + * These functions are only attempted to be inlined if the define + * MIPI_SYST_PCFG_ENABLE_INLINE is defined. + * Undefining it causes true functions calls to be used instead. + * This is useful if saving code space matters more then speed. + */ +#if defined(MIPI_SYST_PCFG_ENABLE_INLINE) +#include "./inline.h" +#else +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location32(struct mipi_syst_handle* h, mipi_syst_u16 f, + mipi_syst_u16 l); +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location64(struct mipi_syst_handle* h, mipi_syst_u32 f, + mipi_syst_u32 l); +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_address_location(struct mipi_syst_handle* h, void *p); + +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param0(struct mipi_syst_handle* h); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV +mipi_syst_make_param1(struct mipi_syst_handle* h, mipi_syst_u32 p1); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV +mipi_syst_make_param2(struct mipi_syst_handle* h, mipi_syst_u32 p1, + mipi_syst_u32 p2); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param3(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param4(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param5(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5); +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param6(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5, + mipi_syst_u32 p6); +#endif + + +#if defined(MIPI_SYST_PCFG_ENABLE_STRING_API) + +#define _MIPI_SYST_ASSERT_DEBUG_STRING(cond) \ + MIPI_SYST_FILE ":" _MIPI_SYST_CPP_TOSTR(MIPI_SYST_LINE) " " #cond + +/** + * @defgroup StringAPI String Generating Macros + * @ingroup ApiSets + * + * String generating macros: + * @{ + */ + +/** + * Send UTF-8 character string with given severity and length.
+ * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param len mipi_syst_u16 number of bytes to emit + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define FILE_ID 0xabdc // this file id + * char * str = "Hello World"; + * + * MIPI_SYST_DEBUG(systh, MIPI_SYST_SEVERITY_INFO, str, strlen(str)); + * MIPI_SYST_DEBUG_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, str, strlen(str)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DEBUG(h, severity, str, len) \ + mipi_syst_write_debug_string((h), MIPI_SYST_NOLOCATION, \ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + +/** + * Send function enter string message. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER(systh, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT(systh, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_ENTER(h, severity) \ + mipi_syst_write_debug_string((h), MIPI_SYST_NOLOCATION, \ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** + * Send function exit string message. + * The payload is the UTF-8 function name of the surrounding function + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER(systh, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT(systh, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_EXIT(h, severity) \ + mipi_syst_write_debug_string((h), MIPI_SYST_NOLOCATION, \ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** + * Send assertion notice string message if the passed condition is false. + * The notice includes the failing expression string as its payload. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param cond boolean condition to verify + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo(void * p) + * { + * MIPI_SYST_ASSERT(systh, MIPI_SYST_SEVERITY_ERROR, p != NULL); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_ASSERT(h, severity, cond) \ + {\ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + MIPI_SYST_NOLOCATION,\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } + + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send UTF-8 character string with given severity and length.
+ * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param len mipi_syst_u16 number of bytes to emit + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define FILE_ID 0xabdc // this file id + * char * str = "Hello World"; + * + * MIPI_SYST_DEBUG_LOC16(systh, MIPI_SYST_SEVERITY_INFO, FILE_ID, str, strlen(str)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DEBUG_LOC16(h, severity, file, str, len) \ + mipi_syst_write_debug_string((h), \ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + /** + * Send UTF-8 character string with given severity and length.
+ * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 32-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param len mipi_syst_u16 number of bytes to emit + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * #define FILE_ID 0x0000abdc // this file id + * char * str = "Hello World"; + * + * MIPI_SYST_DEBUG_LOC32(systh, MIPI_SYST_SEVERITY_INFO, FILE_ID, str, strlen(str)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_DEBUG_LOC32(h, severity, file, str, len) \ + mipi_syst_write_debug_string((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + + /** + * Send function enter string message. + * The payload is the UTF-8 function name of the surrounding function. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_ENTER_LOC16(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + + /** + * Send function exit string message. + * The payload is the UTF-8 function name of the surrounding function. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * void foo() + * { + * MIPI_SYST_FUNC_ENTER_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * // body + * MIPI_SYST_FUNC_EXIT_LOC16(systh, 10, MIPI_SYST_SEVERITY_INFO); + * } + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_FUNC_EXIT_LOC16(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** +* Send assertion notice string message if the passed condition is false. +* The notice includes the failing expression string as its payload. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 16-bit user defined file ID +* @param cond boolean condition to verify +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo(void * p) +* { +* MIPI_SYST_ASSERT(systh, 1, MIPI_SYST_SEVERITY_ERROR, p != NULL); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_ASSERT_LOC16(h, severity, file, cond) \ + {\ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } +/** +* Send function enter string message. +* The payload is the UTF-8 function name of the surrounding function. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 32-bit user defined file ID +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_ENTER_LOC32(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) +/** +* Send function exit string message. +* The payload is the UTF-8 function name of the surrounding function. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 32-bit user defined file ID +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOC32(systh, 10, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_EXIT_LOC32(h, severity, file) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) +/** +* Send assertion notice string message if the passed condition is false. +* The notice includes the failing expression string as its payload. +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* @param file 32-bit user defined file ID +* @param cond boolean condition to verify +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo(void * p) +* { +* MIPI_SYST_ASSERT(systh, 1, MIPI_SYST_SEVERITY_ERROR, p != NULL); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_ASSERT_LOC32(h, severity, file, cond) \ + { \ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +/** @copydoc MIPI_SYST_DEBUG */ +#define MIPI_SYST_DEBUG_LOCADDR(h, severity, str, len) \ + mipi_syst_write_debug_string((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_GENERIC, \ + (severity), (len), (str)) + +/** +* Send function enter string message. +* The payload is the UTF-8 function name of the surrounding function. + +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_ENTER_LOCADDR(h, severity) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_FUNCTIONENTER, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** +* Send function exit string message. The payload is the UTF-8 function name +* of the surrounding function +* +* @param h mipi_syst_handle* SyS-T handle +* @param severity mipi_syst_severity severity level (0..7) +* +* Example: +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} +* void foo() +* { +* MIPI_SYST_FUNC_ENTER_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* // body +* MIPI_SYST_FUNC_EXIT_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO); +* } +* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +#define MIPI_SYST_FUNC_EXIT_LOCADDR(h, severity) \ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_FUNCTIONEXIT, \ + (severity), sizeof(MIPI_SYST_FUNCTION_NAME),\ + MIPI_SYST_FUNCTION_NAME) + +/** @copydoc MIPI_SYST_ASSERT(svh, severity) */ +#define MIPI_SYST_ASSERT_LOCADDR(h, severity, cond) \ + { \ + if (!(cond)) {\ + mipi_syst_write_debug_string((h),\ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + MIPI_SYST_STRING_ASSERT, \ + (severity), sizeof(_MIPI_SYST_ASSERT_DEBUG_STRING(cond)),\ + _MIPI_SYST_ASSERT_DEBUG_STRING(cond));\ + } \ + } + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_debug_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_string type, + enum mipi_syst_severity severity, + mipi_syst_u16 len, const char *str); + +#endif /* defined (MIPI_SYST_PCFG_ENABLE_STRING_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) + +/** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF(systh, MIPI_SYST_SEVERITY_INFO, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF(h, severity, str, ...) \ + mipi_syst_write_printf_string((h), MIPI_SYST_NOLOCATION, \ + (severity),\ + (str),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 16-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF_LOC16(h, severity, file, str, ...) \ + mipi_syst_write_printf_string((h), \ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (severity),\ + (str),\ + ##__VA_ARGS__) + + /** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file 32-bit user defined file ID + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF_LOC32(h, severity, file, str, ...) \ + mipi_syst_write_printf_string((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (severity),\ + (str),\ + ##__VA_ARGS__) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send UTF-8 character string in C99 printf format together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param str const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_PRINTF_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * "The %s jumps over the %s %d times", "cow", "moon", 10); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_PRINTF_LOCADDR(h, severity, str, ...) \ + mipi_syst_write_printf_string((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + (severity), \ + (str),\ + ##__VA_ARGS__) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_printf_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + const char *fmt, + ...); +#endif /* MIPI_SYST_PCFG_ENABLE_PRINTF_API */ + +/** @} */ + +/** Parameter encoding values for vararg style catalog APIs + */ +enum mipi_syst_catalog_parameter_types { + _MIPI_SYST_CATARG_END = 0, /**< end of parameter list */ + _MIPI_SYST_CATARG_D = 1, /**< int like %d */ + _MIPI_SYST_CATARG_LD = 2, /**< long like %ld */ + _MIPI_SYST_CATARG_LLD = 3, /**< long long like %lld */ + _MIPI_SYST_CATARG_ZD = 4, /**< size_t like %z */ + _MIPI_SYST_CATARG_TD = 5, /**< ptrdiff_t like %t */ + _MIPI_SYST_CATARG_F = 6, /**< double like %f */ + _MIPI_SYST_CATARG_LF = 7, /**< long double like %lf */ + _MIPI_SYST_CATARG_C = 8, /**< char like %c */ + _MIPI_SYST_CATARG_HHD = 9, /**< short like %hhd */ + _MIPI_SYST_CATARG_LC = 10, /**< long char like %lc */ + _MIPI_SYST_CATARG_P = 11, /**< void * like %p or %n */ + _MIPI_SYST_CATARG_CSTR = 12 /**< char * like %s */ +}; +#define _MIPI_SYST_MK_PARAM_LIST(tag, p) _MIPI_SYST_CATARG_##tag, p + +#define MIPI_SYST_PARAM_INT(p) _MIPI_SYST_MK_PARAM_LIST(D, (p)) /**< int like %d */ +#define MIPI_SYST_PARAM_LONG(p) _MIPI_SYST_MK_PARAM_LIST(LD, (p)) /**< long like %ld */ +#define MIPI_SYST_PARAM_LONGLONG(p) _MIPI_SYST_MK_PARAM_LIST(LLD, (p)) /**< long long like %lld */ +#define MIPI_SYST_PARAM_SIZE_T(p) _MIPI_SYST_MK_PARAM_LIST(ZD, (p)) /**< size_t like %z */ +#define MIPI_SYST_PARAM_PTRDIFF_T(p) _MIPI_SYST_MK_PARAM_LIST(TD, (p)) /**< ptrdiff_t like %t */ +#define MIPI_SYST_PARAM_FLOAT(p) _MIPI_SYST_MK_PARAM_LIST(F, (p)) /**< float like %f */ +#define MIPI_SYST_PARAM_DOUBLE(p) _MIPI_SYST_MK_PARAM_LIST(F, (p)) /**< double like %f */ +#define MIPI_SYST_PARAM_LONGDOUBLE(p) _MIPI_SYST_MK_PARAM_LIST(LF, (p)) /**< long double like %lf */ +#define MIPI_SYST_PARAM_CHAR(p) _MIPI_SYST_MK_PARAM_LIST(C, (p)) /**< char like %c */ +#define MIPI_SYST_PARAM_SHORT(p) _MIPI_SYST_MK_PARAM_LIST(HHD, (p)) /**< short like %hhd */ +#define MIPI_SYST_PARAM_WCHAR(p) _MIPI_SYST_MK_PARAM_LIST(LC, (p)) /**< long char like %lc */ +#define MIPI_SYST_PARAM_PTR(p) _MIPI_SYST_MK_PARAM_LIST(P, (p)) /**< void * like %p or %n */ +#define MIPI_SYST_PARAM_CSTR(p) _MIPI_SYST_MK_PARAM_LIST(CSTR, (p)) /**< char * like %s */ + +/** + * @defgroup CatAPI64 64-Bit Catalog Message Macros + * @ingroup ApiSets + * + * Catalog message instrumentation API + * + * Note: This API set is enabled or disabled by the + * #MIPI_SYST_PCFG_ENABLE_CATID64_API and/or #MIPI_SYST_PCFG_ENABLE_CATID32_API + * platform feature defines. + * @{ + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +/** + * Send catalog message with 0-6 parameters.
+ * This family of Macros is used to send 32 or 64-bit wide catalog + * message IDs with up to six 32-bit wide parameters into the trace stream. + * The macro names are encoded in the following way: + * MIPI_SYST_CATALOG{ID-WIDTH}_{PARAMETER-COUNT} + * + * Example: A 32-bit ID using catalog function with 3 parameters whould be + * called MIPI_SYST_CATALOG32_3. + * + * @param svh mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id catalog ID + * + * Up to 6 32-Bit numeric parameter follow the catalog ID. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * // emit plain catalog id (no parameter) + * // + * MIPI_SYST_CATALOG32_0(svh, MIPI_SYST_SEVERITY_ERROR, MSGID_INIT_FAIL); + * + * // catalog id with one parameter + * // + * MIPI_SYST_CATALOG32_1(svh, MIPI_SYST_SEVERITY_INFO, MSGID_SETLEVEL, 0x3); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_0(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_1(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_2(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_3(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_4(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_5(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG64_6(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +#define MIPI_SYST_CATALOG64_0_LOCADDR(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_1_LOCADDR(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_2_LOCADDR(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_3_LOCADDR(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_4_LOCADDR(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#define MIPI_SYST_CATALOG64_0_LOC16(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_1_LOC16(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_2_LOC16(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_3_LOC16(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_4_LOC16(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_5_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_6_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) + +#define MIPI_SYST_CATALOG64_0_LOC32(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_1_LOC32(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_2_LOC32(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_3_LOC32(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_4_LOC32(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_5_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG64_6_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog64_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) + +/** + * Send vararg catalog message + * + * @param svh mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64(svh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64(svh, severity, id, ...) \ + mipi_syst_write_printf_catalog64((svh), MIPI_SYST_NOLOCATION, \ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END) + + #if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send vararg catalog message + * + * @param svh mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64_LOC16(svh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_LOC16(svh, severity, file, id, ...) \ + mipi_syst_write_printf_catalog64((svh), \ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_LOC32(h, severity, file, id, ...) \ + mipi_syst_write_printf_catalog64((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param ... optional format arguments. + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG64_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG64_LOCADDR(h, severity, id, ...) \ + mipi_syst_write_printf_catalog64((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + (severity), \ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + + +/** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param svh mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64(svh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64(svh, severity, id, fmt, ...) \ + MIPI_SYST_CATALOG64((svh),\ + (severity),\ + (id),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10 + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64_LOC16(h, severity, file, id, fmt, ...) \ + MIPI_SYST_CATALOG64_LOC16((h),\ + (severity),\ + (file),\ + (id),\ + ##__VA_ARGS__) + /** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64_LOC32(h, severity, file, id, fmt, ...) \ + MIPI_SYST_CATALOG64_LOC32((h),\ + (severity),\ + (file),\ + (id),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Vararg style catalog message the contains the + * fmt string in addition to the id. The fmt string is not + * used by this API and removed during compilation. It is only + * present to support source code scanning tools that compute + * the ID to fmt string mapping. The API only sends the ID and + * the arguments to support printf() style output formatting + * by decoding software. + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u64 catalog ID + * @param fmt UTF-8 printf style format string + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATPRINTF64_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_STRING("cow"), + * MIPI_SYST_PARAM_STRING("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF64_LOCADDR(h, severity, id, fmt, ...) \ + MIPI_SYST_CATALOG64_LOCADDR((h),\ + (severity),\ + (id),\ + ##__VA_ARGS__) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_printf_catalog64(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 id, + ...); +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) */ + +/** @} */ + +/* API function prototypes */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_catalog64_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 catid); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) +/** + * @defgroup CatAPI32 32-Bit Catalog Message Macros + * @ingroup ApiSets + * + * Catalog message instrumentation API + * @{ + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) +/** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32(systh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32(h, severity, id, ...) \ + mipi_syst_write_printf_catalog32((h), MIPI_SYST_NOLOCATION, \ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END) + + #if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32_LOC16(h, severity, file, id, ...) \ + mipi_syst_write_printf_catalog32((h), \ + mipi_syst_make_file_location32((h), \ + (mipi_syst_u16)(file), \ + (mipi_syst_u16)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32_LOC32(h, severity, file, id, ...) \ + mipi_syst_write_printf_catalog32((h), \ + mipi_syst_make_file_location64((h), \ + (mipi_syst_u32)(file), \ + (mipi_syst_u32)MIPI_SYST_LINE),\ + (severity),\ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send vararg catalog message + * + * @param h mipi_syst_handle* SyS-T handle + * @param severity mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param ... optional format arguments + * + * The optional parameters are passed to the function as a sequence of pairs, + * each containing a type tag with a value from the enumeration + * #mipi_syst_catalog_parameter_types, and then a value of the specified type. + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG32_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * MIPI_SYST_HASH("The %s jumps over the %s %d times",0), + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATALOG32_LOCADDR(h, severity, id, ...) \ + mipi_syst_write_printf_catalog32((h), \ + mipi_syst_make_address_location((h),\ + mipi_syst_return_addr()),\ + (severity), \ + (id),\ + ##__VA_ARGS__,\ + _MIPI_SYST_CATARG_END)) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32(systh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32(h, sev, id, fmt, ...) \ + MIPI_SYST_CATALOG32((h),\ + (sev),\ + (id),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + /** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 16-bit value + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32_LOC16(systh, MIPI_SYST_SEVERITY_INFO, 10, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32_LOC16(h, sev, file, id, fmt, ...) \ + MIPI_SYST_CATALOG32_LOC16((h),\ + (sev),\ + (file),\ + (id),\ + ##__VA_ARGS__) + + /** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param file file ID as 32-bit value + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32_LOC32(systh, MIPI_SYST_SEVERITY_INFO, 10, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32_LOC32(h, sev, file, id, fmt, ...) \ + MIPI_SYST_CATALOG32_LOC32((h),\ + (sev),\ + (id),\ + (file),\ + ##__VA_ARGS__) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + + /** + * Send catalog message together with + * the arguments to support printf() style output formatting. + * + * @param h mipi_syst_handle* SyS-T handle + * @param sev mipi_syst_severity severity level (0..7) + * @param id mipi_syst_u32 catalog ID + * @param fmt const mipi_syst_u8 * pointer to UTF-8 string bytes + * @param ... optional format arguments + * + * Example: + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.c} + * + * MIPI_SYST_CATALOG_PRINTF32_LOCADDR(systh, MIPI_SYST_SEVERITY_INFO, + * 0x1122334455667788ull, + * "The %s jumps over the %s %d times", + * MIPI_SYST_PARAM_CSTR("cow"), + * MIPI_SYST_PARAM_CSTR("moon"), + * MIPI_SYST_PARAM_INT(10)); + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ +#define MIPI_SYST_CATPRINTF32_LOCADDR(h, sev, id, fmt, ...) \ + MIPI_SYST_CATALOG32_LOCADDR((h),\ + (sev),\ + (id),\ + ##__VA_ARGS__) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_printf_catalog32(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u32 id, + ...); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) */ + +/** @copydoc MIPI_SYST_CATALOG64_0 */ +#define MIPI_SYST_CATALOG32_0(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_1(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_2(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_3(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_4(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_5(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) +#define MIPI_SYST_CATALOG32_6(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh), MIPI_SYST_NOLOCATION, (sev), (id))) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + +#define MIPI_SYST_CATALOG32_0_LOCADDR(svh, sev, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_1_LOCADDR(svh, sev, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_2_LOCADDR(svh, sev, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_3_LOCADDR(svh, sev, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_4_LOCADDR(svh, sev, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_address_location((svh), mipi_syst_return_addr()),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#define MIPI_SYST_CATALOG32_0_LOC16(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_1_LOC16(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_2_LOC16(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_3_LOC16(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_4_LOC16(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_5_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_6_LOC16(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location32((svh), \ + (mipi_syst_u16)(file), (mipi_syst_u16)MIPI_SYST_LINE),\ + (sev), (id))) + +#define MIPI_SYST_CATALOG32_0_LOC32(svh, sev, file, id)\ + (mipi_syst_make_param0(svh),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_1_LOC32(svh, sev, file, id, p1)\ + (mipi_syst_make_param1(svh, p1),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_2_LOC32(svh, sev, file, id, p1, p2)\ + (mipi_syst_make_param2(svh, p1, p2),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_3_LOC32(svh, sev, file, id, p1, p2, p3)\ + (mipi_syst_make_param3(svh, p1, p2, p3),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_4_LOC32(svh, sev, file, id, p1, p2, p3, p4)\ + (mipi_syst_make_param4(svh, p1, p2, p3, p4),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_5_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5)\ + (mipi_syst_make_param5(svh, p1, p2, p3, p4, p5),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) +#define MIPI_SYST_CATALOG32_6_LOC32(svh, sev, file, id, p1, p2, p3, p4, p5, p6)\ + (mipi_syst_make_param6(svh, p1, p2, p3, p4, p5, p6),\ + mipi_syst_write_catalog32_message((svh),\ + mipi_syst_make_file_location64((svh), \ + (mipi_syst_u32)(file), (mipi_syst_u32)MIPI_SYST_LINE),\ + (sev), (id))) + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ +/** @} */ + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_catalog32_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u32 catid); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) */ + + + +#endif /* !MIPI_SYST_DISABLE_ALL */ + +/* Define undefined API's to nothing. This ensures source compatibility + * independent of the SyS-T feature configuration. + */ +#ifndef MIPI_SYST_INIT +#define MIPI_SYST_INIT(f, p) +#endif + +#ifndef MIPI_SYST_SHUTDOWN +#define MIPI_SYST_SHUTDOWN(x) +#endif + +#ifndef MIPI_SYST_INIT_HANDLE +#define MIPI_SYST_INIT_HANDLE(h, p) (struct mipi_syst_handle*)0 +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_CHECKSUM +#define MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h, v) +#endif +#ifndef MIPI_SYST_GET_HANDLE_CHECKSUM +#define MIPI_SYST_GET_HANDLE_CHECKSUM(h) 0 +#endif +#ifndef MIPI_SYST_ENABLE_HANDLE_COUNTER +#define MIPI_SYST_ENABLE_HANDLE_COUNTER(h, v) +#endif +#ifndef MIPI_SYST_GET_HANDLE_COUNTER +#define MIPI_SYST_GET_HANDLE_COUNTER(h) 0 +#endif +#ifndef MIPI_SYST_SET_HANDLE_MODULE_UNIT +#define MIPI_SYST_SET_HANDLE_MODULE_UNIT(p, m, u) +#endif + +#ifndef MIPI_SYST_SET_HANDLE_GUID_UNIT +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(p, g, u) +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_TIMESTAMP +#define MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(h, v) +#endif +#ifndef MIPI_SYST_GET_HANDLE_TIMESTAMP +#define MIPI_SYST_GET_HANDLE_TIMESTAMP(h) 0 +#endif + +#ifndef MIPI_SYST_INIT +#define MIPI_SYST_INIT(f, p) +#endif + +#ifndef MIPI_SYST_SHUTDOWN +#define MIPI_SYST_SHUTDOWN() +#endif + +#ifndef MIPI_SYST_INIT_HANDLE +#define MIPI_SYST_INIT_HANDLE(h, p) +#endif + +#ifndef MIPI_SYST_ALLOC_HANDLE +#define MIPI_SYST_ALLOC_HANDLE(p) (struct mipi_syst_handle*)0 +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_CHECKSUM +#define MIPI_SYST_ENABLE_HANDLE_CHECKSUM(h,v) +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_COUNTER +#define MIPI_SYST_ENABLE_HANDLE_COUNTER(h,v) +#endif + +#ifndef MIPI_SYST_ENABLE_HANDLE_LENGTH +#define MIPI_SYST_ENABLE_HANDLE_LENGTH(h,v) +#endif + +#ifndef MIPI_SYST_SET_HANDLE_MODULE_UNIT +#define MIPI_SYST_SET_HANDLE_MODULE_UNIT(p, m, u) +#endif + +#ifndef MIPI_SYST_SET_HANDLE_GUID_UNIT +#define MIPI_SYST_SET_HANDLE_GUID_UNIT(p, o, u) +#endif + +#ifndef MIPI_SYST_SHORT32 +#define MIPI_SYST_SHORT32(h, v) +#endif + +#ifndef MIPI_SYST_WRITE +#define MIPI_SYST_WRITE(h, sev, id, p, len) +#endif +#ifndef MIPI_SYST_WRITE_LOCADDR +#define MIPI_SYST_WRITE_LOCADDR(h, sev, id, p, len) +#endif +#ifndef MIPI_SYST_WRITE_LOC16 +#define MIPI_SYST_WRITE_LOC16(h, sev, f, id, p, len) +#endif +#ifndef MIPI_SYST_WRITE_LOC32 +#define MIPI_SYST_WRITE_LOC32(h, sev, f, id, p, len) +#endif + +#ifndef MIPI_SYST_DELETE_HANDLE +#define MIPI_SYST_DELETE_HANDLE(h) +#endif + +#ifndef MIPI_SYST_DEBUG +#define MIPI_SYST_DEBUG(svh, sev, str, len) +#endif +#ifndef MIPI_SYST_DEBUG_LOCADDR +#define MIPI_SYST_DEBUG_LOCADDR(svh, sev, str, len) +#endif +#ifndef MIPI_SYST_DEBUG_LOC16 +#define MIPI_SYST_DEBUG_LOC16(svh, sev, file, str, len) +#endif +#ifndef MIPI_SYST_DEBUG_LOC32 +#define MIPI_SYST_DEBUG_LOC32(svh, sev, file, str, len) +#endif +#ifndef MIPI_SYST_FUNC_ENTER +#define MIPI_SYST_FUNC_ENTER(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_ENTER_LOCADDR +#define MIPI_SYST_FUNC_ENTER_LOCADDR(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_ENTER_LOC16 +#define MIPI_SYST_FUNC_ENTER_LOC16(svh, sev, file) +#endif +#ifndef MIPI_SYST_FUNC_ENTER_LOC32 +#define MIPI_SYST_FUNC_ENTER_LOC32(svh, sev, file) +#endif +#ifndef MIPI_SYST_FUNC_EXIT +#define MIPI_SYST_FUNC_EXIT(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOCADDR +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOCADDR +#define MIPI_SYST_FUNC_EXIT_LOCADDR(svh, sev) +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOC16 +#define MIPI_SYST_FUNC_EXIT_LOC16(svh, sev, file) +#endif +#ifndef MIPI_SYST_FUNC_EXIT_LOC32 +#define MIPI_SYST_FUNC_EXIT_LOC32(svh, sev, file) +#endif +#ifndef MIPI_SYST_ASSERT +#define MIPI_SYST_ASSERT(svh, sev, cond) +#endif +#ifndef MIPI_SYST_ASSERT_LOC16 +#define MIPI_SYST_ASSERT_LOC16(svh, sev, file, cond) +#endif +#ifndef MIPI_SYST_ASSERT_LOC32 +#define MIPI_SYST_ASSERT_LOC32(svh, sev, file, cond) +#endif +#ifndef MIPI_SYST_ASSERT_LOCADDR +#define MIPI_SYST_ASSERT_LOCADDR(svh, sev, cond) +#endif + +#ifndef MIPI_SYST_CATALOG32_0 +#define MIPI_SYST_CATALOG32_0(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1 +#define MIPI_SYST_CATALOG32_1(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2 +#define MIPI_SYST_CATALOG32_2(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3 +#define MIPI_SYST_CATALOG32_3(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4 +#define MIPI_SYST_CATALOG32_4(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5 +#define MIPI_SYST_CATALOG32_5(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6 +#define MIPI_SYST_CATALOG32_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG32_0_LOCADDR +#define MIPI_SYST_CATALOG32_0_LOCADDR(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1_LOCADDR +#define MIPI_SYST_CATALOG32_1_LOCADDR(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2_LOCADDR +#define MIPI_SYST_CATALOG32_2_LOCADDR(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3_LOCADDR +#define MIPI_SYST_CATALOG32_3_LOCADDR(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4_LOCADDR +#define MIPI_SYST_CATALOG32_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5_LOCADDR +#define MIPI_SYST_CATALOG32_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6_LOCADDR +#define MIPI_SYST_CATALOG32_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG32_0_LOC16 +#define MIPI_SYST_CATALOG32_0_LOC16(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1_LOC16 +#define MIPI_SYST_CATALOG32_1_LOC16(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2_LOC16 +#define MIPI_SYST_CATALOG32_2_LOC16(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3_LOC16 +#define MIPI_SYST_CATALOG32_3_LOC16(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4_LOC16 +#define MIPI_SYST_CATALOG32_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5_LOC16 +#define MIPI_SYST_CATALOG32_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6_LOC16 +#define MIPI_SYST_CATALOG32_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG32_0_LOC32 +#define MIPI_SYST_CATALOG32_0_LOC32(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG32_1_LOC32 +#define MIPI_SYST_CATALOG32_1_LOC32(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG32_2_LOC32 +#define MIPI_SYST_CATALOG32_2_LOC32(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG32_3_LOC32 +#define MIPI_SYST_CATALOG32_3_LOC32(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG32_4_LOC32 +#define MIPI_SYST_CATALOG32_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG32_5_LOC32 +#define MIPI_SYST_CATALOG32_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG32_6_LOC32 +#define MIPI_SYST_CATALOG32_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0 +#define MIPI_SYST_CATALOG64_0(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1 +#define MIPI_SYST_CATALOG64_1(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2 +#define MIPI_SYST_CATALOG64_2(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3 +#define MIPI_SYST_CATALOG64_3(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4 +#define MIPI_SYST_CATALOG64_4(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5 +#define MIPI_SYST_CATALOG64_5(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6 +#define MIPI_SYST_CATALOG64_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0_LOCADDR +#define MIPI_SYST_CATALOG64_0_LOCADDR(svh, sev, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1_LOCADDR +#define MIPI_SYST_CATALOG64_1_LOCADDR(svh, sev, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2_LOCADDR +#define MIPI_SYST_CATALOG64_2_LOCADDR(svh, sev, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3_LOCADDR +#define MIPI_SYST_CATALOG64_3_LOCADDR(svh, sev, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4_LOCADDR +#define MIPI_SYST_CATALOG64_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5_LOCADDR +#define MIPI_SYST_CATALOG64_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6_LOCADDR +#define MIPI_SYST_CATALOG64_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0_LOC16 +#define MIPI_SYST_CATALOG64_0_LOC16(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1_LOC16 +#define MIPI_SYST_CATALOG64_1_LOC16(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2_LOC16 +#define MIPI_SYST_CATALOG64_2_LOC16(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3_LOC16 +#define MIPI_SYST_CATALOG64_3_LOC16(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4_LOC16 +#define MIPI_SYST_CATALOG64_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5_LOC16 +#define MIPI_SYST_CATALOG64_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6_LOC16 +#define MIPI_SYST_CATALOG64_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CATALOG64_0_LOC32 +#define MIPI_SYST_CATALOG64_0_LOC32(svh, sev, f, id) +#endif +#ifndef MIPI_SYST_CATALOG64_1_LOC32 +#define MIPI_SYST_CATALOG64_1_LOC32(svh, sev, f, id, p1) +#endif +#ifndef MIPI_SYST_CATALOG64_2_LOC32 +#define MIPI_SYST_CATALOG64_2_LOC32(svh, sev, f, id, p1, p2) +#endif +#ifndef MIPI_SYST_CATALOG64_3_LOC32 +#define MIPI_SYST_CATALOG64_3_LOC32(svh, sev, f, id, p1, p2, p3) +#endif +#ifndef MIPI_SYST_CATALOG64_4_LOC32 +#define MIPI_SYST_CATALOG64_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#endif +#ifndef MIPI_SYST_CATALOG64_5_LOC32 +#define MIPI_SYST_CATALOG64_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#endif +#ifndef MIPI_SYST_CATALOG64_6_LOC32 +#define MIPI_SYST_CATALOG64_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#endif + +#ifndef MIPI_SYST_CLOCK_SYNC +#define MIPI_SYST_CLOCK_SYNC(h,c,f) +#endif + +#ifndef MIPI_SYST_PRINTF +#define MIPI_SYST_PRINTF(...) +#endif +#ifndef MIPI_SYST_PRINTF_LOC16 +#define MIPI_SYST_PRINTF_LOC16(...) +#endif +#ifndef MIPI_SYST_PRINTF_LOC32 +#define MIPI_SYST_PRINTF_LOC32(...) +#endif +#ifndef MIPI_SYST_PRINTF_LOCADDR +#define MIPI_SYST_PRINTF_LOCADDR(...) +#endif + +#ifndef MIPI_SYST_CATPRINTF64 +#define MIPI_SYST_CATPRINTF64(...) +#endif +#ifndef MIPI_SYST_CATPRINTF64_LOC16 +#define MIPI_SYST_CATPRINTF64_LOC16(...) +#endif +#ifndef MIPI_SYST_CATPRINTF64_LOC32 +#define MMIPI_SYST_CATPRINTF64_LOC32(...) +#endif +#ifndef MIPI_SYST_CATPRINTF64_LOCADDR +#define MIPI_SYST_CATPRINTF64_LOCADDR(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32 +#define MIPI_SYST_CATPRINTF32(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32_LOC16 +#define MIPI_SYST_CATPRINTF32_LOC16(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32_LOC32 +#define MMIPI_SYST_CATPRINTF32_LOC32(...) +#endif +#ifndef MIPI_SYST_CATPRINTF32_LOCADDR +#define MIPI_SYST_CATPRINTF32_LOCADDR(...) +#endif + +/* Map CATPRINTF calls to their corresponding catalog APIs + * by dropping the format string parameter. + */ + /** + * @defgroup PrintfApi Printf style catalog Message Macros + * @ingroup ApiSets + * + * Printf style catalog message instrumentation API wrappers. + * The `MIPI_SYST_CATPRINTF{ID-WIDTH}_{PARAMETER-COUNT}` + * macros call their corresponding catalog API macro by dropping + * the format parameter. The API is intended to have + * printf style instrumentation inside the sources, but drop the format + * string during compilation and replace it with a catalog API call + * instead. Source scanning tools are used to extract the format strings + * from sources into catalog dictionary files. The dictionary files can + * then be used to reconstruct the printf formatting during trace decode + * time. This saves both space and execution time in the resulting + * application, and bandwidth over a trace link. + * + * This API set is enabled or disabled by the + * #MIPI_SYST_PCFG_ENABLE_CATID64_API and/or #MIPI_SYST_PCFG_ENABLE_CATID32_API + * platform feature defines. + * @{ + */ +#define MIPI_SYST_CATPRINTF32_0(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG32_0(svh, sev, id) +#define MIPI_SYST_CATPRINTF32_1(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF32_2(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF32_0_LOCADDR(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG32_0_LOCADDR(svh, sev, id) +#define MIPI_SYST_CATPRINTF32_1_LOCADDR(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1_LOCADDR(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF32_2_LOCADDR(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2_LOCADDR(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3_LOCADDR(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3_LOCADDR(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF32_0_LOC16(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG32_0_LOC16(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF32_1_LOC16(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1_LOC16(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF32_2_LOC16(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2_LOC16(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3_LOC16(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3_LOC16(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF32_0_LOC32(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG32_0_LOC32(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF32_1_LOC32(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG32_1_LOC32(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF32_2_LOC32(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG32_2_LOC32(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF32_3_LOC32(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG32_3_LOC32(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF32_4_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG32_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF32_5_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG32_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF32_6_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG32_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG64_0(svh, sev, id) +#define MIPI_SYST_CATPRINTF64_1(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF64_2(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0_LOCADDR(svh, sev, id, fmt)\ + MIPI_SYST_CATALOG64_0_LOCADDR(svh, sev, id) +#define MIPI_SYST_CATPRINTF64_1_LOCADDR(svh, sev, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1_LOCADDR(svh, sev, id, p1) +#define MIPI_SYST_CATPRINTF64_2_LOCADDR(svh, sev, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2_LOCADDR(svh, sev, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3_LOCADDR(svh, sev, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3_LOCADDR(svh, sev, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4_LOCADDR(svh, sev, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6_LOCADDR(svh, sev, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6_LOCADDR(svh, sev, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0_LOC16(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG64_0_LOC16(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF64_1_LOC16(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1_LOC16(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF64_2_LOC16(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2_LOC16(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3_LOC16(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3_LOC16(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4_LOC16(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6_LOC16(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6_LOC16(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +#define MIPI_SYST_CATPRINTF64_0_LOC32(svh, sev, f, id, fmt)\ + MIPI_SYST_CATALOG64_0_LOC32(svh, sev, f, id) +#define MIPI_SYST_CATPRINTF64_1_LOC32(svh, sev, f, id, fmt, p1)\ + MIPI_SYST_CATALOG64_1_LOC32(svh, sev, f, id, p1) +#define MIPI_SYST_CATPRINTF64_2_LOC32(svh, sev, f, id, fmt, p1, p2)\ + MIPI_SYST_CATALOG64_2_LOC32(svh, sev, f, id, p1, p2) +#define MIPI_SYST_CATPRINTF64_3_LOC32(svh, sev, f, id, fmt, p1, p2, p3)\ + MIPI_SYST_CATALOG64_3_LOC32(svh, sev, f, id, p1, p2, p3) +#define MIPI_SYST_CATPRINTF64_4_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4)\ + MIPI_SYST_CATALOG64_4_LOC32(svh, sev, f, id, p1, p2, p3, p4) +#define MIPI_SYST_CATPRINTF64_5_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5)\ + MIPI_SYST_CATALOG64_5_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5) +#define MIPI_SYST_CATPRINTF64_6_LOC32(svh, sev, f, id, fmt, p1, p2, p3, p4, p5, p6)\ + MIPI_SYST_CATALOG64_6_LOC32(svh, sev, f, id, p1, p2, p3, p4, p5, p6) +/** @} */ + +#ifdef __cplusplus +} /* extern C */ +#endif +#endif diff --git a/library/include/mipi_syst/compiler.h b/library/include/mipi_syst/compiler.h new file mode 100644 index 0000000..822642e --- /dev/null +++ b/library/include/mipi_syst/compiler.h @@ -0,0 +1,193 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Compiler specific defines */ + +#ifndef MIPI_SYST_COMPILER_INCLUDED +#define MIPI_SYST_COMPILER_INCLUDED + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined(_WIN32) /* MSVC Compiler section */ + +/* basic integer types + */ +typedef __int8 mipi_syst_s8; +typedef __int16 mipi_syst_s16; +typedef __int32 mipi_syst_s32; +typedef __int64 mipi_syst_s64; + +typedef unsigned __int8 mipi_syst_u8; +typedef unsigned __int16 mipi_syst_u16; +typedef unsigned __int32 mipi_syst_u32; +typedef unsigned __int64 mipi_syst_u64; + +/* shared library import/export + */ +#if defined(MIPI_SYST_STATIC) +#define MIPI_SYST_EXPORT +#define MIPI_SYST_EXPORT +#else +#if defined(MIPI_SYST_EXPORTS) +#define MIPI_SYST_EXPORT __declspec(dllexport) +#else +#define MIPI_SYST_EXPORT __declspec(dllimport) +#endif +#endif + +#define MIPI_SYST_CALLCONV __stdcall + +/* Caution: Windows doesn't support attribute based shared library + * life time functions. Add these calls into a dllmain routine + * instead. + */ +#define MIPI_SYST_SHAREDLIB_CONSTRUCTOR +#define MIPI_SYST_SHAREDLIB_DESTRUCTOR + +#define MIPI_SYST_FUNCTION_NAME __FUNCTION__ +#define MIPI_SYST_LINE __LINE__ +#define MIPI_SYST_FILE __FILE__ + +#if defined(NDEBUG) +#define _MIPI_SYST_OPTIMIZER_ON +#endif + +#define MIPI_SYST_CC_INLINE __inline + +/* Macros for byte swapping to little endian + * + * Assume this compiler is always little endian + */ +#define MIPI_SYST_HTOLE16(v) (v) +#define MIPI_SYST_HTOLE32(v) (v) +#define MIPI_SYST_HTOLE64(v) (v) + +/* HW CRC32C support ? */ +#if defined(MIPI_SYST_CRC_INTRINSIC_ON) +#define MIPI_SYST_CRC_INTRINSIC + +#include +#define _MIPI_SYST_CPU_CRC8(crc, v) _mm_crc32_u8((crc), (v)) +#define _MIPI_SYST_CPU_CRC16(crc, v) _mm_crc32_u16((crc), (v)) +#define _MIPI_SYST_CPU_CRC32(crc, v) _mm_crc32_u32((crc), (v)) +#if defined(_WIN64) +#define _MIPI_SYST_CPU_CRC64(crc, v) (mipi_syst_u32)_mm_crc32_u64((crc), (v)) +#else +#define _MIPI_SYST_CPU_CRC64(crc, v) \ + _mm_crc32_u32(\ + _mm_crc32_u32((crc), (mipi_syst_u32)(v)), \ + ((mipi_syst_u32)((v)>> 32))\ + ) +#endif +#endif + +#elif defined(__GNUC__) /* GNU-C Compiler section */ + +/* basic integer types + */ +typedef char mipi_syst_s8; +typedef short mipi_syst_s16; +typedef int mipi_syst_s32; +typedef long long mipi_syst_s64; + +typedef unsigned char mipi_syst_u8; +typedef unsigned short mipi_syst_u16; +typedef unsigned int mipi_syst_u32; +typedef unsigned long long mipi_syst_u64; + +/* shared library related settings + */ +#define MIPI_SYST_EXPORT +#define MIPI_SYST_CALLCONV + +#define MIPI_SYST_SHAREDLIB_CONSTRUCTOR __attribute__((constructor)) +#define MIPI_SYST_SHAREDLIB_DESTRUCTOR __attribute__((destructor)) + +#define MIPI_SYST_FUNCTION_NAME __PRETTY_FUNCTION__ +#define MIPI_SYST_LINE __LINE__ +#define MIPI_SYST_FILE __FILE__ +#define MIPI_SYST_CC_INLINE inline + +/* Macros for byte swapping to little endian + */ +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define MIPI_SYST_BIG_ENDIAN + +#define MIPI_SYST_HTOLE16(v) \ + ((((mipi_syst_u16)(v))>>8)|((((mipi_syst_u16)(v))&0xFF)<<8)) +#define MIPI_SYST_HTOLE32(v) \ + ((mipi_syst_u32)__builtin_bswap32((mipi_syst_u32)(v))) +#define MIPI_SYST_HTOLE64(v) \ + ((mipi_syst_u64)__builtin_bswap64((mipi_syst_u64)(v))) +#else +#define MIPI_SYST_HTOLE16(v) (v) +#define MIPI_SYST_HTOLE32(v) (v) +#define MIPI_SYST_HTOLE64(v) (v) +#endif + +#if defined(__OPTIMIZE__) +#define _MIPI_SYST_OPTIMIZER_ON +#endif + +/* HW CRC32C support ? */ +#if defined(MIPI_SYST_CRC_INTRINSIC_ON) +#define MIPI_SYST_CRC_INTRINSIC + +#define _MIPI_SYST_CPU_CRC8(crc, v) __builtin_ia32_crc32qi((crc), (v)) +#define _MIPI_SYST_CPU_CRC16(crc, v) __builtin_ia32_crc32hi((crc), (v)) +#define _MIPI_SYST_CPU_CRC32(crc, v) __builtin_ia32_crc32si((crc), (v)) +#if defined(_WIN64) || defined(__x86_64__) || defined (__LP64__) +#define _MIPI_SYST_CPU_CRC64(crc, v) (mipi_syst_u32)__builtin_ia32_crc32di((crc), (v)) +#else +#define _MIPI_SYST_CPU_CRC64(crc, v) \ + __builtin_ia32_crc32si (\ + __builtin_ia32_crc32si((crc), (mipi_syst_u32)(v)), \ + ((mipi_syst_u32)((v)>> 32))\ + ) +#endif +#endif +#else +#error unknown compiler, copy and adapt one of the sections above +#endif + +#ifdef __cplusplus +} /* extern C */ +#endif +#endif diff --git a/library/include/mipi_syst/crc32.h b/library/include/mipi_syst/crc32.h new file mode 100644 index 0000000..108de54 --- /dev/null +++ b/library/include/mipi_syst/crc32.h @@ -0,0 +1,138 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Defines for CRC32C computation */ + +#ifndef MIPI_SYST_CRC32_INCLUDED +#define MIPI_SYST_CRC32_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + + +#if !defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + +#define MIPI_SYST_CRC32_INIT(v) +#define MIPI_SYST_CRC32_GET(v) + +#define MIPI_SYST_CRC32_U8(crc, v) +#define MIPI_SYST_CRC32_U16(crc, v) +#define MIPI_SYST_CRC32_U32(crc, v) +#define MIPI_SYST_CRC32_U64(crc, v) + +#else + +extern const mipi_syst_u32 mipi_syst_crc_table[256]; + +#define MIPI_SYST_CRC32_INIT(v) ((v) ^ 0xFFFFFFFF) +#define MIPI_SYST_CRC32_GET(v) ((v) ^ 0xFFFFFFFF) + +#define MIPI_SYST_CRC32_U8(crc, v) { crc = mipi_syst_crc32_8((crc), (v)); } +#define MIPI_SYST_CRC32_U16(crc, v) { crc = mipi_syst_crc32_16((crc), (v)); } +#define MIPI_SYST_CRC32_U32(crc, v) { crc = mipi_syst_crc32_32((crc), (v)); } +#define MIPI_SYST_CRC32_U64(crc, v) { crc = mipi_syst_crc32_64((crc), (v)); } + +#if !defined(MIPI_SYST_PCFG_ENABLE_INLINE) + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_8(mipi_syst_u32 crc, mipi_syst_u8 b); +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_16(mipi_syst_u32 crc, mipi_syst_u16 hw); +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_32(mipi_syst_u32 crc, mipi_syst_u32 hw); +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_64(mipi_syst_u32 crc, mipi_syst_u64 hw); + +#else + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_8(mipi_syst_u32 crc, mipi_syst_u8 b) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC8(crc, b); +#else + return mipi_syst_crc_table[((int) crc ^ b) & 0xff] ^ (crc >> 8); +#endif +} + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_16(mipi_syst_u32 crc, mipi_syst_u16 s) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC16(crc, s); +#else + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) s); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (s >> 8)); + return crc; +#endif +} + + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_32(mipi_syst_u32 crc, mipi_syst_u32 w) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC32(crc, w); +#else + + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) w); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (w >> 8)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (w >> 16)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (w >> 24)); + return crc; +#endif +} + +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_crc32_64(mipi_syst_u32 crc, mipi_syst_u64 l) +{ +#if (defined(MIPI_SYST_CRC_INTRINSIC)) + return _MIPI_SYST_CPU_CRC64(crc, l); +#else + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) l); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 8)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 16)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 24)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 32)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 40)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 48)); + crc = mipi_syst_crc32_8(crc, (mipi_syst_u8) (l >> 56)); + return crc; +#endif +} +#endif +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) */ + +#ifdef __cplusplus +} /* extern C */ +#endif + +#endif diff --git a/library/include/mipi_syst/inline.h b/library/include/mipi_syst/inline.h new file mode 100644 index 0000000..65996e7 --- /dev/null +++ b/library/include/mipi_syst/inline.h @@ -0,0 +1,245 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Instrumentation API inline code definitions */ + +#ifndef MIPI_SYST_INLINE_INCLUDED +#define MIPI_SYST_INLINE_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + +/** + * Update File Location in syst handle + * @param h syst handle pointer + * @param f file id (16 bit) + * @param l line number in file (16 bit) + */ +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location32(struct mipi_syst_handle* h, mipi_syst_u16 f, mipi_syst_u16 l) +{ + if (h) { + h->systh_location.el_format = 0; + h->systh_location.el_u.loc32.etls_source_location.etls_fileID = f; + h->systh_location.el_u.loc32.etls_source_location.etls_lineNo = l; + } + + return &h->systh_location; +} +/** + * Update File Location in syst handle + * @param h syst handle pointer + * @param f file id (32 bit) + * @param l line number in file (32 bit) + */ +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_file_location64(struct mipi_syst_handle* h, mipi_syst_u32 f, mipi_syst_u32 l) +{ + if (h) { + h->systh_location.el_format = 1; + h->systh_location.el_u.loc64.etls_source_location.etls_fileID = f; + h->systh_location.el_u.loc64.etls_source_location.etls_lineNo = l; + } + + return &h->systh_location; +} + +/** + * Update address Location in syst handle + * @param h syst handle pointer + * @param p address at instrumentation point + */ +MIPI_SYST_INLINE struct mipi_syst_msglocation* MIPI_SYST_CALLCONV +mipi_syst_make_address_location(struct mipi_syst_handle* h, void *p) +{ + if (h) { +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + + h->systh_location.el_format = 3; + h->systh_location.el_u.loc64.etls_code_location = (mipi_syst_u64) p; +#else + h->systh_location.el_format = 2; + h->systh_location.el_u.loc32.etls_code_location = (mipi_syst_u32) p; +#endif + } + return &h->systh_location; +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) */ + +/** + * Setup handle for 0 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param0(struct mipi_syst_handle* h) +{ + if (h) + h->systh_param_count = 0; +} +/** + * Setup handle for 1 parameter passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param1(struct mipi_syst_handle* h, + mipi_syst_u32 p1) +{ + if (h) { + h->systh_param_count = 1; + h->systh_param[0] = p1; + } +} + +/** + * Setup handle for 2 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param2(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2) +{ + if (h) { + h->systh_param_count = 2; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + } +} + +/** + * Setup handle for 3 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param3(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3) +{ + if (h) { + h->systh_param_count = 3; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + } +} + +/** + * Setup handle for 4 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param4(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4) +{ + if (h) { + h->systh_param_count = 4; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + h->systh_param[3] = p4; + } +} + +/** + * Setup handle for 5 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param5(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5) +{ + if (h) { + h->systh_param_count = 5; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + h->systh_param[3] = p4; + h->systh_param[4] = p5; + } +} + +/** + * Setup handle for 6 parameters passed to catid message. + */ +MIPI_SYST_INLINE void MIPI_SYST_CALLCONV mipi_syst_make_param6(struct mipi_syst_handle* h, + mipi_syst_u32 p1, + mipi_syst_u32 p2, + mipi_syst_u32 p3, + mipi_syst_u32 p4, + mipi_syst_u32 p5, + mipi_syst_u32 p6) +{ + if (h) { + h->systh_param_count = 6; + h->systh_param[0] = p1; + h->systh_param[1] = p2; + h->systh_param[2] = p3; + h->systh_param[3] = p4; + h->systh_param[4] = p5; + h->systh_param[5] = p6; + } +} + +/** + * Runtime computation of hash values for catalog message IDs. + * This function is used in debug builds to avoid a code explosion + * by the preprocessor method ( @see mipi_syst_hash_x65599 ). The + * preprocesssor methods does compute this value at compile time only + * if const expression optimisations are enabled. + */ +MIPI_SYST_INLINE mipi_syst_u32 mipi_syst_hash_x65599( + const char * p, mipi_syst_u32 length) +{ + mipi_syst_u32 hash; + mipi_syst_u8 c; + hash = 0; + + p += (length > 0x3F) ? (length-0x40): 0; + + while (0 != (c = *p++)) + { + hash = hash * 65599U + c; + } + + return hash; +} +#ifdef __cplusplus +} /* extern C */ +#endif + +#endif diff --git a/library/include/mipi_syst/message.h b/library/include/mipi_syst/message.h new file mode 100644 index 0000000..285512b --- /dev/null +++ b/library/include/mipi_syst/message.h @@ -0,0 +1,159 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Internal message storage buffering */ + +#ifndef MIPI_syst_msg_INCLUDED +#define MIPI_syst_msg_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Catalog ID container + */ +union mipi_syst_catid { + mipi_syst_u32 sci_32; + mipi_syst_u64 sci_64; +} ; + +/** + * SyS-T message descriptor + * + * This structure stores a SyS-T message in "logical" memory format. + * Logical means that all optional fields are present but not necessarily + * used. Variable length payloads are addressed through a pointer and + * are not copied into the structure. + */ + struct mipi_syst_msgdsc { + struct mipi_syst_msg_tag ed_tag; + /**< 32-bit message tag (mandatory) */ +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + struct mipi_syst_guid ed_guid; /**< origin GUID (optional) */ +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + struct mipi_syst_msglocation ed_loc; + /**< message source location (optional) */ +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + mipi_syst_u64 ed_ts; /**< protocol embedded time stamp */ +#endif + +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) + mipi_syst_u16 ed_len; /**< variable payload length (optional) */ +#endif + + union { + struct { + mipi_syst_u64 id; + const void *text; + } data_version; + + struct { + union mipi_syst_catid id; + mipi_syst_u32 *param; + } data_catid; + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + mipi_syst_u64 data_clock[2]; +#endif + const void *data_var; /**< variable length payload */ + } ed_pld; + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + mipi_syst_u32 ed_chk; /**< message checksum (optional) */ +#endif +}; + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) +#define MIPI_SYST_EVDSC_MEMBER_OFF(m)\ + ((mipi_syst_u16)(mipi_syst_u64)&(((struct mipi_syst_msgdsc*)0)->m)) +#else +#define MIPI_SYST_EVDSC_MEMBER_OFF(m)\ + ((mipi_syst_u16)(mipi_syst_u32)&(((struct mipi_syst_msgdsc*)0)->m)) +#endif + +/** + * message scatter write operations + */ +enum u_syst_scatter_op { + MIPI_SYST_SCATTER_OP_SKIP = 0x00, + /**< skip sso_length bytes */ + + MIPI_SYST_SCATTER_OP_8BIT = 0x01, + /**< write sso_length times 8 bit */ + MIPI_SYST_SCATTER_OP_16BIT = 0x02, + /**< write sso_length times 16 bit */ + MIPI_SYST_SCATTER_OP_32BIT = 0x04, + /**< write sso_length times 32 bit */ + MIPI_SYST_SCATTER_OP_64BIT = 0x08, + /**< write sso_length times 64 bit */ + + MIPI_SYST_SCATTER_OP_BLOB = 0x10, + /**< write sso_length bytes that are + * accessed through a pointer */ + MIPI_SYST_SCATTER_OP_END = 0xFF + /**< end of scatter writer program */ +}; + +/** + * message scatter write instruction definition + */ +struct mipi_syst_scatter_prog { + mipi_syst_u8 sso_opcode; /**< scatter write operation + * @see u_syst_scatter_op */ + mipi_syst_u8 sso_offset; /**< data offset in message descriptor */ + mipi_syst_u16 sso_length; + /**< repeat count for sso_opcode */ +}; + +#define MIPI_SYST_SCATTER_PROG_LEN 10 /**< maximum needed scatter prog size */ + +#if defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) +/* default scatter write routine */ +extern void mipi_syst_scatter_write(struct mipi_syst_handle* systh, + struct mipi_syst_scatter_prog* scatterprog, + const void *pdesc); +#endif + +#ifdef __cplusplus +} /* extern C */ +#endif +#endif diff --git a/library/platform/example/include/mipi_syst/platform.h b/library/platform/example/include/mipi_syst/platform.h new file mode 100644 index 0000000..701f3a2 --- /dev/null +++ b/library/platform/example/include/mipi_syst/platform.h @@ -0,0 +1,188 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Example platform specific extensions + * This "platform" shows how to implement a SyS-T platform modules. + * This platform simple prints its IO actions to stdout. + */ + +#ifndef MIPI_SYST_PLATFORM_INCLUDED +#define MIPI_SYST_PLATFORM_INCLUDED + +/* Uncomment to turn code in-lining off. + * + * #undef MIPI_SYST_PCFG_ENABLE_INLINE + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** +* Platform specific SyS-T global state extension +* +* The contents of this structure can be freely defined to +* match platform specific data needs. It can later be +* accessed through the mipi_syst_header systh_platform member. +* +* This platform example puts low-level output function pointers +* here. Real implementations may have them "inlined" for performance +* reasons. +*/ +struct mipi_syst_platform_state { + void (*write_d32ts)(struct mipi_syst_handle * systh, mipi_syst_u32 v); + void (*write_d32mts)(struct mipi_syst_handle * systh, mipi_syst_u32 v); + void (*write_d64mts)(struct mipi_syst_handle * systh, mipi_syst_u64 v); + void (*write_d8)(struct mipi_syst_handle * systh, mipi_syst_u8 v); + void (*write_d16)(struct mipi_syst_handle * systh, mipi_syst_u16 v); + void (*write_d32)(struct mipi_syst_handle * systh, mipi_syst_u32 v); +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + void (*write_d64)(struct mipi_syst_handle * systh, mipi_syst_u64 v); +#endif + void (*write_flag)(struct mipi_syst_handle * systh); + + void * sph_init_data; +}; + +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_init(struct mipi_syst_header *, const void *); +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_destroy(struct mipi_syst_header * systh); + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +/* This example uses UNIX epoch time in micro second resolution +* as own clock. +*/ +#define MIPI_SYST_PLATFORM_CLOCK() mipi_syst_get_epoch_us() +#define MIPI_SYST_PLATFORM_FREQ() 1000000 + +MIPI_SYST_EXPORT mipi_syst_u64 MIPI_SYST_CALLCONV mipi_syst_get_epoch_us(void); + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + +/** +* Platform specific SyS-T handle state extension +* +* The contents of this structure can be freely defined to +* match platform specific data needs. It can later be +* accessed through the syst_handles systh_platform member. +* +* @see MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA struct mipi_syst_handle +*/ +struct mipi_syst_platform_handle { + mipi_syst_u32 sph_io_count; /**< cnt io's, used for pretty printing */ + mipi_syst_u32 sph_raw_count; /**< number of raw bytes in sph_raw */ + mipi_syst_u8 sph_raw[2 * 64 * 1024]; /**< buffer for printing */ +}; + + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +/** +* Map heap memory allocation to platform malloc() implementation. +* +* This function is used for handle allocations if heap usage +* is supported by the platform. +* +* @param s number of bytes to allocate +* @see MIPI_SYST_HEAP_FREE +*/ +#define MIPI_SYST_HEAP_MALLOC(s) mipi_syst_platform_alloc(s) + +/** +* Map heap memory free function to platform free() implementation. +* +* This function is used for handle release if heap usage +* is supported by the platform. +* +* @param p pointer previously returned from MIPI_SYST_HEAP_MALLOC or NULL. +* @see MIPI_SYST_HEAP_MALLOC +*/ +#define MIPI_SYST_HEAP_FREE(p) mipi_syst_platform_free(p) + +extern MIPI_SYST_EXPORT void * MIPI_SYST_CALLCONV mipi_syst_platform_alloc(size_t s); +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_platform_free(void *); +#endif + +/* IO output routine mapping +* Call the function pointers in the global state +*/ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) +#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d32ts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d32mts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D64MTS(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d64mts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D8(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d8((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D16(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d16((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D32(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d32((syst_handle), (data)) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#define MIPI_SYST_OUTPUT_D64(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d64((syst_handle), (data)) +#endif +#define MIPI_SYST_OUTPUT_FLAG(syst_handle) \ + (syst_handle)->systh_header->systh_platform.write_flag((syst_handle)) +#else +#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D64MTS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D8(syst_handle, data) +#define MIPI_SYST_OUTPUT_D16(syst_handle, data) +#define MIPI_SYST_OUTPUT_D32(syst_handle, data) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#define MIPI_SYST_OUTPUT_D64(syst_handle, data) +#endif +#define MIPI_SYST_OUTPUT_FLAG(syst_handle) +#endif // MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA + +#endif + +#if defined(MIPI_SYST_UNIT_TEST) +#define MIPI_SYST_UNIT_TEST_EXAMPLE +#endif + +#ifdef __cplusplus +} /* extern C */ +#endif diff --git a/library/platform/example/src/mipi_syst_platform.c b/library/platform/example/src/mipi_syst_platform.c new file mode 100644 index 0000000..223dbdd --- /dev/null +++ b/library/platform/example/src/mipi_syst_platform.c @@ -0,0 +1,404 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#if defined(_WIN32) +#include +#else +#include +#endif + +#include "mipi_syst.h" + +/* "driver" data output routines */ +static void write_d32mts(struct mipi_syst_handle* systh, mipi_syst_u32 v); +static void write_d64mts(struct mipi_syst_handle* systh, mipi_syst_u64 v); +static void write_d32ts(struct mipi_syst_handle* systh, mipi_syst_u32 v); +static void write_d8(struct mipi_syst_handle* systh, mipi_syst_u8 v); +static void write_d16(struct mipi_syst_handle* systh, mipi_syst_u16 v); +static void write_d32(struct mipi_syst_handle* systh, mipi_syst_u32 v); +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +static void write_d64(struct mipi_syst_handle* systh, mipi_syst_u64 vp); +#endif +static void write_flag(struct mipi_syst_handle* systh); + +/** + * Platform specific SyS-T handle initialization hook function + * + * @param systh pointer to the new SyS-T handle structure + */ +static void platform_handle_init(struct mipi_syst_handle* systh) +{ +#if !defined(MIPI_SYST_UNIT_TEST) + printf( + " in SyS-T platform handle init hook: systh = %p\n\n", + systh + ); +#endif + + /* Initialize platform specific data in global state + * This example just stores the platform_data, a real implementation + * would put data into the handle structure that enables the output + * routines to execute efficiently (pointer for MMIO for example). + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + +#endif +} + +/** + * Platform specific SyS-T handle initialization hook function + * + * @param systh pointer to the new SyS-T handle structure + */ +static void platform_handle_release(struct mipi_syst_handle* systh) +{ +#if !defined(MIPI_SYST_UNIT_TEST) && defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + printf( + " in SyS-T platform handle release hook:systh = %p\n", + systh + ); +#endif + + /* Release any handle specific data or resources here.*/ +} + +/** + * Platform specific global state initialization hook function + * + * @param systh pointer to the new SyS-T handle structure + * @param platform_data user defined data for the init function. + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_platform_init(struct mipi_syst_header* systh, const void * platform_data) +{ +#if !defined(MIPI_SYST_UNIT_TEST) + printf( + " in SyS-T platform init hook: \"mipi_syst_platform_state_init()\"\n" + " systh = %p, platform_data = %p\n", + systh, + platform_data + ); +#endif + + /* Set handle init hook that performs per SyS-T handle initialization + * and destruction + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + systh->systh_inith = platform_handle_init; + systh->systh_releaseh = platform_handle_release; +#endif + + /* Initialize platform specific data in global state + * This platform example puts its low level output function + * pointers here. A real implementation may have these "inlined" + * for performance reasons. + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) + systh->systh_platform.write_d32ts = write_d32ts; + systh->systh_platform.write_d32mts = write_d32mts; + systh->systh_platform.write_d64mts = write_d64mts; + systh->systh_platform.write_d8 = write_d8; + systh->systh_platform.write_d16 = write_d16; + systh->systh_platform.write_d32 = write_d32; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + systh->systh_platform.write_d64 = write_d64; +#endif + systh->systh_platform.write_flag = write_flag; +#endif +} + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_platform_destroy(struct mipi_syst_header* systh) +{ + (void)systh; +} + +#if !defined(MIPI_SYST_STATIC) +/** + * This example platform uses SyS-T as a shared library inside an + * application. The platform init hook is called during a shared library + * constructor call. + */ +static MIPI_SYST_SHAREDLIB_CONSTRUCTOR void shared_library_init() +{ + /* Initialize SyS-T infrastructure + * This must be done once at platform startup. + * The parameters are the platform specific initialization function and + * the data that gets passed to it. + */ + printf("calling MIPI_SYST_INIT() from platform code \n"); + MIPI_SYST_INIT(mipi_syst_platform_init, (void*)42); +} + +/** + * This example platform uses SyS-T as a shared library inside an + * application. The platform destroy hook is called during a shared library + * destructor call. + */ +static MIPI_SYST_SHAREDLIB_DESTRUCTOR void shared_library_exit() +{ + /* run platform shutdown code */ + MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy); + printf("\nexecuted MIPI_SYST_SHUTDOWN() from platform code \n"); +} + +#if defined(_WIN32) +/** + * Windows DLL main routine, needed to run the global initialization and + * destruction handlers. + */ +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) +{ + (void)lpReserved; + (void)hinstDLL; + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + shared_library_init(); + break; + case DLL_PROCESS_DETACH: + shared_library_exit(); + break; + } + return TRUE; +} +#endif +#endif /* !defined(MIPI_SYST_STATIC) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + +/* Save a message bytes for printing the raw message when completed. + */ +static void append_raw( + struct mipi_syst_handle* systh, + const void * p, + int n) +{ + int i; + +#if defined(MIPI_SYST_BIG_ENDIAN) + for (i = n-1; i >= 0; --i) { +#else + for (i = 0; i < n; ++i) { +#endif + mipi_syst_u32 index = systh->systh_platform.sph_raw_count++; + if (index < sizeof(systh->systh_platform.sph_raw)) { + systh->systh_platform.sph_raw[index] = + ((const mipi_syst_u8*)p)[i]; + } + else { + fprintf(stderr, "Internal Error: Record buffer overflow\n"); + break; + } + } +} +#endif + +/* dump contents for raw message bytes + */ +static void write_rawdata(struct mipi_syst_handle* systh) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + static char valToHex[] = "0123456789ABCDEF"; + const mipi_syst_u8 *p; + + printf("SYS-T RAW DATA: "); + for (p = systh->systh_platform.sph_raw; + systh->systh_platform.sph_raw_count; + ++p, --systh->systh_platform.sph_raw_count) + { + putc(valToHex[(*p) >> 0x4], stdout); + putc(valToHex[(*p) & 0xF], stdout); + } +#endif +} + +/* Dummy driver output routines that just print their operation. + */ +static void write_d32mts(struct mipi_syst_handle* systh, mipi_syst_u32 v) +{ + /* d32mts == Short SyS-T header, reset io count + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + systh->systh_platform.sph_io_count = 0; + systh->systh_platform.sph_raw_count = 0; + + + printf("STP Protocol Output:\n"); + + printf(" %2d %08x\n", + systh->systh_platform.sph_io_count++, v); + + append_raw(systh, &v, sizeof(v)); + write_rawdata(systh); + printf("\n\n"); +#endif +} +static void write_d64mts(struct mipi_syst_handle* systh, mipi_syst_u64 v) +{ + /* d64mts == 64-Bit Short SyS-T header, reset io count + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + systh->systh_platform.sph_io_count = 0; + + printf("STP Protocol Output:\n"); + + printf(" %2d %08llx\n", + systh->systh_platform.sph_io_count++, v); + + append_raw(systh, &v, sizeof(v)); + write_rawdata(systh); + printf("\n\n"); + +#endif +} + +static void write_d32ts(struct mipi_syst_handle* systh, mipi_syst_u32 v) +{ + /* d32ts == SyS-T header, reset io count + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + systh->systh_platform.sph_io_count = 0; + + printf("STP Protocol Output:\n"); + + printf(" %2d %08x\n", + systh->systh_platform.sph_io_count++, v); + + append_raw(systh, &v, sizeof(v)); +#endif +} +static void write_d8(struct mipi_syst_handle* systh, mipi_syst_u8 v) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + printf(" %2d %02x\n", + systh->systh_platform.sph_io_count++, v); + + append_raw(systh, &v, sizeof(v)); +#endif +} + +static void write_d16(struct mipi_syst_handle* systh, mipi_syst_u16 v) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + printf(" %2d %04x\n", + systh->systh_platform.sph_io_count++, v); + + append_raw(systh, &v, sizeof(v)); +#endif +} + +static void write_d32(struct mipi_syst_handle* systh, mipi_syst_u32 v) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + printf(" %2d %08x\n", + systh->systh_platform.sph_io_count++, v); + + append_raw(systh, &v, sizeof(v)); +#endif +} + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +static void write_d64(struct mipi_syst_handle* systh, mipi_syst_u64 v) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + printf(" %2d %08x%08x\n", + systh->systh_platform.sph_io_count++, +#if defined(MIPI_SYST_BIG_ENDIAN) + (mipi_syst_u32)v, (mipi_syst_u32)(v >> 32); +#else + (mipi_syst_u32)(v >> 32), (mipi_syst_u32)v); +#endif +#endif + append_raw(systh, &v, sizeof(v)); +} +#endif + +static void write_flag(struct mipi_syst_handle* systh) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + printf(" %2d \n", systh->systh_platform.sph_io_count++); + + write_rawdata(systh); + printf("\n\n"); + +#endif +} + +MIPI_SYST_EXPORT +mipi_syst_u64 MIPI_SYST_CALLCONV mipi_syst_get_epoch_us() +{ + mipi_syst_u64 epoch; +#if defined(MIPI_SYST_UNIT_TEST) + epoch = 0x12345678aabbccddull; +#elif defined(_WIN32) + // Windows does not offer epoch time API directly. + // Search for the 116444... constant below on + // MSDN for an explanation of the computation: + // + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + epoch = ft.dwHighDateTime; + epoch = ((epoch << 32) | ft.dwLowDateTime) / 10 - 11644473600000000ULL; + +#else + struct timeval tv; + + gettimeofday(&tv, NULL); + epoch = tv.tv_sec; + epoch *= 1000000; + epoch += tv.tv_usec; +#endif + return epoch; +} + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +MIPI_SYST_EXPORT +void * MIPI_SYST_CALLCONV mipi_syst_platform_alloc(size_t s) +{ + return malloc(s); +} + +MIPI_SYST_EXPORT +void MIPI_SYST_CALLCONV mipi_syst_platform_free(void * p) +{ + free(p); +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) */ \ No newline at end of file diff --git a/library/platform/mipi_stp_sim/include/mipi_syst/platform.h b/library/platform/mipi_stp_sim/include/mipi_syst/platform.h new file mode 100644 index 0000000..aab1c72 --- /dev/null +++ b/library/platform/mipi_stp_sim/include/mipi_syst/platform.h @@ -0,0 +1,156 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Example platform adaptation + * This "platform" shows how to implement a SyS-T library platform module + * to simulate MIPI STP data protocol generation for SyS-T messages. + */ +#ifndef MIPI_SYST_PLATFORM_INCLUDED +#define MIPI_SYST_PLATFORM_INCLUDED + + +/* Uncomment to turn code inlining off. + * + * #undef MIPI_SYST_PCFG_ENABLE_INLINE + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +#include +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + struct MipiStpWriter; + + struct mipi_syst_platform_state { + void (*write_d32ts)(struct mipi_syst_handle * systh, mipi_syst_u32 v); + void (*write_d32mts)(struct mipi_syst_handle * systh, mipi_syst_u32 v); + void (*write_d64mts)(struct mipi_syst_handle * systh, mipi_syst_u64 v); + + void (*write_d8)(struct mipi_syst_handle * systh, mipi_syst_u8 v); + void (*write_d16)(struct mipi_syst_handle * systh, mipi_syst_u16 v); + void (*write_d32)(struct mipi_syst_handle * systh, mipi_syst_u32 v); +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + void (*write_d64)(struct mipi_syst_handle * systh, mipi_syst_u64 v); +#endif + void (*write_flag)(struct mipi_syst_handle * systh); + + struct stp_writer_data * stpWriter; + }; + + extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_init(struct mipi_syst_header* , const void *); + extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_destroy(struct mipi_syst_header* systh); + + struct mipi_syst_platform_handle { + mipi_syst_u32 master; + mipi_syst_u32 channel; + }; + + + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) + +/** +* Map heap memory allocation to platform malloc() implementation. +* +* This function is used for handle allocations if heap usage +* is supported by the platform. +* +* @param s number of bytes to allocate +* @see MIPI_SYST_HEAP_FREE +*/ +#define MIPI_SYST_HEAP_MALLOC(s) mipi_syst_platform_alloc(s) + +/** +* Map heap memory free function to platform free() implementation. +* +* This function is used for handle release if heap usage +* is supported by the platform. +* +* @param p pointer previously returned from MIPI_SYST_HEAP_MALLOC or NULL. +* @see MIPI_SYST_HEAP_MALLOC +*/ +#define MIPI_SYST_HEAP_FREE(p) mipi_syst_platform_free(p) + +extern MIPI_SYST_EXPORT void * MIPI_SYST_CALLCONV mipi_syst_platform_alloc(size_t s); +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_platform_free(void *); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +/* This example uses UNIX epoch time in micro second resolution + * as own clock. + */ +#define MIPI_SYST_PLATFORM_CLOCK() mipi_syst_get_epoch_us() +#define MIPI_SYST_PLATFORM_FREQ() 1000000 + +MIPI_SYST_EXPORT mipi_syst_u64 MIPI_SYST_CALLCONV mipi_syst_get_epoch_us(); +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + +/* IO output routine mapping + * Call the function pointers in the global SyS-T state + */ +#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d32ts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d32mts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D64MTS(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d64mts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D8(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d8((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D16(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d16((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D32(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d32((syst_handle), (data)) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#define MIPI_SYST_OUTPUT_D64(syst_handle, data) \ + (syst_handle)->systh_header->systh_platform.write_d64((syst_handle), (data)) +#endif +#define MIPI_SYST_OUTPUT_FLAG(syst_handle) \ + (syst_handle)->systh_header->systh_platform.write_flag((syst_handle)) + +#ifdef __cplusplus +} /* extern C */ +#endif + +#endif diff --git a/library/platform/mipi_stp_sim/src/mipi_syst_platform.c b/library/platform/mipi_stp_sim/src/mipi_syst_platform.c new file mode 100644 index 0000000..187205b --- /dev/null +++ b/library/platform/mipi_stp_sim/src/mipi_syst_platform.c @@ -0,0 +1,561 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + + +/* Example platform adaptation + * This "platform" shows how to implement a SyS-T library platform module + * to simulate MIPI STP data protocol generation for SyS-T messages. + */ +#if defined(_WIN32) +#include +#else +#include +#endif +#include +#include + +#include "mipi_syst.h" + +#if defined(_WIN32) +static CRITICAL_SECTION lockPlat; +#define LOCKING_INIT() InitializeCriticalSection(&lockPlat) +#define LOCKING_DESTROY() DeleteCriticalSection(&lockPlat) +#define LOCK() EnterCriticalSection(&lockPlat) +#define UNLOCK() LeaveCriticalSection(&lockPlat) + +#else + +#include +static pthread_mutex_t lockPlat; + +#define LOCKING_INIT() pthread_mutex_init(&lockPlat, NULL) +#define LOCKING_DESTROY() pthread_mutex_destroy(&lockPlat) +#define LOCK() pthread_mutex_lock(&lockPlat) +#define UNLOCK() pthread_mutex_unlock(&lockPlat) + +#endif + +MIPI_SYST_EXPORT mipi_syst_u64 MIPI_SYST_CALLCONV mipi_syst_get_epoch_us() +{ + mipi_syst_u64 epoch; +#if defined(MIPI_SYST_UNIT_TEST) + epoch = 0x12345678aabbccddull; +#elif defined(_WIN32) + // windows does not offer epoch time API directly. + // Search for the 116444... constant below on + // msdn for an explanation of this computation: + // + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + epoch = ft.dwHighDateTime; + epoch = ((epoch<<32) | ft.dwLowDateTime) / 10 - 11644473600000000ULL; +#else + struct timeval tv; + gettimeofday(&tv, NULL); + epoch = tv.tv_sec; + epoch *= 1000000; + epoch += tv.tv_usec; +#endif + return epoch; +} + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +MIPI_SYST_EXPORT +void * MIPI_SYST_CALLCONV mipi_syst_platform_alloc(size_t s) +{ + return malloc(s); +} + +MIPI_SYST_EXPORT +void MIPI_SYST_CALLCONV mipi_syst_platform_free(void * p) +{ + free(p); +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) */ + +/* helper class for generating STP protocol data +*/ +struct stp_writer_data { + FILE * fp; /* output */ + mipi_syst_u8 byteDone; /* true = byte complete */ + mipi_syst_u8 current; /* current byte value */ + mipi_syst_u16 master; /* current master */ + mipi_syst_u16 channel; /* current channel */ + mipi_syst_u64 recordCount; /* count stp packets */ + + mipi_syst_u64 timestamp; /* first timestamp */ +}; + + +static struct stp_writer_data writer_state; + +void stp_write_putNibble(struct stp_writer_data* p, mipi_syst_u8 n) +{ + p->current |= (n<<4); + p->byteDone = ! p->byteDone; + + if (p->byteDone) { /* push it out .. */ + fputc(p->current, p->fp); + p->current = 0; + } else { /* first nibble, shift it down to b0..3 */ + p->current >>= 4; + } +} + +void stp_write_flush(struct stp_writer_data* p) { + if (!p->byteDone) { + stp_write_putNibble(p, 0); + } + + fflush(p->fp); +} +void stp_write_d4(struct stp_writer_data* p, mipi_syst_u8 v) { + stp_write_putNibble(p, v); +} + +void stp_write_payload8(struct stp_writer_data* p, mipi_syst_u8 v) { + stp_write_d4(p, v); + stp_write_d4(p, v>>4); +} + +void stp_write_payload16(struct stp_writer_data* p, mipi_syst_u16 v) { + stp_write_payload8(p, (mipi_syst_u8)v); + stp_write_payload8(p, (mipi_syst_u8)(v>>8)); +} + +void stp_write_payload32(struct stp_writer_data* p, mipi_syst_u32 v) { + stp_write_payload16(p, (mipi_syst_u16)v); + stp_write_payload16(p, (mipi_syst_u16)(v>>16)); +} + +void stp_write_payload64(struct stp_writer_data* p, mipi_syst_u64 v) { + stp_write_payload32(p, (mipi_syst_u32)v); + stp_write_payload32(p, (mipi_syst_u32)(v>>32)); +} + +mipi_syst_u64 deltaTime(struct stp_writer_data* p) +{ + mipi_syst_u64 delta; + + delta = mipi_syst_get_epoch_us() - p->timestamp; + return delta * 60; /* simluate 60Mhz clock */ +} +void stp_write_d32mts(struct stp_writer_data* p, mipi_syst_u32 v) { + stp_write_d4(p, 0xA); + stp_write_payload32(p, v); + + stp_write_d4(p, 0xE); + stp_write_payload64(p, deltaTime(p)); +} + +void stp_write_d64mts(struct stp_writer_data* p, mipi_syst_u64 v) { + stp_write_d4(p, 0xB); + stp_write_payload64(p, v); + + stp_write_d4(p, 0xE); + stp_write_payload64(p, deltaTime(p)); +} +void stp_write_d32ts(struct stp_writer_data* p, mipi_syst_u32 v) { + stp_write_d4(p, 0xF); + stp_write_d4(p, 0x6); + + stp_write_payload32(p, v); + + stp_write_d4(p, 0xE); + stp_write_payload64(p, deltaTime(p)); +} + +void stp_write_d8(struct stp_writer_data* p, mipi_syst_u8 v) { + stp_write_d4(p, 0x4); + stp_write_payload8(p, v); +} + +void stp_write_d16(struct stp_writer_data* p, mipi_syst_u16 v) { + stp_write_d4(p, 0x5); + stp_write_payload16(p, v); +} + + +void stp_write_d32(struct stp_writer_data* p, mipi_syst_u32 v) { + stp_write_d4(p, 0x6); + stp_write_payload32(p, v); +} + + +void stp_write_d64(struct stp_writer_data* p, mipi_syst_u64 v) +{ + stp_write_d4(p, 0x7); + stp_write_payload64(p, v); +} + +void stp_write_flag(struct stp_writer_data* p) +{ + stp_write_d4(p, 0xF); + stp_write_d4(p, 0xE); +} + +void stp_write_async(struct stp_writer_data* p) +{ + int i; + for(i=0; i < 21; ++i) { + stp_write_d4(p, 0xF); + } + stp_write_d4(p, 0x0); +} + +void stp_write_version(struct stp_writer_data* p) +{ + stp_write_d4(p, 0xF); + stp_write_d4(p, 0x0); + stp_write_d4(p, 0x0); + + stp_write_d4(p, 0x3); /* STPv2NAT */ + + p->master = p->channel = 0; +} + +void stp_write_freq(struct stp_writer_data* p) +{ + stp_write_d4(p, 0xF); + stp_write_d4(p, 0x0); + stp_write_d4(p, 0x8); + stp_write_payload32(p, 60 * 1000 * 1000 ); // 60 Mhz +} + +void stp_write_setMC(struct stp_writer_data* p, + mipi_syst_u16 master, + mipi_syst_u16 channel) +{ + /* re-send async after 20 packets */ + if (!(p->recordCount++ % 20) ) { + stp_write_async(p); + stp_write_version(p); + stp_write_freq(p); + } + + if (p->master != master ) { + stp_write_d4(p, 0xF); + stp_write_d4(p, 0x1); + stp_write_payload16(p, master); + + p->master = master; + p->channel = 0; + } + + if (p->channel != channel) { + stp_write_d4(p, 0xF); + stp_write_d4(p, 0x3); + stp_write_payload16(p, channel); + + p->channel = channel; + } +} + + + +/* output stream for STP data +*/ +static FILE * fp; +static mipi_syst_u16 master = 128; /* Default MIPI STP master:channel */ +static mipi_syst_u16 channel = 1; + + +/* low level "driver" output routines */ +static void sth_write_d32ts(struct mipi_syst_handle* systh, mipi_syst_u32 v); +static void sth_write_d32mts(struct mipi_syst_handle* systh, mipi_syst_u32 v); +static void sth_write_d64mts(struct mipi_syst_handle* systh, mipi_syst_u64 v); +static void sth_write_d8(struct mipi_syst_handle* systh, mipi_syst_u8 v); +static void sth_write_d16(struct mipi_syst_handle* systh, mipi_syst_u16 v); +static void sth_write_d32(struct mipi_syst_handle* systh, mipi_syst_u32 v); +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +static void sth_write_d64(struct mipi_syst_handle* systh, mipi_syst_u64 vp); +#endif +static void sth_write_user8ts(struct mipi_syst_handle* systh, mipi_syst_u8 v); +static void sth_write_flag(struct mipi_syst_handle* systh); + +/* +* Platform specific SyS-T handle initialization hook function +* +* @param systh pointer to the new SyS-T handle structure +*/ +static void platform_handle_init(struct mipi_syst_handle* systh) +{ + LOCK(); + + /* Simply increment channels on each handle request and advance + * to next master if all consumed. + */ + if (channel > 127) { + ++master; + channel = 1; + } + + systh->systh_platform.channel = channel++; + systh->systh_platform.master = master; + + UNLOCK(); +} + +/** +* Platform specific SyS-T handle initialization hook function +* +* @param systh pointer to the new SyS-T handle structure +*/ +static void platform_handle_release(struct mipi_syst_handle* systh) +{ + LOCK(); + + /* add any race protected cleanup code here + */ + + UNLOCK(); +} + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_init(struct mipi_syst_header* systh, const void * platform_data) +{ + const char * filename; + + LOCKING_INIT(); + + /* Platform data is expected to be UTF-8 string with the STP output + * file name. + */ + filename = (const char *)platform_data; + + if (filename == NULL ||!strcmp(filename, "-")) + { + fp = stdout; + } else { + fp = fopen((char*)platform_data, "wb"); + + if (fp == NULL) { + fprintf(stderr, "Unable to open file '%s'.\n", (char*)platform_data); + exit(-1); + } + } + + /* create the STP output writer + */ + writer_state.byteDone = 0; + writer_state.fp = fp; + writer_state.current = 0; + writer_state.master = 0; + writer_state.channel = 0; + writer_state.recordCount=0; + writer_state.timestamp = mipi_syst_get_epoch_us(); + + systh->systh_platform.stpWriter = & writer_state; + + /* Set handle init hook that performs per SyS-T handle initialization + * and destruction + */ + systh->systh_inith = platform_handle_init; + systh->systh_releaseh = platform_handle_release; + + /* Initialize platform specific data in global SyS-T state + * This platform example puts its low level output function + * pointers here. A real implementation may have these "inlined" + * for performance reasons. + */ + systh->systh_platform.write_d32ts = sth_write_d32ts; + systh->systh_platform.write_d32mts = sth_write_d32mts; + systh->systh_platform.write_d64mts = sth_write_d64mts; + systh->systh_platform.write_d8 = sth_write_d8; + systh->systh_platform.write_d16 = sth_write_d16; + systh->systh_platform.write_d32 = sth_write_d32; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + systh->systh_platform.write_d64 = sth_write_d64; +#endif + systh->systh_platform.write_flag = sth_write_flag; +} + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_destroy(struct mipi_syst_header* systh) +{ + if (systh->systh_platform.stpWriter != NULL && + systh->systh_platform.stpWriter->fp != NULL) + { + fflush(systh->systh_platform.stpWriter->fp); + + if (systh->systh_platform.stpWriter->fp != stdout) + { + fclose(systh->systh_platform.stpWriter->fp); + systh->systh_platform.stpWriter->fp = NULL; + } + } + + LOCKING_DESTROY(); +} + +#if !defined(MIPI_SYST_STATIC) + +/* +* This example platform uses SyS-T as a shared library inside an +* application. The platform init hook is called during a shared library +* constructor call. +*/ +static MIPI_SYST_SHAREDLIB_CONSTRUCTOR + void shared_library_init() +{ + const char * filename; + + filename = getenv("SYSTCAT_OUTPUT"); + if (filename == NULL) { + filename = "syst_stp_data.bin"; + } + + MIPI_SYST_INIT(mipi_syst_platform_init, filename); + + if (filename[0] != '-' && filename[1] != 0 ) { + printf("writing STP data into '%s' ...\n", filename); + } +} + +/* +* This example platform uses SyS-T as a shared library inside an +* application. The platform destroy hook is called during a shared library +* destructor call. +*/ +static MIPI_SYST_SHAREDLIB_DESTRUCTOR void shared_library_exit() +{ + MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy); +} + +#if defined(_WIN32) +/* +* Windows DLL main routine, needed to run the global initialization and +* destruction handlers. +*/ +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved ) +{ + switch(fdwReason) { + case DLL_PROCESS_ATTACH: + shared_library_init(); + break; + case DLL_PROCESS_DETACH: + shared_library_exit(); + break; + } + return TRUE; +} +#endif + +#endif /* #if !defined(MIPI_SYST_STATIC) */ + + +/* C code low level driver output routine wrappers for SyS-T +*/ +static void sth_write_d32ts(struct mipi_syst_handle* systh, mipi_syst_u32 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + + /* Each message starts with d32ts. We use this as an */ + /* indicator to lock the output writer until we wrote the */ + /* end of record flag pattern. */ + LOCK(); + + + stp_write_setMC(writer, + systh->systh_platform.master, systh->systh_platform.channel ); + stp_write_d32ts(writer, v); +} + +/* short single 32 bit payload message */ +static void sth_write_d32mts(struct mipi_syst_handle* systh, mipi_syst_u32 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + + LOCK(); + + stp_write_setMC(writer, + systh->systh_platform.master,systh->systh_platform.channel ); + stp_write_d32mts(writer, v); + + UNLOCK(); +} +/* short single 64 bit payload message */ +static void sth_write_d64mts(struct mipi_syst_handle* systh, mipi_syst_u64 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + + LOCK(); + + stp_write_setMC(writer, + systh->systh_platform.master,systh->systh_platform.channel ); + stp_write_d64mts(writer, v); + + UNLOCK(); +} +static void sth_write_d8(struct mipi_syst_handle* systh, mipi_syst_u8 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + stp_write_d8(writer, v); +} + +static void sth_write_d16(struct mipi_syst_handle* systh, mipi_syst_u16 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + stp_write_d16(writer, v); +} + +static void sth_write_d32(struct mipi_syst_handle* systh, mipi_syst_u32 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + stp_write_d32(writer, v); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +static void sth_write_d64(struct mipi_syst_handle* systh, mipi_syst_u64 v) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + stp_write_d64(writer, v); +} +#endif + +static void sth_write_flag(struct mipi_syst_handle* systh) +{ + struct stp_writer_data * writer = systh->systh_header->systh_platform.stpWriter; + + stp_write_flag(writer); + stp_write_flush(writer); + + /* atomic record write done - matching lock was in sth_write_d32ts() */ + UNLOCK(); +} \ No newline at end of file diff --git a/library/platform/nop/include/mipi_syst/platform.h b/library/platform/nop/include/mipi_syst/platform.h new file mode 100644 index 0000000..d8c2eb7 --- /dev/null +++ b/library/platform/nop/include/mipi_syst/platform.h @@ -0,0 +1,153 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +/* Minimal platform example (which is acutally is a NOP) +* This "platform" shows how to use the SyS-T platform modules +* to implement platform specific customizations. +*/ + +#ifndef MIPI_SYST_PLATFORM_INCLUDED +#define MIPI_SYST_PLATFORM_INCLUDED + +/* Uncomment to turn code inlining off. + * + * #undef MIPI_SYST_PCFG_ENABLE_INLINE + */ + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** +* Platform specific SyS-T global state extension +* +* The contents of this structure can be freely defined to +* match platform specific data needs. It can later be +* accessed through the mipi_syst_header systh_platform member. +* +* This platform example puts low-level output function pointers +* here. Real implementations may have them "inlined" for performance +* reasons. +*/ +struct mipi_syst_platform_state { + volatile void * mmio; +}; + +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_init(struct mipi_syst_header *, const void *); +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_platform_destroy(struct mipi_syst_header * systh); + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +/* this example uses UNIX epoch time in micro-second resolution +* as own clock. +*/ +#if defined(MIPI_SYST_UNIT_TEST) +#define MIPI_SYST_PLATFORM_CLOCK() 0x12345678aabbccdd +#else +#define MIPI_SYST_PLATFORM_CLOCK() 0 /* replace with real clock provider */ +#endif +#define MIPI_SYST_PLATFORM_FREQ() 1000*1000 + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + +/** +* Platform specific SyS-T handle state extension +* +* The contents of this structure can be freely defined to +* match platform specific data needs. It can later be +* accessed through the syst_handles's systh_platform member. +* +* @see MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA struct mipi_syst_handle +*/ +struct mipi_syst_platform_handle { + volatile void * mmio_addr; +}; + + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +/** +* Map heap memory allocation to platfrom malloc() implementation. +* +* This function is used for handle allocations if heap usage +* is supported by the platform. +* +* @param s number of bytes to allocate +* @see MIPI_SYST_HEAP_FREE +*/ +#define MIPI_SYST_HEAP_MALLOC(s) mipi_syst_platform_alloc(s) + +/** +* Map heap memory free function to platfrom free() implementation. +* +* This function is used for handle release if heap usage +* is supported by the platform. +* +* @param p pointer previously returned from MIPI_SYST_HEAP_MALLOC or NULL. +* @see MIPI_SYST_HEAP_MALLOC +*/ +#define MIPI_SYST_HEAP_FREE(p) mipi_syst_platform_free(p) + +extern MIPI_SYST_EXPORT void * MIPI_SYST_CALLCONV mipi_syst_platform_alloc(size_t s); +extern MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_platform_free(void *); +#endif + +/* IO output routine mapping + * Define these to generate SyS-T data protocol output + */ +#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D64MTS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D8(syst_handle, data) +#define MIPI_SYST_OUTPUT_D16(syst_handle, data) +#define MIPI_SYST_OUTPUT_D32(syst_handle, data) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#define MIPI_SYST_OUTPUT_D64(syst_handle, data) +#endif +#define MIPI_SYST_OUTPUT_FLAG(syst_handle) + +#endif + + +#ifdef __cplusplus +} /* extern C */ +#endif diff --git a/library/platform/nop/src/mipi_syst_platform.c b/library/platform/nop/src/mipi_syst_platform.c new file mode 100644 index 0000000..3175f33 --- /dev/null +++ b/library/platform/nop/src/mipi_syst_platform.c @@ -0,0 +1,146 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#if defined(_WIN32) +#include +#endif +#include "mipi_syst.h" + + +/** + * Platform specific SyS-T handle initialization hook function + * + * @param systh pointer to the new SyS-T handle structure + */ +static void platform_handle_init(struct mipi_syst_handle* systh) +{ +} + +/** + * Platform specific SyS-T handle initialization hook function + * + * @param systh pointer to the new SyS-T handle structure + */ +static void platform_handle_release(struct mipi_syst_handle* systh) +{ +} + +/** + * Platform specific global state initialization hook function + * + * @param systh pointer to the new SyS-T handle structure + * @param platform_data user defined data for the init function. + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_platform_init(struct mipi_syst_header* systh, const void * platform_data) +{ + /* Set handle init hook that performs per SyS-T handle initialization + * and destruction + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + systh->systh_inith = platform_handle_init; + systh->systh_releaseh = platform_handle_release; +#endif +} + +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_platform_destroy(struct mipi_syst_header* systh) +{ +} + + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +MIPI_SYST_EXPORT +void * MIPI_SYST_CALLCONV mipi_syst_platform_alloc(size_t s) +{ + return malloc(s); +} + +MIPI_SYST_EXPORT +void MIPI_SYST_CALLCONV mipi_syst_platform_free(void * p) +{ + free(p); +} + + +#if !defined(MIPI_SYST_STATIC) +/** +* This example platform uses SyS-T as a shared library inside an +* application. The platform init hook is called during a shared library +* constructor call. +*/ +static MIPI_SYST_SHAREDLIB_CONSTRUCTOR void shared_library_init() +{ + MIPI_SYST_INIT(mipi_syst_platform_init, (void*)42); +} + +/** +* This example platform uses SyS-T as a shared library inside an +* application. The platform destroy hook is called during a shared library +* destructor call. +*/ +static MIPI_SYST_SHAREDLIB_DESTRUCTOR void shared_library_exit() +{ + /* run platform shutdown code */ + MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy); +} + +#if defined(_WIN32) +/** +* Windows DLL main routine, needed to run the global initialization and +* destruction handlers. +*/ +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) +{ + (void)lpReserved; + (void)hinstDLL; + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + shared_library_init(); + break; + case DLL_PROCESS_DETACH: + shared_library_exit(); + break; + } + return TRUE; +} +#endif +#endif /* !defined(MIPI_SYST_STATIC) */ +#endif /* defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) */ \ No newline at end of file diff --git a/library/src/mipi_syst_api.c b/library/src/mipi_syst_api.c new file mode 100644 index 0000000..6504d81 --- /dev/null +++ b/library/src/mipi_syst_api.c @@ -0,0 +1,1314 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + + /* Internal C-language API implementation */ + +#include "mipi_syst.h" +#include "mipi_syst/message.h" + +#if defined(MIPI_SYST_UNIT_TEST) +#define ASSERT_CHECK(x) ASSERT_EQ(x, true) +#else +#define ASSERT_CHECK(x) +#endif + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 + +#if !defined(MIPI_SYST_SCATTER_WRITE) +/** + * Default writer access is to call global state systh_writer pointer. + * Redefine this if you can avoid the function pointer overhead. + */ +#define MIPI_SYST_SCATTER_WRITE(syst_handle, scatter_prog, data_ptr) \ + { \ + (syst_handle)->systh_header->systh_writer( \ + (syst_handle), (scatter_prog), (data_ptr));\ + } +#endif + +/** + * predefined write scatter instructions defined in scatter_op table + */ +enum syst_scatter_ops { +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + SCATTER_OP_GUID, +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + SCATTER_OP_LOC_FMT, + SCATTER_OP_LOC_32, + SCATTER_OP_LOC_64, +#endif +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) + SCATTER_OP_LENGTH, +#endif + SCATTER_OP_PAYLD_VAR, + SCATTER_OP_CHECKSUM, + SCATTER_OP_CATID_32, + SCATTER_OP_CATID_64, + SCATTER_OP_CATID_ARGS, + SCATTER_OP_CLOCK, +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + SCATTER_OP_TS, +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) + SCATTER_OP_VER_ID, + SCATTER_OP_VER_TXT, +#endif + SCATTER_OP_END +}; + +/** + * Scatter instruction that describe the writing of SyS-T message descriptor + * members by the scatter write algorithm. + */ +static const struct mipi_syst_scatter_prog scatter_ops[] = { +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + + { /* SCATTER_OP_GUID */ + MIPI_SYST_SCATTER_OP_64BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_guid), + 2}, +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + { /* SCATTER_OP_LOC_FMT */ + MIPI_SYST_SCATTER_OP_8BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_loc.el_format), + 1}, + { /* SCATTER_OP_LOC_32 */ + MIPI_SYST_SCATTER_OP_32BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_loc.el_u), + 1}, + { /* SCATTER_OP_LOC_64 */ + MIPI_SYST_SCATTER_OP_64BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_loc.el_u), + 1}, +#endif +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) + { /* SCATTER_OP_LENGTH */ + MIPI_SYST_SCATTER_OP_16BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_len), + 1}, +#endif + { /* SCATTER_OP_PAYLD_VAR */ + MIPI_SYST_SCATTER_OP_BLOB, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_var), + 0} + , + { /* SCATTER_OP_PAYLD_CHECKSUM */ + MIPI_SYST_SCATTER_OP_32BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_chk), + 1} + , + { /* SCATTER_OP_CATID_32 */ + MIPI_SYST_SCATTER_OP_32BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_catid.id.sci_32), + 1} + , + { /* SCATTER_OP_CATID_64 */ + MIPI_SYST_SCATTER_OP_64BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_catid.id.sci_64), + 1} + , + { /* SCATTER_OP_CATID_ARGS */ + MIPI_SYST_SCATTER_OP_BLOB, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_catid.param), + 0} + , + { /* SCATTER_OP_CLOCK */ + MIPI_SYST_SCATTER_OP_64BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_clock), + 2} + , +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) /* SCATTER_OP_TS */ + { + MIPI_SYST_SCATTER_OP_64BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_ts), + 1} + , +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ +#if defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) + { /* SCATTER_OP_VER_ID */ + MIPI_SYST_SCATTER_OP_64BIT, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_version.id), + 1} + , + { /* SCATTER_OP_VER_TXT */ + MIPI_SYST_SCATTER_OP_BLOB, + MIPI_SYST_EVDSC_MEMBER_OFF(ed_pld.data_version.text), + 0} + , +#endif /* defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) */ + + { /* SCATTER_OP_END */ + MIPI_SYST_SCATTER_OP_END, + 0, + 0} +}; + + +/** + * Add optional message components to the message descriptor + */ +static +#if defined(MIPI_SYST_PCFG_ENABLE_INLINE) +MIPI_SYST_CC_INLINE +#endif +void +insert_optional_msg_components(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + mipi_syst_u16 len, + struct mipi_syst_msgdsc *desc, + struct mipi_syst_scatter_prog **prog_ptr) +{ + struct mipi_syst_scatter_prog *prog = *prog_ptr; + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + /* origin GUID ? */ + if (0 != desc->ed_tag.et_guid) { + desc->ed_guid = svh->systh_guid; + *prog++ = scatter_ops[SCATTER_OP_GUID]; + } +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + /* location information ? */ + if ((struct mipi_syst_msglocation*) 0 != loc) { + desc->ed_loc = *loc; + desc->ed_tag.et_location = 1; + + *prog++ = scatter_ops[SCATTER_OP_LOC_FMT]; + if (desc->ed_loc.el_format & 0x1) + *prog++ = scatter_ops[SCATTER_OP_LOC_64]; + else + *prog++ = scatter_ops[SCATTER_OP_LOC_32]; + } +#endif + +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) + /* pay load length */ + if(0 != desc->ed_tag.et_length) { + desc->ed_len = len; + *prog++ = scatter_ops[SCATTER_OP_LENGTH]; + } +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + if (desc->ed_tag.et_timestamp) { + /* timestamp present */ + desc->ed_ts = MIPI_SYST_PLATFORM_CLOCK(); + *prog++ = scatter_ops[SCATTER_OP_TS]; + } +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + + *prog_ptr = prog; +} +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_STRING_API) + +/** + * Write a string output message + * + * @param svh SyS-T handle + * @param loc Pointer to instrumentation location or null if no location + * @param type string message subtype + * @param severity severity level (0..7) + * @param len number of bytes to emit or 0 to send fixed size 32bytes + * @param str pointer to UTF-8 string bytes + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_debug_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_string type, + enum mipi_syst_severity severity, + mipi_syst_u16 len, const char *str) +{ + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + mipi_syst_u64 errmsg; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_STRING; + desc.ed_tag.et_subtype = type; + desc.ed_tag.et_severity = severity; + + if ((const char *)0 == str) { + desc.ed_tag.et_subtype = MIPI_SYST_STRING_INVALIDPARAM; + errmsg = +#if defined(MIPI_SYST_BIG_ENDIAN) + 0x286e756c6c290000ull; /* == "(null)\0\0" */ +#else + 0x0000296c6c756e28ull; /* == "(null)\0\0" */ +#endif + str = (char*)&errmsg; + len = 7; + } + insert_optional_msg_components(svh, loc, len, &desc, &prog_ptr); + + desc.ed_pld.data_var = (const mipi_syst_u8 *) str; + *prog_ptr = scatter_ops[SCATTER_OP_PAYLD_VAR]; + prog_ptr->sso_length = len; + ++prog_ptr; + + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_STRING_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +/** + * Write 64-bit catalog message + * + * @param svh SyS-T handle + * @param loc Pointer to instrumentation location or null + * @param severity message severity level (0..7) + * @param catid catalog ID + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_catalog64_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, mipi_syst_u64 catid) +{ + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + mipi_syst_u16 paramlen; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_CATALOG; + desc.ed_tag.et_severity = severity; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID64_P64; +#else + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID64_P32; +#endif + + paramlen = (mipi_syst_u16) + (svh->systh_param_count * sizeof(mipi_syst_u32)); + + insert_optional_msg_components( + svh, loc, + sizeof(catid) + paramlen, + &desc, &prog_ptr); + + /* cat ID */ + desc.ed_pld.data_catid.id.sci_64 = catid; + *prog_ptr++ = scatter_ops[SCATTER_OP_CATID_64]; + + /* parameters (if any) */ + + if (0 != paramlen) { + mipi_syst_u32 *param; + param = svh->systh_param; + desc.ed_pld.data_catid.param = param; + *prog_ptr = scatter_ops[SCATTER_OP_CATID_ARGS]; + prog_ptr->sso_length = paramlen; + ++prog_ptr; +#if defined(MIPI_SYST_BIG_ENDIAN) + while(paramlen) { + *param = MIPI_SYST_HTOLE32(*param); + param++; + paramlen-=sizeof(mipi_syst_u32); + } +#endif + } + + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} + +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) + +/** + * Write 32-Bit catalog message + * + * @param svh SyS-T handle + * @param loc Pointer to instrumentation location or null + * @param severity message severity level (0..7) + * @param catid catalog ID + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_catalog32_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, mipi_syst_u32 catid) +{ + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + mipi_syst_u16 paramlen; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_CATALOG; + desc.ed_tag.et_severity = severity; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID32_P64; +#else + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID32_P32; +#endif + + paramlen = (mipi_syst_u16) + (svh->systh_param_count * sizeof(mipi_syst_u32)); + + insert_optional_msg_components( + svh, loc, + sizeof(catid) + paramlen, + &desc, &prog_ptr); + + /* cat ID */ + desc.ed_pld.data_catid.id.sci_32 = catid; + *prog_ptr++ = scatter_ops[SCATTER_OP_CATID_32]; + + /* parameters (if any) */ + + if (0 != paramlen) { + mipi_syst_u32 * param; + param = svh->systh_param; + desc.ed_pld.data_catid.param = param; + *prog_ptr = scatter_ops[SCATTER_OP_CATID_ARGS]; + prog_ptr->sso_length = paramlen; + ++prog_ptr; +#if defined(MIPI_SYST_BIG_ENDIAN) + while(paramlen) { + *param = MIPI_SYST_HTOLE32(*param); + param++; + paramlen-=sizeof(mipi_syst_u32); + } +#endif + } + + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} + +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) + +/** + * Write raw data message + * + * @param svh SyS-T handle + * @param loc pointer to instrumentation location or null + * @param severity message severity level (0..7) + * @param protocol content protocol ID + * @param data pointer to raw data + * @param length number of bytes to send + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_raw_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u8 protocol, + const void *data, mipi_syst_u16 length) +{ + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_RAW; + desc.ed_tag.et_severity = severity; + desc.ed_tag.et_subtype = protocol; + + insert_optional_msg_components(svh, loc, length, &desc, &prog_ptr); + + desc.ed_pld.data_var = data; + *prog_ptr = scatter_ops[SCATTER_OP_PAYLD_VAR]; + prog_ptr->sso_length = length; + ++prog_ptr; + + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} +#endif /* defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) + +/** + * Write client build version message + * + * @param svh SyS-T handle + * @param loc pointer to instrumentation location or null + * @param severity message severity level (0..7) + * @param id 64-Bit version ID + * @param text pointer to UTF-8 version text + * @param length number of bytes to send + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_build_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 id, + const char *text, mipi_syst_u16 length) +{ + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_BUILD; + desc.ed_tag.et_severity = severity; + desc.ed_tag.et_subtype = MIPI_SYST_BUILD_ID_LONG; + + insert_optional_msg_components( + svh, loc, length + sizeof(id), &desc, &prog_ptr); + + desc.ed_pld.data_version.id = id; + *prog_ptr = scatter_ops[SCATTER_OP_VER_ID]; + ++prog_ptr; + if (0 != length) { + desc.ed_pld.data_version.text = text; + *prog_ptr = scatter_ops[SCATTER_OP_VER_TXT]; + prog_ptr->sso_length = length; + ++prog_ptr; + } + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} +#endif /* defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +/** +* Write clock sync message +* +* @param svh SyS-T handle +* @param loc pointer to instrumentation location or null +* @param fmt clock sync message subtype +* @param clock_value 64-Bit clock value +* @param clock_freq 64-Bit clock frequency in herz +*/ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_write_clock(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_clock fmt, + mipi_syst_u64 clock_value, + mipi_syst_u64 clock_freq) +{ + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + prog_ptr = prog; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_subtype = fmt; + desc.ed_tag.et_type = MIPI_SYST_TYPE_CLOCK; + desc.ed_tag.et_severity = MIPI_SYST_SEVERITY_MAX; + + insert_optional_msg_components( + svh, loc, + 2*sizeof(mipi_syst_u64), + &desc, &prog_ptr); + + desc.ed_pld.data_clock[0] = clock_value; + desc.ed_pld.data_clock[1] = clock_freq; + *prog_ptr++ = scatter_ops[SCATTER_OP_CLOCK]; + + *prog_ptr = scatter_ops[SCATTER_OP_END]; + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) */ + +#if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) + +/* printf requires stdarg from the compiler in use. It is a varargs function*/ + +#include +#include +#include + +#if !defined(MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE) +#define MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE 1024 /* Default 1Kb arg buffer */ +#endif + +/** state IDs of the printf format string parser's finite state machine + */ +enum FmtScanState { + START, + PLAINTEXT, + PERCENT, + FLAGS, + WIDTH, WIDTH_NUMBER, + PRECISION_DOT, PRECISION_VAL, PRECISION_NUMBER, + MODIFIER, + MODIFIER_HALF, + MODIFIER_LONG, + SPECIFIER +}; + +/** format modifier types + */ +enum Modifier { + MOD_NONE, MOD_HH, MOD_H, MOD_L, MOD_LL, MOD_J, MOD_Z, MOD_T, MOD_LD +}; + +/** parser result codes + * + */ +enum ReturnCodes { + FMT_PARSE_OK = 1, + FMT_PARSE_ARG_BUFFER_TOO_SMALL = -1, + FMT_PARSE_UNSUPPORTED_FORMAT = -2 +}; + +/* Helper macro to copy an argument from the arguments into the + * payload buffer. + * + * TOTYPE is the data type that gets stored in the messages's arg buffer + * FROMTYPE is the data type taken from the printf stack via varags + */ +#define COPY_ARG_DOUBLE(TOTYPE, FROMTYPE) \ + do { \ + union {mipi_syst_u64 v; TOTYPE d;} val; \ + val.d = (TOTYPE)va_arg(args, FROMTYPE); \ + if (argp + sizeof(TOTYPE) < argEob) { \ + val.v = MIPI_SYST_HTOLE64(val.v); \ + *((TOTYPE *)argp) = val.d; \ + argp += sizeof(TOTYPE); \ + } else { \ + return FMT_PARSE_ARG_BUFFER_TOO_SMALL; \ + } \ + } while(0) + +#define COPY_ARG32(TOTYPE, FROMTYPE) \ + do { \ + if (argp + sizeof(TOTYPE) < argEob) { \ + *((TOTYPE *)argp) = (TOTYPE)MIPI_SYST_HTOLE32(va_arg(args, FROMTYPE)); \ + argp += sizeof(TOTYPE); \ + } else { \ + return FMT_PARSE_ARG_BUFFER_TOO_SMALL; \ + } \ + } while(0) + +#define COPY_ARG64(TOTYPE, FROMTYPE) \ + do { \ + if (argp + sizeof(TOTYPE) < argEob) { \ + *((TOTYPE *)argp) = (TOTYPE)MIPI_SYST_HTOLE64(va_arg(args, FROMTYPE));\ + argp += sizeof(TOTYPE); \ + } else { \ + return FMT_PARSE_ARG_BUFFER_TOO_SMALL; \ + } \ + } while(0) + +/** Create the payload buffer for a printf format + * + * The payload of a printf message, starts with an UTF-8 string, + * which becomes the printf format. Depending on the format string, further + * parameters follow the format string using the following rules: + * + * All printf arguments follow the format string without alignment bytes added. + * Strings for the '%s' format specifier are embedded as UTF-8 strings with + * 0-byte termination into the payload. + * printf arguments use the binary data layout as defined in the table below. + * + * Data Type | 32 Bit Platform | 64 Bit Platform + * --------------------------|--------------------|--------------------------- + * int, unsigned int | 32 Bits | 32 Bits + * long, unsigned long | 32 Bits | 64 Bits + * long long, unsinged long long|64 Bits | 64 Bits + * size_t | 32 Bits | 64 Bits + * ptrdiff_t | 32 Bits | 64 Bits + * float double, long double | 64 Bits | 64 Bits + * char, unsigned char | 32 Bits | 32 Bits + * wchar_t | 32 Bits | 32 Bits + * Addresses(pointers) | 32 Bits | 64 Bits + * Strings (char *) |UTF-8, 0-terminated | UTF-8, 0-terminated + * + * The format string follows the C99 definition which can contain format + * specifier following this pattern: + * + * %[flags][width][.precision][length]specifier + * + * This function 'only' converts the fmt and arguments into a message payload. + * The actual formatting of the data into a string is done by the receiving + * trace decoder. + * + * @param buffer memory buffer filled with argument data + * @param size # of bytes in buffer + * @param fmt printf format string + * @param args printf varags + + */ +static int buildPrintfPayload( + char * buffer, + mipi_syst_u32 size, + const char * fmt, + va_list args) +{ + char * argEob; + char * argp; + const char * fmtp; + enum FmtScanState state; + enum Modifier modifier; + + if (0 == fmt) return FMT_PARSE_UNSUPPORTED_FORMAT; + + argp = buffer; + argEob = buffer + size; /* end of buffer address */ + fmtp = fmt; + + /* copy argument string to start of payload buffer + */ + while (argp < argEob) { + if( 0 == (*argp++ = *fmtp++)) break; + } + if (argp == argEob) return FMT_PARSE_ARG_BUFFER_TOO_SMALL; + + fmtp = fmt; + state = START; + modifier = MOD_NONE; + + /* loop over the arguments in the format and full the arg buffer + */ + while( *fmtp != 0 ) + { + switch(state) { + case START: + modifier = MOD_NONE; + + state = PLAINTEXT; + ; /* deliberate fall through */ + + case PLAINTEXT: + if (*fmtp == '%') { + state = PERCENT; + } + break; + + case PERCENT: + if (*fmtp == '%') { /* '%%' is not a format, but the % char */ + state = PLAINTEXT; + } else { + /* arg fmt definition is starting */ + state = FLAGS; + continue; + } + break; + + case FLAGS: + switch(*fmtp) { + case '-': + case '+': + case ' ': + case '#': + case '0': + break; + default: + state = WIDTH; + continue; + } + break; + + case WIDTH: + if (*fmtp == '*') { + COPY_ARG32(mipi_syst_s32, int); + state = PRECISION_DOT; + } else { + state = WIDTH_NUMBER; + continue; + } + break; + + case WIDTH_NUMBER: + if (*fmtp < '0' || *fmtp > '9') { /* !isdigit */ + state = PRECISION_DOT; + continue; + } + break; + + case PRECISION_DOT: + if (*fmtp == '.') { + state = PRECISION_VAL; + } else { + state = MODIFIER; + continue; + } + break; + + case PRECISION_VAL: + if (*fmtp == '*') { + COPY_ARG32(mipi_syst_s32, int); + state = MODIFIER; + } else { + state = PRECISION_NUMBER; + continue; + } + break; + + case PRECISION_NUMBER: + if (*fmtp < '0' || *fmtp > '9') { /* !isdigit */ + state = MODIFIER; + continue; + } + break; + + case MODIFIER: + state = SPECIFIER; + + switch(*fmtp){ + case 'h': + modifier = MOD_H; + state = MODIFIER_HALF; + break; + case 'l': + modifier = MOD_L; + state = MODIFIER_LONG; + break; + case 'j': + modifier = MOD_J; + break; + case 'z': + modifier = MOD_Z; + break; + case 't': + modifier = MOD_T; + break; + case 'L': + modifier = MOD_LD; + break; + default: + continue; + } + break; + + case MODIFIER_HALF: + state = SPECIFIER; + if (*fmtp == 'h') { + modifier = MOD_HH; + break; + } else { + continue; + } + break; + + + case MODIFIER_LONG: + state = SPECIFIER; + if (*fmtp == 'l') { + modifier = MOD_LL; + break; + } else { + continue; + } + + case SPECIFIER: + { + switch(*fmtp) { + case 'd': + case 'i': + case 'u': + case 'o': + case 'x': + case 'X': + switch(modifier) { + case MOD_L: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_u64, long); +#else + COPY_ARG32(mipi_syst_u32, unsigned long); +#endif + break; + case MOD_LL: + case MOD_J: + COPY_ARG64(mipi_syst_u64, unsigned long long); + break; + case MOD_Z: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_u64, size_t); +#else + COPY_ARG32(mipi_syst_u32, size_t); +#endif + break; + case MOD_T: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_s64, ptrdiff_t); +#else + COPY_ARG32(mipi_syst_s32, ptrdiff_t); +#endif + break; + default: + COPY_ARG32(mipi_syst_u32, unsigned int); + break; + } + state = START; + break; + case 'f': + case 'F': + case 'e': + case 'E': + case 'g': + case 'G': + case 'a': + case 'A': + if (modifier == MOD_LD) { + COPY_ARG_DOUBLE(double, long double); /* only double*/ + } else { + COPY_ARG_DOUBLE(double, double); + } + break; + case 'c': + if (modifier == MOD_L) { + COPY_ARG32(mipi_syst_u32, wchar_t); + } else { + COPY_ARG32(mipi_syst_u32, int); + } + break; + case 'p': + case 'n': +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_u64, void *); +#else + COPY_ARG32(mipi_syst_u32, void *); +#endif + break; + case 's': + { + /* Embed string with 0-byte into arg buffer */ + const char * p; + p = va_arg(args, char *); + while (argp < argEob) { + if (0 == (*argp++ = *p++)) { + break; + } + if (argp == argEob) { + return FMT_PARSE_ARG_BUFFER_TOO_SMALL; + } + } + } + break; + + default: + return FMT_PARSE_UNSUPPORTED_FORMAT; + break; + } + state = START; + } + break; + } + ++fmtp; + } + + if (state == START || state == PLAINTEXT) { + return (int)(argp - buffer); + } else { + return FMT_PARSE_UNSUPPORTED_FORMAT; + } +} +#if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) || defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) +static int buildCatalogPayload( + mipi_syst_u8 * buffer, + mipi_syst_u32 size, + va_list args) +{ + mipi_syst_u8 * argEob; + mipi_syst_u8 * argp; + int argType; + + argp = buffer; + argEob = buffer + size; /* end of buffer address */ + + + /* loop over the argument types + */ + for(argType = va_arg(args, int); + argType != 0; + argType = va_arg(args, int)) + { + switch(argType) { + case _MIPI_SYST_CATARG_D: + COPY_ARG32(mipi_syst_u32, unsigned int); + break; + case _MIPI_SYST_CATARG_LD: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_u64, long); +#else + COPY_ARG32(mipi_syst_u32, unsigned long); +#endif + break; + + case _MIPI_SYST_CATARG_LLD: + COPY_ARG64(mipi_syst_u64, unsigned long long); + break; + + case _MIPI_SYST_CATARG_ZD: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_u64, size_t); +#else + COPY_ARG32(mipi_syst_u32, size_t); +#endif + break; + + case _MIPI_SYST_CATARG_TD: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_s64, ptrdiff_t); +#else + COPY_ARG32(mipi_syst_s32, ptrdiff_t); +#endif + break; + + case _MIPI_SYST_CATARG_F: + COPY_ARG_DOUBLE(double, double); + break; + case _MIPI_SYST_CATARG_LF: + COPY_ARG_DOUBLE(double, long double); + break; + case _MIPI_SYST_CATARG_C: + COPY_ARG32(mipi_syst_u32, int); + break; + case _MIPI_SYST_CATARG_HHD: + COPY_ARG32(mipi_syst_u32, int); + break; + case _MIPI_SYST_CATARG_LC: + COPY_ARG32(mipi_syst_u32, wint_t); + break; + + case _MIPI_SYST_CATARG_P: +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + COPY_ARG64(mipi_syst_u64, void *); +#else + COPY_ARG32(mipi_syst_u32, void *); +#endif + break; + + case _MIPI_SYST_CATARG_CSTR: + { + const char * p; + p = va_arg(args, char *); + while (argp < argEob) { + if (0 == (*argp++ = *p++)) { + break; + } + if (argp == argEob) { + return FMT_PARSE_ARG_BUFFER_TOO_SMALL; + } + } + } + break; + + default: + return FMT_PARSE_UNSUPPORTED_FORMAT; + break; + } + } + + return (int)(argp - buffer); +} + +#endif // #if defined(MIPI_SYST_PCFG_ENABLE_CATIDxx_API) + +/** + * Write a printf message + * + * @param svh SyS-T handle + * @param loc Pointer to instrumentation location or null if no location + * @param severity severity level (0..7) + * @param fmt pointer to UTF-8 string bytes + * @param ... optional format arguments + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_write_printf_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + const char *fmt, + ...) +{ + char argBuf[MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE]; + int len; + va_list args; + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + mipi_syst_u64 errmsg; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_STRING; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + desc.ed_tag.et_subtype = MIPI_SYST_STRING_PRINTF_64; +#else + desc.ed_tag.et_subtype = MIPI_SYST_STRING_PRINTF_32; +#endif + desc.ed_tag.et_severity = severity; + + va_start(args, fmt); + len = buildPrintfPayload(argBuf, sizeof(argBuf), fmt, args); + va_end(args); + + if (len <= 0 ) { + /* Invalid format, send up to 32 bytes from the offending format string + * as string message with tag "invalid parameter" instead + */ + desc.ed_tag.et_subtype = MIPI_SYST_STRING_INVALIDPARAM; + errmsg = +#if defined(MIPI_SYST_BIG_ENDIAN) + 0x286e756c6c290000ull; /* == "(null)\0\0" */ +#else + 0x0000296c6c756e28ull; /* == "(null)\0\0" */ +#endif + fmt = fmt ? fmt : (char*)&errmsg; + + for (len = 0; len < 32;) + if (0 == fmt[len++]) break; + } else { + fmt = argBuf; + } + insert_optional_msg_components(svh, loc, (mipi_syst_u16)len, &desc, &prog_ptr); + + *prog_ptr = scatter_ops[SCATTER_OP_PAYLD_VAR]; + desc.ed_pld.data_var = (const mipi_syst_u8 *) fmt; + prog_ptr->sso_length = (mipi_syst_u16)len; + ++prog_ptr; + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +/** + * Write a printf catalog message with 64bit ID + * + * @param svh SyS-T handle + * @param loc Pointer to instrumentation location or null if no location + * @param severity severity level (0..7) + * @param id catalog id + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_write_printf_catalog64(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 id, + ...) +{ + mipi_syst_u8 argBuf[MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE+sizeof(id)]; + int len; + va_list args; + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + mipi_syst_u64 errmsg; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_CATALOG; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID64_P64; +#else + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID64_P32; +#endif + desc.ed_tag.et_severity = severity; + + va_start(args, id); + len = buildCatalogPayload(argBuf+sizeof(id), + MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE, + args); + va_end(args); + + if (len < 0 ) { + char * msg; + errmsg = +#if defined(MIPI_SYST_BIG_ENDIAN) + 0x6361746172670000ull; /* = "catarg\0\0" */ +#else + 0x0000677261746163ull; /* = "catarg\0\0" */ +#endif + /* Invalid parameter list */ + desc.ed_tag.et_type = MIPI_SYST_TYPE_STRING; + desc.ed_tag.et_subtype = MIPI_SYST_STRING_INVALIDPARAM; + len = 0; + msg = (char*)&errmsg; + while (0 != (argBuf[len++] = *msg++)); + } else { + *(mipi_syst_u64*)argBuf = MIPI_SYST_HTOLE64(id); + len += sizeof(id); + } + + insert_optional_msg_components(svh, loc, (mipi_syst_u16)len, &desc, &prog_ptr); + + *prog_ptr = scatter_ops[SCATTER_OP_PAYLD_VAR]; + desc.ed_pld.data_var = (const mipi_syst_u8 *) argBuf; + prog_ptr->sso_length = (mipi_syst_u16)len; + ++prog_ptr; + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} +#endif // #if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) +#if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) + +/** + * Write a printf catalog message with 32bit ID + * + * @param svh SyS-T handle + * @param loc Pointer to instrumentation location or null if no location + * @param severity severity level (0..7) + * @param id catalog id + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV + mipi_syst_write_printf_catalog32(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u32 id, + ...) +{ + mipi_syst_u8 argBuf[MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE+sizeof(id)]; + int len; + va_list args; + struct mipi_syst_msgdsc desc; + struct mipi_syst_scatter_prog prog[MIPI_SYST_SCATTER_PROG_LEN]; + struct mipi_syst_scatter_prog *prog_ptr = prog; + mipi_syst_u64 errmsg; + + if ((struct mipi_syst_handle*)0 == svh) + return; + + /* assign tag */ + desc.ed_tag = svh->systh_tag; + desc.ed_tag.et_type = MIPI_SYST_TYPE_CATALOG; +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID32_P64; +#else + desc.ed_tag.et_subtype = MIPI_SYST_CATALOG_ID32_P32; +#endif + desc.ed_tag.et_severity = severity; + + va_start(args, id); + len = buildCatalogPayload(argBuf+sizeof(id), + MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE, + args); + va_end(args); + + if (len < 0 ) { + char * msg; + errmsg = +#if defined(MIPI_SYST_BIG_ENDIAN) + 0x6361746172670000ull; /* = "catarg\0\0" */ +#else + 0x0000677261746163ull; /* = "catarg\0\0" */ +#endif + /* Invalid parameter list */ + desc.ed_tag.et_type = MIPI_SYST_TYPE_STRING; + desc.ed_tag.et_subtype = MIPI_SYST_STRING_INVALIDPARAM; + len = 0; + msg = (char*)&errmsg; + while (0 != (argBuf[len++] = *msg++)); + } else { + *(mipi_syst_u32*)argBuf = MIPI_SYST_HTOLE32(id); + len += sizeof(id); + } + + insert_optional_msg_components(svh, loc, (mipi_syst_u16)len, &desc, &prog_ptr); + + *prog_ptr = scatter_ops[SCATTER_OP_PAYLD_VAR]; + desc.ed_pld.data_var = (const mipi_syst_u8 *) argBuf; + prog_ptr->sso_length = (mipi_syst_u16)len; + ++prog_ptr; + *prog_ptr = scatter_ops[SCATTER_OP_END]; + + ASSERT_CHECK(prog_ptr < &prog[MIPI_SYST_SCATTER_PROG_LEN]); + + /* call IO routine to dump out the message */ + MIPI_SYST_SCATTER_WRITE(svh, prog, &desc); +} +#endif // #if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) +#endif /* #if defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) */ \ No newline at end of file diff --git a/library/src/mipi_syst_compiler.c b/library/src/mipi_syst_compiler.c new file mode 100644 index 0000000..a03c1a2 --- /dev/null +++ b/library/src/mipi_syst_compiler.c @@ -0,0 +1,78 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + + /* Compiler dependent code */ + +#include "mipi_syst.h" + +#if defined(_WIN32) /* MSVC Compiler section */ + +#include +#pragma intrinsic(_ReturnAddress) + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +/** + * Return the instruction pointer address of the instruction + * that follows this function. It is used to compute + * location information for SyS-T instrumentation calls. + * These are the calls that end with the _LOCADDR suffix. + */ +MIPI_SYST_EXPORT void *MIPI_SYST_CALLCONV mipi_syst_return_addr() +{ + return _ReturnAddress(); +} +#endif /* defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) */ + +#elif defined(__GNUC__) /* GNU-C Compiler section */ + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +/** + * Return the instruction pointer address of the instruction + * that follows this function. It is used to compute + * location information for SyS-T instrumentation calls. + * These are the calls that end with the _LOCADDR suffix. + */ +MIPI_SYST_EXPORT void *MIPI_SYST_CALLCONV mipi_syst_return_addr() +{ + return __builtin_return_address(0); +} +#endif + +#else +#error unknown compiler, copy and adapt one of the sections above +#endif \ No newline at end of file diff --git a/library/src/mipi_syst_crc32.c b/library/src/mipi_syst_crc32.c new file mode 100644 index 0000000..65e3451 --- /dev/null +++ b/library/src/mipi_syst_crc32.c @@ -0,0 +1,313 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) && !defined(MIPI_SYST_CRC_INTRINSIC) + +/* + * Pre-computed CRC-C values for all 8-bit values using + * polynomial 0x1EDC6F41 (Castagnoli). + */ + +const mipi_syst_u32 mipi_syst_crc_table[256] = { + 0x00000000, + 0xF26B8303, + 0xE13B70F7, + 0x1350F3F4, + 0xC79A971F, + 0x35F1141C, + 0x26A1E7E8, + 0xD4CA64EB, + 0x8AD958CF, + 0x78B2DBCC, + 0x6BE22838, + 0x9989AB3B, + 0x4D43CFD0, + 0xBF284CD3, + 0xAC78BF27, + 0x5E133C24, + 0x105EC76F, + 0xE235446C, + 0xF165B798, + 0x030E349B, + 0xD7C45070, + 0x25AFD373, + 0x36FF2087, + 0xC494A384, + 0x9A879FA0, + 0x68EC1CA3, + 0x7BBCEF57, + 0x89D76C54, + 0x5D1D08BF, + 0xAF768BBC, + 0xBC267848, + 0x4E4DFB4B, + 0x20BD8EDE, + 0xD2D60DDD, + 0xC186FE29, + 0x33ED7D2A, + 0xE72719C1, + 0x154C9AC2, + 0x061C6936, + 0xF477EA35, + 0xAA64D611, + 0x580F5512, + 0x4B5FA6E6, + 0xB93425E5, + 0x6DFE410E, + 0x9F95C20D, + 0x8CC531F9, + 0x7EAEB2FA, + 0x30E349B1, + 0xC288CAB2, + 0xD1D83946, + 0x23B3BA45, + 0xF779DEAE, + 0x05125DAD, + 0x1642AE59, + 0xE4292D5A, + 0xBA3A117E, + 0x4851927D, + 0x5B016189, + 0xA96AE28A, + 0x7DA08661, + 0x8FCB0562, + 0x9C9BF696, + 0x6EF07595, + 0x417B1DBC, + 0xB3109EBF, + 0xA0406D4B, + 0x522BEE48, + 0x86E18AA3, + 0x748A09A0, + 0x67DAFA54, + 0x95B17957, + 0xCBA24573, + 0x39C9C670, + 0x2A993584, + 0xD8F2B687, + 0x0C38D26C, + 0xFE53516F, + 0xED03A29B, + 0x1F682198, + 0x5125DAD3, + 0xA34E59D0, + 0xB01EAA24, + 0x42752927, + 0x96BF4DCC, + 0x64D4CECF, + 0x77843D3B, + 0x85EFBE38, + 0xDBFC821C, + 0x2997011F, + 0x3AC7F2EB, + 0xC8AC71E8, + 0x1C661503, + 0xEE0D9600, + 0xFD5D65F4, + 0x0F36E6F7, + 0x61C69362, + 0x93AD1061, + 0x80FDE395, + 0x72966096, + 0xA65C047D, + 0x5437877E, + 0x4767748A, + 0xB50CF789, + 0xEB1FCBAD, + 0x197448AE, + 0x0A24BB5A, + 0xF84F3859, + 0x2C855CB2, + 0xDEEEDFB1, + 0xCDBE2C45, + 0x3FD5AF46, + 0x7198540D, + 0x83F3D70E, + 0x90A324FA, + 0x62C8A7F9, + 0xB602C312, + 0x44694011, + 0x5739B3E5, + 0xA55230E6, + 0xFB410CC2, + 0x092A8FC1, + 0x1A7A7C35, + 0xE811FF36, + 0x3CDB9BDD, + 0xCEB018DE, + 0xDDE0EB2A, + 0x2F8B6829, + 0x82F63B78, + 0x709DB87B, + 0x63CD4B8F, + 0x91A6C88C, + 0x456CAC67, + 0xB7072F64, + 0xA457DC90, + 0x563C5F93, + 0x082F63B7, + 0xFA44E0B4, + 0xE9141340, + 0x1B7F9043, + 0xCFB5F4A8, + 0x3DDE77AB, + 0x2E8E845F, + 0xDCE5075C, + 0x92A8FC17, + 0x60C37F14, + 0x73938CE0, + 0x81F80FE3, + 0x55326B08, + 0xA759E80B, + 0xB4091BFF, + 0x466298FC, + 0x1871A4D8, + 0xEA1A27DB, + 0xF94AD42F, + 0x0B21572C, + 0xDFEB33C7, + 0x2D80B0C4, + 0x3ED04330, + 0xCCBBC033, + 0xA24BB5A6, + 0x502036A5, + 0x4370C551, + 0xB11B4652, + 0x65D122B9, + 0x97BAA1BA, + 0x84EA524E, + 0x7681D14D, + 0x2892ED69, + 0xDAF96E6A, + 0xC9A99D9E, + 0x3BC21E9D, + 0xEF087A76, + 0x1D63F975, + 0x0E330A81, + 0xFC588982, + 0xB21572C9, + 0x407EF1CA, + 0x532E023E, + 0xA145813D, + 0x758FE5D6, + 0x87E466D5, + 0x94B49521, + 0x66DF1622, + 0x38CC2A06, + 0xCAA7A905, + 0xD9F75AF1, + 0x2B9CD9F2, + 0xFF56BD19, + 0x0D3D3E1A, + 0x1E6DCDEE, + 0xEC064EED, + 0xC38D26C4, + 0x31E6A5C7, + 0x22B65633, + 0xD0DDD530, + 0x0417B1DB, + 0xF67C32D8, + 0xE52CC12C, + 0x1747422F, + 0x49547E0B, + 0xBB3FFD08, + 0xA86F0EFC, + 0x5A048DFF, + 0x8ECEE914, + 0x7CA56A17, + 0x6FF599E3, + 0x9D9E1AE0, + 0xD3D3E1AB, + 0x21B862A8, + 0x32E8915C, + 0xC083125F, + 0x144976B4, + 0xE622F5B7, + 0xF5720643, + 0x07198540, + 0x590AB964, + 0xAB613A67, + 0xB831C993, + 0x4A5A4A90, + 0x9E902E7B, + 0x6CFBAD78, + 0x7FAB5E8C, + 0x8DC0DD8F, + 0xE330A81A, + 0x115B2B19, + 0x020BD8ED, + 0xF0605BEE, + 0x24AA3F05, + 0xD6C1BC06, + 0xC5914FF2, + 0x37FACCF1, + 0x69E9F0D5, + 0x9B8273D6, + 0x88D28022, + 0x7AB90321, + 0xAE7367CA, + 0x5C18E4C9, + 0x4F48173D, + 0xBD23943E, + 0xF36E6F75, + 0x0105EC76, + 0x12551F82, + 0xE03E9C81, + 0x34F4F86A, + 0xC69F7B69, + 0xD5CF889D, + 0x27A40B9E, + 0x79B737BA, + 0x8BDCB4B9, + 0x988C474D, + 0x6AE7C44E, + 0xBE2DA0A5, + 0x4C4623A6, + 0x5F16D052, + 0xAD7D5351 +}; + + +#if !defined(MIPI_SYST_PCFG_ENABLE_INLINE) +#define MIPI_SYST_PCFG_ENABLE_INLINE +#include "mipi_syst/crc32.h" +#endif + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) && !defined(MIPI_SYST_CRC_INTRINSIC)) */ \ No newline at end of file diff --git a/library/src/mipi_syst_init.c b/library/src/mipi_syst_init.c new file mode 100644 index 0000000..90ba5a5 --- /dev/null +++ b/library/src/mipi_syst_init.c @@ -0,0 +1,204 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst.h" +#include "mipi_syst/message.h" + +/** + * SyS-T global state + */ +static struct mipi_syst_header syst_hdr = { 0 }; + +static union mipi_syst_null_init { + struct mipi_syst_handle handle; + struct mipi_syst_header header; +} zero = { {0} }; /* for initializations */ + +#if !defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) +/** + * null-device style default output function + */ +static void nullWriter(struct mipi_syst_handle* systh, + struct mipi_syst_scatter_prog scatterprog, const void *pdesc) +{ +} +#endif + +/** + * Initialize the SyS-T library. + * + * This function must be called during the start of the platform before any + * other instrumentation library call. The function initializes the global + * state data necessary for the library to execute. Passing NULL as state + * means using the shared global state singleton. Passing a valid pointer + * allows using multiple SyS-T state context structures in parallel. + * + * @param header Pointer to SyS-T global state structure or NULL for default. + * @param pfinit Pointer to platform initialization function or 0 if not used. + * @param init_param Value passed to the the platform init hook function. + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_init( + struct mipi_syst_header* header, + mipi_syst_inithook_t pfinit, + const void *init_param) +{ + if (0 == header) { + /* No user supplied global state storage, + * use internal default state + */ + header = &syst_hdr; + } + + *header = zero.header; + header->systh_version = MIPI_SYST_VERSION_CODE; + +#if MIPI_SYST_CONFORMANCE_LEVEL > 10 +#if defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) + header->systh_writer = mipi_syst_scatter_write; +#else + header->systh_writer = nullWriter; +#endif +#endif + + /* call platform state initialization hook if defined + */ + if ((mipi_syst_inithook_t) 0 != pfinit) + (*pfinit) (header, init_param); +} + +/** + * Destroy the SyS-T library state. + * + * This function must be called during shutdown of the platform to release + * any SyS-T resources. + * + * @param header Pointer to library state or NULL to use shared default. + * @param pfdestroy Pointer to platform state destroy function or 0 + * if not used. + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV +mipi_syst_destroy(struct mipi_syst_header* header, mipi_syst_destroyhook_t pfdestroy) +{ + if (0 == header) { + /* No user supplied global state storage, + * use internal default state + */ + header = &syst_hdr; + } + + /* call platform state destroy hook first, if defined + */ + if ((mipi_syst_destroyhook_t) 0 != pfdestroy) + (*pfdestroy) (header); +} + +/** + * Initialize a SyS-T handle. + * + * @param header Pointer to library state or NULL to use shared default. + * @param svh Pointer to new/uninitialized SyS-T handle + * @param origin Value passed to the the platform handle init function + * @param fromHeap 1 of heap allocated handle, 0 otherwise + */ +MIPI_SYST_EXPORT struct mipi_syst_handle* MIPI_SYST_CALLCONV +mipi_syst_init_handle( + struct mipi_syst_header* header, + struct mipi_syst_handle* svh, + const struct mipi_syst_origin *origin, + mipi_syst_u32 fromHeap) +{ + if ((struct mipi_syst_handle*) 0 == svh) + return svh; + + + if (0 == header) { + /* No user supplied global state storage, + * use internal default state + */ + header = &syst_hdr; + } + + *svh = zero.handle; + + svh->systh_header = header; + svh->systh_flags.shf_alloc = fromHeap ? 1 : 0; + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + + if (0 != origin) + { + MIPI_SYST_SET_HANDLE_ORIGIN(svh, *origin); + } +#endif + + /* call platform handle initialization hook if defined + */ +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + if ((mipi_syst_inithandle_hook_t) 0 != svh->systh_header->systh_inith) + svh->systh_header->systh_inith(svh); +#endif + return svh; +} + +/** + * Release a SyS-T handle. + * + * @param svh Pointer to initialized SyS-T handle + */ +MIPI_SYST_EXPORT void MIPI_SYST_CALLCONV mipi_syst_delete_handle(struct mipi_syst_handle* svh) +{ + if ((struct mipi_syst_handle*) 0 != svh) { +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + /* call platform handle release hook if defined + */ + if ((mipi_syst_releasehandle_hook_t) 0 != + svh->systh_header->systh_releaseh) + svh->systh_header->systh_releaseh(svh); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) + if (0 != svh->systh_flags.shf_alloc) { + MIPI_SYST_HEAP_FREE(svh); + } else +#endif + { + *svh = zero.handle; + } + } +} \ No newline at end of file diff --git a/library/src/mipi_syst_inline.c b/library/src/mipi_syst_inline.c new file mode 100644 index 0000000..ca22ef0 --- /dev/null +++ b/library/src/mipi_syst_inline.c @@ -0,0 +1,48 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst.h" + +/* Include inline function in this cpp file if functions inline + * support is disabled by the platform define + * MIPI_SYST_PCFG_ENABLE_INLINE. + * Implementation will then use true functions to save code space. + */ +#if !defined(MIPI_SYST_PCFG_ENABLE_INLINE) +#include "mipi_syst/inline.h" +#endif \ No newline at end of file diff --git a/library/src/mipi_syst_writer.c b/library/src/mipi_syst_writer.c new file mode 100644 index 0000000..3120ff3 --- /dev/null +++ b/library/src/mipi_syst_writer.c @@ -0,0 +1,219 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ +#include "mipi_syst.h" +#include "mipi_syst/message.h" +#include "mipi_syst/crc32.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) + + /** scatter write routine + * + * This function implements the scatter write algorithm that translates + * the logical SyS-T memory descriptor representation into output + * requests. The actual output routines are defined through + * the MIPI_SYST_OUTPUT_* definitions from the platform header file. + * + * @param systh used syst handle + * @param scatterprog message content write instructions + * @param pdesc pointer to memory area with message data + */ +void mipi_syst_scatter_write(struct mipi_syst_handle* systh, + struct mipi_syst_scatter_prog *scatterprog, const void *pdesc) +{ + unsigned int repeat; + + /* Define an "any" size integer pointer to avoid casts and to simplify + * type based incrementing + */ + union { + const void *vp; + const mipi_syst_u8 *bp; + const mipi_syst_u16 *hp; + const mipi_syst_u32 *wp; + const mipi_syst_u64 *dp; + } data; + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) +#define IFDO(a, b) { if (a) do { b; } while (0); } + + mipi_syst_u32 crc; + int use_crc; + + use_crc = systh->systh_tag.et_chksum; + crc = MIPI_SYST_CRC32_INIT(0); +#else + +#define IFDO(a, b) + /* no checksump computation support */ +#endif + + /* Write the "always" present tag field as a time-stamped D32 */ + MIPI_SYST_OUTPUT_D32TS(systh, *(mipi_syst_u32 *)pdesc); + + IFDO(use_crc, MIPI_SYST_CRC32_U32(crc, *(mipi_syst_u32 *)pdesc)); + + /* Run the message scatter write program to dump the message contents + */ + while (scatterprog->sso_opcode != MIPI_SYST_SCATTER_OP_END) { + repeat = scatterprog->sso_length; + data.vp = pdesc; + data.bp += scatterprog->sso_offset; + + switch (scatterprog->sso_opcode) { + case MIPI_SYST_SCATTER_OP_8BIT: + do { + MIPI_SYST_OUTPUT_D8(systh, *data.bp); + IFDO(use_crc, + MIPI_SYST_CRC32_U8(crc, *data.bp)); + ++data.bp; + } while (--repeat); + break; + + case MIPI_SYST_SCATTER_OP_16BIT: + do { + MIPI_SYST_OUTPUT_D16(systh, *data.hp); + IFDO(use_crc, + MIPI_SYST_CRC32_U16(crc, *data.hp)); + ++data.hp; + } while (--repeat); + break; + + case MIPI_SYST_SCATTER_OP_32BIT: + do { + MIPI_SYST_OUTPUT_D32(systh, *data.wp); + IFDO(use_crc, + MIPI_SYST_CRC32_U32(crc, *data.wp)); + ++data.wp; + } while (--repeat); + break; + + + case MIPI_SYST_SCATTER_OP_64BIT: + do { +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + MIPI_SYST_OUTPUT_D64(systh, *data.dp); +#else +#if defined(MIPI_SYST_BIG_ENDIAN) + MIPI_SYST_OUTPUT_D32(systh, data.wp[1]); + MIPI_SYST_OUTPUT_D32(systh, data.wp[0]); +#else + MIPI_SYST_OUTPUT_D32(systh, data.wp[0]); + MIPI_SYST_OUTPUT_D32(systh, data.wp[1]); +#endif + +#endif /* ! defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) */ + IFDO(use_crc, + MIPI_SYST_CRC32_U64(crc, *data.dp)); + ++data.dp; + } while (--repeat); + break; + + case MIPI_SYST_SCATTER_OP_BLOB: + /* data location is pointer to real data, + * not data itself + */ + data.vp = *(void **)data.vp; + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + + while (repeat >= sizeof(mipi_syst_u64)) { + mipi_syst_u64 v; + v = MIPI_SYST_HTOLE64(*data.dp); + MIPI_SYST_OUTPUT_D64(systh, v); + IFDO(use_crc, + MIPI_SYST_CRC32_U64(crc, v)); + ++data.dp; + repeat -= sizeof(mipi_syst_u64); + } + + if (repeat >= sizeof(mipi_syst_u32)) { + mipi_syst_u32 v; + v = MIPI_SYST_HTOLE32(*data.wp); + MIPI_SYST_OUTPUT_D32(systh, v); + IFDO(use_crc, + MIPI_SYST_CRC32_U32(crc, + *data.wp)); + ++data.wp; + repeat -= sizeof(mipi_syst_u32); + } +#else + while (repeat >= sizeof(mipi_syst_u32)) { + mipi_syst_u32 v; + v = MIPI_SYST_HTOLE32(*data.wp); + MIPI_SYST_OUTPUT_D32(systh, v); + + IFDO(use_crc, + MIPI_SYST_CRC32_U32(crc, v)); + ++data.wp; + repeat -= sizeof(mipi_syst_u32); + } +#endif + if (repeat >= sizeof(mipi_syst_u16)) { + mipi_syst_u16 v; + v = MIPI_SYST_HTOLE16(*data.hp); + MIPI_SYST_OUTPUT_D16(systh, v); + + IFDO(use_crc, + MIPI_SYST_CRC32_U16(crc, v)); + ++data.hp; + repeat -= sizeof(mipi_syst_u16); + } + + if (repeat) { + MIPI_SYST_OUTPUT_D8(systh, + *data.bp); + IFDO(use_crc, + MIPI_SYST_CRC32_U8(crc, *data.bp)); + } + break; + } + ++scatterprog; + } + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + if (use_crc) { + crc = MIPI_SYST_CRC32_GET(crc); + MIPI_SYST_OUTPUT_D32(systh, crc); + } +#endif + + /* EVENT end of record mark */ + MIPI_SYST_OUTPUT_FLAG(systh); +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) */ \ No newline at end of file diff --git a/library/test/CMakeLists.txt b/library/test/CMakeLists.txt new file mode 100644 index 0000000..b1d8aa2 --- /dev/null +++ b/library/test/CMakeLists.txt @@ -0,0 +1,7 @@ +# Google Test unit test framework must be present for tests +# +if (EXISTS "${SYST_BUILD_GTEST_DIR}/include/gtest/gtest.h") + add_subdirectory(unit) +else() + message("WARNING: SYST_BUILD_GTEST_DIR is not set or not pointing to Google Test sources, skipping unit tests ...") +endif () diff --git a/library/test/unit/CMakeLists.txt b/library/test/unit/CMakeLists.txt new file mode 100644 index 0000000..2ac801c --- /dev/null +++ b/library/test/unit/CMakeLists.txt @@ -0,0 +1,58 @@ +#make install of googletest a nop +# +function(install) +endfunction() + +enable_testing() + +add_definitions(-D_VARIADIC_MAX=10) +if (WIN32) + set (gtest_force_shared_crt ON CACHE BOOL "Force GTest to use shared CRT") +endif (WIN32) +add_subdirectory(${SYST_BUILD_GTEST_DIR} ${CMAKE_CURRENT_BINARY_DIR}/gtest) +mark_as_advanced(BUILD_SHARED_LIBS) + +include_directories( + ${SYST_BUILD_GTEST_DIR}/include + ${mipi_syst_Platform_include} + ${mipi_syst_Includes} + ../../platform/src + ../../platform/${SYST_BUILD_PLATFORM_NAME}/src +) + +add_executable(syst_unittest + mipi_syst_gtest_main.cpp + mipi_syst_init_test.cpp + mipi_syst_disable_test.cpp + mipi_syst_clock_test.cpp + mipi_syst_crc32_test.cpp + mipi_syst_catid32_test.cpp + mipi_syst_catid64_test.cpp + mipi_syst_printf_test.cpp + mipi_syst_raw_test.cpp + mipi_syst_string_test.cpp + mipi_syst_build_test.cpp +) + +target_link_libraries(syst_unittest gtest mipi_syst_static) +set_target_properties(syst_unittest PROPERTIES COMPILE_FLAGS "-DMIPI_SYST_EXPORTS") + +foreach (target gtest gtest_main syst_unittest) + set_property(TARGET ${target} PROPERTY FOLDER "Unittests") +endforeach (target) + +add_test( + NAME syst_unittest + COMMAND syst_unittest + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) + + +if (CMAKE_CONFIGURATION_TYPES) + add_custom_target(RUN_TEST_VERBOSE COMMAND ${CMAKE_CTEST_COMMAND} + --force-new-ctest-process --verbose + --build-config "$") +else() + add_custom_target(RUN_TEST_VERBOSE COMMAND ${CMAKE_CTEST_COMMAND} + --force-new-ctest-process --verbose) +endif() \ No newline at end of file diff --git a/library/test/unit/mipi_syst_build_test.cpp b/library/test/unit/mipi_syst_build_test.cpp new file mode 100644 index 0000000..1acaf62 --- /dev/null +++ b/library/test/unit/mipi_syst_build_test.cpp @@ -0,0 +1,193 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) &&\ + defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) &&\ + defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) &&\ + defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) + +class MipiSysTFixtureBuild : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown(){ + MipiSysTFixtureOutput::TearDown(); + } + + const char * mipi_syst_write_build_message( + struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 subtype, + const char * data, + mipi_syst_u16 length) + { + sstr.str(""); + + ::mipi_syst_write_build_message(svh, loc, severity, subtype, data, length); + result = sstr.str(); + + return result.c_str(); + } + + static std::string result; +}; + +std::string MipiSysTFixtureBuild::result; + + +#if defined(MIPI_SYST_PCFG_ENABLE_BUILD_API) +TEST_F(MipiSysTFixtureBuild, syst_build_long) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_BUILD(NULL, MIPI_SYST_SEVERITY_MAX, 0x1122334455667788ull, "some text", 10) + ); + + EXPECT_STREQ( + xform("02012200[typ=0:2 mu=1:2 sev=0 len]0012112233445566778878657420656d6f730074"), + MIPI_SYST_BUILD(ph, MIPI_SYST_SEVERITY_MAX, 0x1122334455667788ull, "some text", 10) + ); + EXPECT_STREQ( + xform("02012200[typ=0:2 mu=1:2 sev=0 len]00081122334455667788"), + MIPI_SYST_BUILD(ph, MIPI_SYST_SEVERITY_MAX, 0x1122334455667788ull, NULL, 0) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012300[typ=0:2 mu=1:2 sev=0 loc len]0312345678aabbccdd0012112233445566778878657420656d6f730074"), + MIPI_SYST_BUILD_LOCADDR(ph, MIPI_SYST_SEVERITY_MAX, 0x1122334455667788ull, "some text", 10) + ); +#else + EXPECT_STREQ( + xform("02012300[typ=0:2 mu=1:2 sev=0 loc len]02123456780012112233445566778878657420656d6f730074"), + MIPI_SYST_BUILD_LOCADDR(ph, MIPI_SYST_SEVERITY_MAX, 0x1122334455667788ull, "some text", 10) + ); + +#endif +#endif + + EXPECT_STREQ( + xform("02012300[typ=0:2 mu=1:2 sev=0 loc len]005678abcd0012112233445566778878657420656d6f730074"), + MIPI_SYST_BUILD_LOC16(ph, MIPI_SYST_SEVERITY_MAX, 0xabcd, 0x1122334455667788ull, "some text", 10) + ); + + EXPECT_STREQ( + xform("02012300[typ=0:2 mu=1:2 sev=0 loc len]0112345678aabbccdd0012112233445566778878657420656d6f730074"), + MIPI_SYST_BUILD_LOC32(ph, MIPI_SYST_SEVERITY_MAX, 0xaabbccdd, 0x1122334455667788ull, "some text", 10) + ); +#endif +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_BUILD_API)*/ + +#endif + +TEST_F(MipiSysTFixtureOutput, syst_build_compact_null) +{ + std::string str; + + MIPI_SYST_BUILD_COMPACT64(0, 0x0000000000000000ull); + str = sstr.str(); + + EXPECT_STREQ( + xform(""), + str.c_str() + ); + + MIPI_SYST_BUILD_COMPACT32(0, 0); + str = sstr.str(); + + EXPECT_STREQ( + xform(""), + str.c_str() + ); +} + +TEST_F(MipiSysTFixtureOutput, syst_build_compact64) +{ + std::string str; + + MIPI_SYST_BUILD_COMPACT64(ph, 0x0000000000000000ull); + str = sstr.str(); + + EXPECT_STREQ( + xform("0000000001000000"), + str.c_str() + ); + sstr.str(""); + + MIPI_SYST_BUILD_COMPACT64(ph, 0x3FFFFFFFFFFFFFull); + str = sstr.str(); + + EXPECT_STREQ( + xform("ffffffffc1fffff0"), + str.c_str() + ); + sstr.str(""); +} + +TEST_F(MipiSysTFixtureOutput, syst_build_compact32) +{ + std::string str; + + MIPI_SYST_BUILD_COMPACT32(ph, 0x00000000ull); + str = sstr.str(); + + EXPECT_STREQ( + xform("00000000"), + str.c_str() + ); + sstr.str(""); + + MIPI_SYST_BUILD_COMPACT32(ph, 0x3FFFFF); + str = sstr.str(); + + EXPECT_STREQ( + xform("c0fffff0"), + str.c_str() + ); + sstr.str(""); +} \ No newline at end of file diff --git a/library/test/unit/mipi_syst_catid32_test.cpp b/library/test/unit/mipi_syst_catid32_test.cpp new file mode 100644 index 0000000..a2e0a27 --- /dev/null +++ b/library/test/unit/mipi_syst_catid32_test.cpp @@ -0,0 +1,532 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) &&\ + defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) &&\ + defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) + +class MipiSysTFixtureCatId32 : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown(){ + MipiSysTFixtureOutput::TearDown(); + } + + const char * mipi_syst_write_catalog32_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u32 catid) + { + static std::string result; + + ::mipi_syst_write_catalog32_message(svh, loc, severity, catid); + result = sstr.str(); + sstr.str(""); + + return result.c_str(); + } +}; + +TEST_F(MipiSysTFixtureCatId32, syst_catid32_basic) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_0(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_1(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE,1 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_2(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_3(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_4(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_5(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2,3,4,5 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_6(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2,3,4,5,6 ) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_0_LOC16(0,MIPI_SYST_SEVERITY_WARNING, 1, 0xCAFEBABE ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_0_LOC32(0,MIPI_SYST_SEVERITY_WARNING, 1, 0xCAFEBABE ) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG32_0_LOCADDR(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); +#endif +#endif +} + +TEST_F(MipiSysTFixtureCatId32, syst_catid32_noloc_output) +{ + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0004cafebabe"), + MIPI_SYST_CATALOG32_0(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0008cafebabe00000001"), + MIPI_SYST_CATALOG32_1(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]000ccafebabe0000000200000001"), + MIPI_SYST_CATALOG32_2(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0010cafebabe000000020000000100000003"), + MIPI_SYST_CATALOG32_3(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG32_4(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG32_5(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG32_6(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4, 5, 6) + ); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +TEST_F(MipiSysTFixtureCatId32, syst_catid32_locaddr_output) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0004cafebabe"), + MIPI_SYST_CATALOG32_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780004cafebabe"), + MIPI_SYST_CATALOG32_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0008cafebabe00000001"), + MIPI_SYST_CATALOG32_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780008cafebabe00000001"), + MIPI_SYST_CATALOG32_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd000ccafebabe0000000200000001"), + MIPI_SYST_CATALOG32_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0212345678000ccafebabe0000000200000001"), + MIPI_SYST_CATALOG32_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0010cafebabe000000020000000100000003"), + MIPI_SYST_CATALOG32_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780010cafebabe000000020000000100000003"), + MIPI_SYST_CATALOG32_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG32_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG32_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG32_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4, 5) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG32_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4, 5) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG32_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4, 5, 6) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0212345678001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG32_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4, 5, 6) + ); +#endif +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + +TEST_F(MipiSysTFixtureCatId32, syst_catid32_loc16_output) +{ + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0004cafebabe"), + MIPI_SYST_CATALOG32_0_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0008cafebabe00000001"), + MIPI_SYST_CATALOG32_1_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, 1) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd000ccafebabe0000000200000001"), + MIPI_SYST_CATALOG32_2_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, 1, 2) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0010cafebabe000000020000000100000003"), + MIPI_SYST_CATALOG32_3_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, 1, 2, 3) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG32_4_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG32_5_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG32_6_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, 1, 2, 3, 4, 5, 6) + ); +} + +TEST_F(MipiSysTFixtureCatId32, syst_catid32_loc32_output) +{ + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0004cafebabe"), + MIPI_SYST_CATALOG32_0_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0008cafebabe00000001"), + MIPI_SYST_CATALOG32_1_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, 1) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd000ccafebabe0000000200000001"), + MIPI_SYST_CATALOG32_2_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, 1, 2) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0010cafebabe000000020000000100000003"), + MIPI_SYST_CATALOG32_3_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, 1, 2, 3) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG32_4_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG32_5_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG32_6_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, 1, 2, 3, 4, 5, 6) + ); +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + + +TEST_F(MipiSysTFixtureCatId32, syst_catprintf32_noloc_output) +{ + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0004cafebabe"), + MIPI_SYST_CATPRINTF32_0(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy" ) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0008cafebabe00000001"), + MIPI_SYST_CATPRINTF32_1(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]000ccafebabe0000000200000001"), + MIPI_SYST_CATPRINTF32_2(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0010cafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF32_3(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF32_4(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF32_5(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("01012233[typ=3:1 mu=1:2 sev=3 len]001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF32_6(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5, 6) + ); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +TEST_F(MipiSysTFixtureCatId32, syst_catprintf32_locaddr_output) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0004cafebabe"), + MIPI_SYST_CATPRINTF32_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy") + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780004cafebabe"), + MIPI_SYST_CATPRINTF32_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy") + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0008cafebabe00000001"), + MIPI_SYST_CATPRINTF32_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780008cafebabe00000001"), + MIPI_SYST_CATPRINTF32_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd000ccafebabe0000000200000001"), + MIPI_SYST_CATPRINTF32_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0212345678000ccafebabe0000000200000001"), + MIPI_SYST_CATPRINTF32_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0010cafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF32_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780010cafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF32_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF32_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF32_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF32_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]02123456780018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF32_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0312345678aabbccdd001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF32_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5, 6) + ); +#else + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0212345678001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF32_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5, 6) + ); +#endif +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + +TEST_F(MipiSysTFixtureCatId32, syst_catprintf2_loc16_output) +{ + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0004cafebabe"), + MIPI_SYST_CATPRINTF32_0_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy") + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0008cafebabe00000001"), + MIPI_SYST_CATPRINTF32_1_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy", 1) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd000ccafebabe0000000200000001"), + MIPI_SYST_CATPRINTF32_2_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy", 1, 2) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0010cafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF32_3_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy", 1, 2, 3) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF32_4_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy", 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF32_5_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]005678abcd001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF32_6_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5, 6) + ); +} + +TEST_F(MipiSysTFixtureCatId32, syst_catprintf32_loc32_output) +{ + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0004cafebabe"), + MIPI_SYST_CATPRINTF32_0_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy") + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0008cafebabe00000001"), + MIPI_SYST_CATPRINTF32_1_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy", 1) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd000ccafebabe0000000200000001"), + MIPI_SYST_CATPRINTF32_2_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy", 1, 2) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0010cafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF32_3_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy", 1, 2, 3) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0014cafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF32_4_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy", 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd0018cafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF32_5_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("01012333[typ=3:1 mu=1:2 sev=3 loc len]0112345678aabbccdd001ccafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF32_6_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xCAFEBABE, "dummy", 1, 2, 3, 4, 5, 6) + ); +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD +#endif //MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA && MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE && MIPI_SYST_PCFG_ENABLE_CATID32_API \ No newline at end of file diff --git a/library/test/unit/mipi_syst_catid64_test.cpp b/library/test/unit/mipi_syst_catid64_test.cpp new file mode 100644 index 0000000..8842632 --- /dev/null +++ b/library/test/unit/mipi_syst_catid64_test.cpp @@ -0,0 +1,530 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) && defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) && defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +class MipiSysTFixtureCatId64 : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown(){ + MipiSysTFixtureOutput::TearDown(); + } + + const char * mipi_syst_write_catalog64_message(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u64 catid) + { + static std::string result; + + ::mipi_syst_write_catalog64_message(svh, loc, severity, catid); + result = sstr.str(); + sstr.str(""); + + return result.c_str(); + } +}; + +TEST_F(MipiSysTFixtureCatId64, syst_catid64_basic) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_0(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_1(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE,1 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_2(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_3(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_4(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2, 3, 4 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_5(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2,3,4,5 ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_6(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE, 1, 2,3,4,5,6 ) + ); +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_0_LOC16(0,MIPI_SYST_SEVERITY_WARNING, 1, 0xCAFEBABE ) + ); + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_0_LOC32(0,MIPI_SYST_SEVERITY_WARNING, 1, 0xCAFEBABE ) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATALOG64_0_LOCADDR(0,MIPI_SYST_SEVERITY_WARNING, 0xCAFEBABE) + ); +#endif +#endif +} + +TEST_F(MipiSysTFixtureCatId64, syst_catid64_noloc_output) +{ + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0008000decafcafebabe"), + MIPI_SYST_CATALOG64_0(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]000c000decafcafebabe00000001"), + MIPI_SYST_CATALOG64_1(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATALOG64_2(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATALOG64_3(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG64_4(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG64_5(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG64_6(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5, 6) + ); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +TEST_F(MipiSysTFixtureCatId64, syst_catid64_locaddr_output) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0008000decafcafebabe"), + MIPI_SYST_CATALOG64_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780008000decafcafebabe"), + MIPI_SYST_CATALOG64_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd000c000decafcafebabe00000001"), + MIPI_SYST_CATALOG64_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0212345678000c000decafcafebabe00000001"), + MIPI_SYST_CATALOG64_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATALOG64_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780010000decafcafebabe0000000200000001"), + MIPI_SYST_CATALOG64_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATALOG64_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATALOG64_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG64_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG64_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG64_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0212345678001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG64_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG64_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5, 6) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG64_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5, 6) + ); +#endif +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + +TEST_F(MipiSysTFixtureCatId64, syst_catid64_loc16_output) +{ + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0008000decafcafebabe"), + MIPI_SYST_CATALOG64_0_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd000c000decafcafebabe00000001"), + MIPI_SYST_CATALOG64_1_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, 1) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATALOG64_2_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, 1, 2) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATALOG64_3_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, 1, 2, 3) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG64_4_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG64_5_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG64_6_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5, 6) + ); +} + +TEST_F(MipiSysTFixtureCatId64, syst_catid64_loc32_output) +{ + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0008000decafcafebabe"), + MIPI_SYST_CATALOG64_0_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd000c000decafcafebabe00000001"), + MIPI_SYST_CATALOG64_1_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, 1) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATALOG64_2_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, 1, 2) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATALOG64_3_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, 1, 2, 3) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATALOG64_4_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATALOG64_5_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATALOG64_6_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, 1, 2, 3, 4, 5, 6) + ); +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + + +TEST_F(MipiSysTFixtureCatId64, syst_printf64_noloc_output) +{ + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0008000decafcafebabe"), + MIPI_SYST_CATPRINTF64_0(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy") + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]000c000decafcafebabe00000001"), + MIPI_SYST_CATPRINTF64_1(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATPRINTF64_2(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF64_3(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF64_4(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF64_5(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("02012233[typ=3:2 mu=1:2 sev=3 len]0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF64_6(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5, 6) + ); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +TEST_F(MipiSysTFixtureCatId64, syst_printf64_locaddr_output) +{ +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0008000decafcafebabe"), + MIPI_SYST_CATPRINTF64_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy") + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780008000decafcafebabe"), + MIPI_SYST_CATPRINTF64_0_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy") + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd000c000decafcafebabe00000001"), + MIPI_SYST_CATPRINTF64_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0212345678000c000decafcafebabe00000001"), + MIPI_SYST_CATPRINTF64_1_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATPRINTF64_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780010000decafcafebabe0000000200000001"), + MIPI_SYST_CATPRINTF64_2_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF64_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF64_3_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF64_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF64_4_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF64_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0212345678001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF64_5_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5) + ); +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0312345678aabbccdd0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF64_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5, 6) + ); +#else + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]02123456780020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF64_6_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5, 6) + ); +#endif +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + +TEST_F(MipiSysTFixtureCatId64, syst_printf64_loc16_output) +{ + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0008000decafcafebabe"), + MIPI_SYST_CATPRINTF64_0_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy") + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd000c000decafcafebabe00000001"), + MIPI_SYST_CATPRINTF64_1_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy", 1) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATPRINTF64_2_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy", 1, 2) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF64_3_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF64_4_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF64_5_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]005678abcd0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF64_6_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5, 6) + ); +} + +TEST_F(MipiSysTFixtureCatId64, syst_printf64_loc32_output) +{ + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0008000decafcafebabe"), + MIPI_SYST_CATPRINTF64_0_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy") + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd000c000decafcafebabe00000001"), + MIPI_SYST_CATPRINTF64_1_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy", 1) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0010000decafcafebabe0000000200000001"), + MIPI_SYST_CATPRINTF64_2_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy", 1, 2) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0014000decafcafebabe000000020000000100000003"), + MIPI_SYST_CATPRINTF64_3_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0018000decafcafebabe00000002000000010000000400000003"), + MIPI_SYST_CATPRINTF64_4_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd001c000decafcafebabe0000000200000001000000040000000300000005"), + MIPI_SYST_CATPRINTF64_5_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5) + ); + + EXPECT_STREQ( + xform("02012333[typ=3:2 mu=1:2 sev=3 loc len]0112345678aabbccdd0020000decafcafebabe000000020000000100000004000000030000000600000005"), + MIPI_SYST_CATPRINTF64_6_LOC32(ph, MIPI_SYST_SEVERITY_WARNING, 0xaabbccdd, 0xDECAFCAFEBABEull, "dummy", 1, 2, 3, 4, 5, 6) + ); +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + +#endif //MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA && MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE && MIPI_SYST_PCFG_ENABLE_CATID64_API \ No newline at end of file diff --git a/library/test/unit/mipi_syst_clock_test.cpp b/library/test/unit/mipi_syst_clock_test.cpp new file mode 100644 index 0000000..384a289 --- /dev/null +++ b/library/test/unit/mipi_syst_clock_test.cpp @@ -0,0 +1,92 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) &&\ + defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) &&\ + defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + +class MipiSysTFixtureClock : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown(){ + MipiSysTFixtureOutput::TearDown(); + } + + const char * mipi_syst_write_clock(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_clock fmt, + mipi_syst_u64 clock, + mipi_syst_u64 freq) + { + static std::string result; + + ::mipi_syst_write_clock(svh, loc,fmt, clock, freq); + result = sstr.str(); + sstr.str(""); + + return result.c_str(); + } +}; + +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) +TEST_F(MipiSysTFixtureClock, syst_clock_sync_null) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_CLOCK_SYNC(NULL, MIPI_SYST_PLATFORM_CLOCK(), MIPI_SYST_PLATFORM_FREQ()) + ); +} +TEST_F(MipiSysTFixtureClock, syst_clock_sync_output) +{ + MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(ph, 0); + + EXPECT_STREQ( + xform("01012208[typ=8:1 mu=1:2 sev=0 len]001012345678aabbccdd00000000000f4240"), + MIPI_SYST_CLOCK_SYNC(ph, MIPI_SYST_PLATFORM_CLOCK(), MIPI_SYST_PLATFORM_FREQ()) + ); +} + +#endif /* defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP)*/ + +#endif \ No newline at end of file diff --git a/library/test/unit/mipi_syst_crc32_test.cpp b/library/test/unit/mipi_syst_crc32_test.cpp new file mode 100644 index 0000000..780903e --- /dev/null +++ b/library/test/unit/mipi_syst_crc32_test.cpp @@ -0,0 +1,138 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ +#include "mipi_syst_gtest.h" + +#ifdef MIPI_SYST_PCFG_ENABLE_CHECKSUM + +#include "../../include/mipi_syst/crc32.h" +#include "../../src/mipi_syst_crc32.c" + +/* Test input data for crc calculation tests. The last value shown +* in the array name is the reference crc32C. +*/ +static mipi_syst_u8 crc_input_u8_0xB5D83007[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; + +static mipi_syst_u16 crc_input_u16_0xAA2741E5[] = { + 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20 +}; + +static mipi_syst_u32 crc_input_u32_0xCDBDE657[] = { + 0x00000000, 0xABCDEF12, 0x12345678, 0xFADEDBAD, 0xAA55AA55 +}; + +static mipi_syst_u64 crc_input_u64_0x61A6DF0B[] = { + 0x1122334455667788ull, 0x1122334455667788ull, 0xABCDEFAABBCCDDEEull, + 0x0000000000000000ull, 0xFFFFFFFFFFFFFFFFull, 0x0101010101010101ull +}; + +class MipiSysTFixtureCrc32 : public testing::Test +{ +public: + void SetUp() { + crc = MIPI_SYST_CRC32_INIT(0); + } + + void TearDown(){ + } + + mipi_syst_u32 crc32_byte_array( mipi_syst_u8 *pData, mipi_syst_u32 bytes) + { + while (bytes--) { + MIPI_SYST_CRC32_U8(crc, *pData++); + } + return MIPI_SYST_CRC32_GET(crc); + } + + mipi_syst_u32 crc32_word_array( mipi_syst_u16 *pData, mipi_syst_u32 words) + { + while (words--) { + MIPI_SYST_CRC32_U16(crc, *pData++); + } + return MIPI_SYST_CRC32_GET(crc); + } + + mipi_syst_u32 crc32_dword_array( mipi_syst_u32 *pData, mipi_syst_u32 dwords) + { + while (dwords--) { + MIPI_SYST_CRC32_U32(crc, *pData++); + } + return MIPI_SYST_CRC32_GET(crc); + } + + mipi_syst_u32 crc32_qword_array( mipi_syst_u64 *pData, mipi_syst_u32 qwords) + { + while (qwords--) { + MIPI_SYST_CRC32_U64(crc, *pData++); + } + return MIPI_SYST_CRC32_GET(crc); + } +protected: + mipi_syst_u32 crc; +}; + +/* Test structure sizes used in binary output processing +*/ +TEST_F(MipiSysTFixtureCrc32, syst_crc32_bytes) +{ + EXPECT_EQ(0xB5D83007 ,crc32_byte_array(crc_input_u8_0xB5D83007 , + sizeof(crc_input_u8_0xB5D83007))) << "MIPI_SYST_CRC32_U8() test"; +} + +TEST_F(MipiSysTFixtureCrc32, syst_crc32_halfwords) +{ + EXPECT_EQ(0xAA2741E5,crc32_word_array((mipi_syst_u16*)crc_input_u16_0xAA2741E5, + sizeof(crc_input_u16_0xAA2741E5) / sizeof(mipi_syst_u16))) << "MIPI_SYST_CRC32_U16() test"; +} + +TEST_F(MipiSysTFixtureCrc32, syst_crc32_dwords) +{ + EXPECT_EQ(0xCDBDE657,crc32_dword_array((mipi_syst_u32*)crc_input_u32_0xCDBDE657, + sizeof(crc_input_u32_0xCDBDE657) / sizeof(mipi_syst_u32))) << "MIPI_SYST_CRC32_U32() test"; +} + +TEST_F(MipiSysTFixtureCrc32, syst_crc32_quadwords) +{ + EXPECT_EQ(0x61A6DF0B,crc32_qword_array((mipi_syst_u64*)crc_input_u64_0x61A6DF0B, + sizeof(crc_input_u64_0x61A6DF0B) / sizeof(mipi_syst_u64))) << "MIPI_SYST_CRC32_U64() test"; +} + +#endif \ No newline at end of file diff --git a/library/test/unit/mipi_syst_disable_test.cpp b/library/test/unit/mipi_syst_disable_test.cpp new file mode 100644 index 0000000..b33afdc --- /dev/null +++ b/library/test/unit/mipi_syst_disable_test.cpp @@ -0,0 +1,61 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#define MIPI_SYST_DISABLE_ALL + +// Need to rename MipiSysTFixtureBase here as we otherwise link in versions +// of this class with different SYS-T defines. It then becomes unpredictable +// which one is used during linking. +// +#define MipiSysTFixtureBase MipiSysTFixtureBaseDisabled + +#include "mipi_syst_gtest.h" + +TEST_F(MipiSysTFixtureBase, syst_disabled_test) +{ + struct mipi_syst_handle* ph; + + ph = MIPI_SYST_ALLOC_HANDLE((void*)0xC0FFEBABE ); + EXPECT_EQ((struct mipi_syst_handle*)0, MIPI_SYST_ALLOC_HANDLE(xx)); + + MIPI_SYST_SET_HANDLE_MODULE_UNIT(ph, 1,2); + + MIPI_SYST_DEBUG(a, xx, yy , zz); + + MIPI_SYST_DELETE_HANDLE(ph); +} \ No newline at end of file diff --git a/library/test/unit/mipi_syst_gtest.h b/library/test/unit/mipi_syst_gtest.h new file mode 100644 index 0000000..0268711 --- /dev/null +++ b/library/test/unit/mipi_syst_gtest.h @@ -0,0 +1,249 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#include + +#define MIPI_SYST_UNIT_TEST + +#include "mipi_syst.h" + +/* hard code compiler dependend standard defines to fixed values for +* unit test support. Regression tests expect to see these values. +*/ +#undef MIPI_SYST_FUNCTION_NAME +#define MIPI_SYST_FUNCTION_NAME "0123456789" + +#undef MIPI_SYST_LINE +#define MIPI_SYST_LINE 0x12345678 + +#undef MIPI_SYST_FILE +#define MIPI_SYST_FILE "unittest.c" + + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) +#define mipi_syst_return_addr() (void*)0x12345678aabbccdd +#else +#define mipi_syst_return_addr() (void*)0x12345678 +#endif + + +/* replace output handlers with unit test versions +*/ +#undef MIPI_SYST_OUTPUT_D32MTS +#undef MIPI_SYST_OUTPUT_D64MTS +#undef MIPI_SYST_OUTPUT_D32TS +#undef MIPI_SYST_OUTPUT_D8 +#undef MIPI_SYST_OUTPUT_D16 +#undef MIPI_SYST_OUTPUT_D32 +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#undef MIPI_SYST_OUTPUT_D64 +#endif +#undef MIPI_SYST_OUTPUT_FLAG + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) +#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) \ + MipiSysTFixtureOutput::d32mts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D64MTS(syst_handle, data) \ + MipiSysTFixtureOutput::d64mts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) \ + MipiSysTFixtureOutput::d32ts((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D8(syst_handle, data) \ + MipiSysTFixtureOutput::d8((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D16(syst_handle, data) \ + MipiSysTFixtureOutput::d16((syst_handle), (data)) +#define MIPI_SYST_OUTPUT_D32(syst_handle, data) \ + MipiSysTFixtureOutput::d32((syst_handle), (data)) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#define MIPI_SYST_OUTPUT_D64(syst_handle, data) \ + MipiSysTFixtureOutput::d64((syst_handle), (data)) +#endif +#define MIPI_SYST_OUTPUT_FLAG(syst_handle) \ + MipiSysTFixtureOutput::flag((syst_handle)) +#else +#define MIPI_SYST_OUTPUT_D32MTS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D32TS(syst_handle, data) +#define MIPI_SYST_OUTPUT_D8(syst_handle, data) +#define MIPI_SYST_OUTPUT_D16(syst_handle, data) +#define MIPI_SYST_OUTPUT_D32(syst_handle, data) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) +#define MIPI_SYST_OUTPUT_D64(syst_handle, data) +#endif +#define MIPI_SYST_OUTPUT_FLAG(syst_handle) +#endif // MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA + +class MipiSysTFixtureBase : public testing::Test +{ +public: + void SetUp() { + MIPI_SYST_INIT(mipi_syst_platform_init, (void*)0);} + + void TearDown(){ + MIPI_SYST_SHUTDOWN(mipi_syst_platform_destroy); + } + + static struct mipi_syst_origin origin; +}; + +class MipiSysTFixtureOutput : public MipiSysTFixtureBase +{ +public: + void SetUp() { + MipiSysTFixtureBase::SetUp(); + + ph = MIPI_SYST_INIT_HANDLE(&sh, &origin); + MIPI_SYST_SET_HANDLE_MODULE_UNIT(ph, 1,2); + MIPI_SYST_ENABLE_HANDLE_LENGTH(ph, 1); + + sstr.str(""); + } + + void TearDown(){ + MIPI_SYST_DELETE_HANDLE(ph); + + MipiSysTFixtureBase::TearDown(); + } + +public: + struct mipi_syst_handle sh; + struct mipi_syst_handle* ph; + + static std::stringstream sstr; + std::string x4m; + + /* unit test IO driver function to print the access output into local string */ + static void d64(struct mipi_syst_handle* systh, mipi_syst_u64 v) + { sstr << ""<< std::hex << std::setfill('0') << std::setw(16) << v; } + static void d32(struct mipi_syst_handle* systh, mipi_syst_u32 v) + { sstr << ""<< std::hex << std::setfill('0') << std::setw(8) << v; } + static void d16(struct mipi_syst_handle* systh, mipi_syst_u16 v) + { sstr << ""<< std::hex << std::setfill('0') << std::setw(4) << v; } + static void d8(struct mipi_syst_handle* systh, mipi_syst_u8 v) + { sstr << ""<< std::hex << std::setfill('0') << std::setw(2) << (mipi_syst_u16)v; } + static void d32ts(struct mipi_syst_handle* systh, mipi_syst_u32 v) + { + sstr << ""<< std::hex << std::setfill('0') << std::setw(8) << v; + union { + mipi_syst_u32 val; + struct mipi_syst_msg_tag tag; + }u = { v }; + + sstr << "[typ=" << u.tag.et_type << ":" << u.tag.et_subtype + << " mu=" << (u.tag.et_modunit >> 4) << ":" << (u.tag.et_modunit & 0xF) + << " sev=" << u.tag.et_severity; + + if (u.tag.et_res7) sstr << " res7"; + if (u.tag.et_location) sstr << " loc"; + if (u.tag.et_res30) sstr << " res30"; + if (u.tag.et_length) sstr << " len"; + if (u.tag.et_chksum) sstr << " chk"; + sstr << "]"; + } + static void d32mts(struct mipi_syst_handle* systh, mipi_syst_u32 v) + { sstr << ""<< std::hex << std::setfill('0') << std::setw(8) << v; } + static void d64mts(struct mipi_syst_handle* systh, mipi_syst_u64 v) + { sstr << ""<< std::hex << std::setfill('0') << std::setw(16) << v; } + static void flag(struct mipi_syst_handle* systh) + { sstr << ""; } + + /* output string transformation to match platform properties */ + const char* xform(const char* input) + { + size_t pos(0); + x4m=input; +#if !defined(MIPI_SYST_PCFG_ENABLE_64BIT_IO) + pos = std::string::npos; + while((pos=x4m.find("")) != std::string::npos){ + std::string val = x4m.substr(pos+5,16); + std::string upperVal = val.substr(8,8); + std::string lowerVal = val.substr(0,8); + std::string replacement = ""; + replacement += upperVal; + replacement += ""; + replacement += lowerVal; + x4m.erase(pos,21); + x4m.insert(pos,replacement); + } +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + /* need to adapt 32bit catalog type for 64bit packing settings */ + pos = x4m.find("[typ=3:1 "); + if (pos != std::string::npos) { + x4m.replace(pos, 9, std::string("[typ=3:5 ")); + x4m.replace(0, 9, std::string("05")); + } + + /* need to adapt 64bit catalog type for 64bit packing settings */ + pos = x4m.find("[typ=3:2 "); + if (pos != std::string::npos) { + x4m.replace(pos, 9, std::string("[typ=3:6 ")); + x4m.replace(0, 9, std::string("06")); + } + + pos = x4m.find("[typ=2:b "); + if (pos != std::string::npos) { + x4m.replace(pos, 9, std::string("[typ=2:c ")); + x4m.replace(0, 9, std::string("0c")); + } +#endif +#if !defined(MIPI_SYST_PCFG_LENGTH_FIELD) + /* take out len parts from comparsion string */ + pos = x4m.find(" len"); + if (pos != std::string::npos) { + x4m.replace(pos, 4, ""); + + std::stringstream sstr(x4m.substr(7, 8)); + mipi_syst_u32 tag; + sstr >> std::hex >> tag; + tag &= ~(1 << 9); + sstr.str(std::string()); + sstr.clear(); + sstr << std::hex << std::setfill('0') << std::setw(8) + << std::noshowbase << tag; + x4m.replace(7, 8, sstr.str()); + + pos = x4m.find(""); + if (pos != std::string::npos) { + x4m.replace(pos, 9, ""); + } + } +#endif + + return x4m.c_str(); + } +}; diff --git a/library/test/unit/mipi_syst_gtest_main.cpp b/library/test/unit/mipi_syst_gtest_main.cpp new file mode 100644 index 0000000..f709a91 --- /dev/null +++ b/library/test/unit/mipi_syst_gtest_main.cpp @@ -0,0 +1,46 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "gtest/gtest.h" + +int main(int argc, char * argv[]) +{ + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/library/test/unit/mipi_syst_init_test.cpp b/library/test/unit/mipi_syst_init_test.cpp new file mode 100644 index 0000000..16abc5e --- /dev/null +++ b/library/test/unit/mipi_syst_init_test.cpp @@ -0,0 +1,432 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#include "../../src/mipi_syst_init.c" +#include "mipi_syst_platform.c" +#include "../../src/mipi_syst_writer.c" + +std::stringstream MipiSysTFixtureOutput::sstr; + +struct mipi_syst_origin MipiSysTFixtureBase::origin = MIPI_SYST_GEN_ORIGIN_MODULE(1, 2); + +/* Test structure sizes used in binary output processing +*/ +TEST_F(MipiSysTFixtureBase, syst_structure_sizes) +{ + EXPECT_EQ(1, sizeof(mipi_syst_u8)) << "mipi_syst_u8 not 1 byte long"; + EXPECT_EQ(2, sizeof(mipi_syst_u16)) << "mipi_syst_u16 not 2 byte long"; + EXPECT_EQ(4, sizeof(mipi_syst_u32)) << "mipi_syst_u32 not 4 byte long"; + EXPECT_EQ(8, sizeof(mipi_syst_u64)) << "mipi_syst_u64 not 8 byte long"; + + EXPECT_EQ(1, sizeof(mipi_syst_s8)) << "mipi_syst_s8 not 1 byte long"; + EXPECT_EQ(2, sizeof(mipi_syst_s16)) << "mipi_syst_s16 not 2 byte long"; + EXPECT_EQ(4, sizeof(mipi_syst_s32)) << "mipi_syst_s32 not 4 byte long"; + EXPECT_EQ(8, sizeof(mipi_syst_s64)) << "mipi_syst_s64 not 8 byte long"; + + EXPECT_EQ(16, sizeof(struct mipi_syst_guid)) << "struct mipi_syst_guid not 16 byte long"; + + EXPECT_EQ(4, sizeof(struct mipi_syst_msg_tag)) << "struct mipi_syst_msg_tag must be 32bit"; + EXPECT_EQ(4, sizeof(struct mipi_syst_scatter_prog )) << "syst_scatter_prog_t must be 32bit"; + EXPECT_EQ(4, sizeof(union mipi_syst_msglocation32)) << "mipi_syst_msglocation32 must be 32bit"; + EXPECT_EQ(8, sizeof(union mipi_syst_msglocation64)) << "mipi_syst_msglocation64 must be 64bit"; +} + +TEST_F(MipiSysTFixtureBase, syst_little_endian_swap) +{ + union { mipi_syst_u16 v; mipi_syst_u8 b[2]; } v16 = { MIPI_SYST_HTOLE16(0x1234) }; + EXPECT_EQ(v16.b[0], 0x34); + EXPECT_EQ(v16.b[1], 0x12); + + union { mipi_syst_u32 v; mipi_syst_u8 b[4]; } v32 = { MIPI_SYST_HTOLE32(0x12345678) }; + EXPECT_EQ(v32.b[0], 0x78); + EXPECT_EQ(v32.b[1], 0x56); + EXPECT_EQ(v32.b[2], 0x34); + EXPECT_EQ(v32.b[3], 0x12); + + union { mipi_syst_u64 v; mipi_syst_u8 b[8]; } v64 = { MIPI_SYST_HTOLE64(0x12345678AABBCCDDull) }; + EXPECT_EQ(v64.b[0], 0xDD); + EXPECT_EQ(v64.b[1], 0xCC); + EXPECT_EQ(v64.b[2], 0xBB); + EXPECT_EQ(v64.b[3], 0xAA); + EXPECT_EQ(v64.b[4], 0x78); + EXPECT_EQ(v64.b[5], 0x56); + EXPECT_EQ(v64.b[6], 0x34); + EXPECT_EQ(v64.b[7], 0x12); +} + + +/* test header bitfield alignment*/ +TEST_F(MipiSysTFixtureBase, syst_header_bit_alignment) +{ + union { + mipi_syst_msg_tag tag; + mipi_syst_u32 val; + mipi_syst_u8 b[4]; + } native, little; + + little.val = native.val = 0; + native.tag.et_type = 0xF; + little.b[0] = 0xF; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (type)"; + + little.val = native.val = 0; + native.tag.et_severity = 0x7; + little.b[0] = 0x7<< 4; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (severity)"; + + little.val = native.val = 0; + native.tag.et_res7 = 1; + little.b[0] = 0x80; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (res7)"; + + little.val = native.val = 0; + native.tag.et_location = 1; + little.b[1] = 1; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (location)"; + + little.val = native.val = 0; + native.tag.et_length = 1; + little.b[1] = 1<<1; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (length)"; + + little.val = native.val = 0; + native.tag.et_chksum = 1; + little.b[1] = 1<<2; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (chksum)"; + + little.val = native.val = 0; + native.tag.et_timestamp = 1; + little.b[1] = 1<<3; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (timestamp)"; + + little.val = native.val = 0; + native.tag.et_modunit = 0x7FF; + little.b[1] = 0xF << 4; + little.b[2] = 0x7F; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (origin)"; + + little.val = native.val = 0; + native.tag.et_guid = 1; + little.b[2] = 0x80; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (guid)"; + + little.val = native.val = 0; + native.tag.et_subtype = 0x3F; + little.b[3] = 0x3F; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (subtype)"; + + little.val = native.val = 0; + native.tag.et_res30 = 1; + little.b[3] = 0x40; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (res30)"; + + little.val = native.val = 0; + native.tag.et_res31 = 1; + little.b[3] = 0x80; + EXPECT_EQ(little.val, MIPI_SYST_HTOLE32(native.val)) << "mipi_syst_msg_tag bit alignment wrong (res31)"; +} + +/* Check initialization of global state +*/ +TEST_F(MipiSysTFixtureBase, syst_global_state_creation) +{ + struct mipi_syst_header* ph = &syst_hdr; + + EXPECT_EQ(ph->systh_version, MIPI_SYST_VERSION_CODE) << "syst header has unexpected version"; +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + EXPECT_EQ(ph->systh_inith, &platform_handle_init) << "syst header handle init hook wrong"; + EXPECT_EQ(ph->systh_releaseh, &platform_handle_release) << "syst header handle release hook wrong"; +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) + EXPECT_EQ(ph->systh_writer, &mipi_syst_scatter_write) << "syst header writer function wrong "; +#endif +} + +TEST_F(MipiSysTFixtureBase, syst_custom_state_creation) +{ + struct mipi_syst_header custom_hdr; + + MIPI_SYST_INIT_STATE(&custom_hdr, mipi_syst_platform_init, (void*)0); + + EXPECT_EQ(custom_hdr.systh_version, MIPI_SYST_VERSION_CODE) << "syst header has unexpected version"; +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_HANDLE_DATA) + EXPECT_EQ(custom_hdr.systh_inith, &platform_handle_init) << "syst header handle init hook wrong"; + EXPECT_EQ(custom_hdr.systh_releaseh, &platform_handle_release) << "syst header handle release hook wrong"; +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) + EXPECT_EQ(custom_hdr.systh_writer, &mipi_syst_scatter_write) << "syst header writer function wrong "; +#endif + + MIPI_SYST_SHUTDOWN_STATE(&custom_hdr, mipi_syst_platform_destroy); +} + +/* Check initialization of handle state +*/ +TEST_F(MipiSysTFixtureBase, syst_handle_static_creation) +{ + struct mipi_syst_handle sh; + struct mipi_syst_handle* ph; + + ph = MIPI_SYST_INIT_HANDLE(&sh, NULL); + MIPI_SYST_SET_HANDLE_MODULE_UNIT(ph, 1,2); + + ASSERT_EQ(ph, &sh) << "static allocation did not return passed pointer"; + + EXPECT_EQ(&syst_hdr, ph->systh_header) << "header not set in handle"; + EXPECT_EQ(0, ph->systh_flags.shf_alloc) << "handle indicates allocation, but is static"; + EXPECT_EQ(0x012, ph->systh_tag.et_modunit) << "module id not set in handle"; + + MIPI_SYST_DELETE_HANDLE(ph); +} + +TEST_F(MipiSysTFixtureBase, syst_custom_handle_static_creation) +{ + struct mipi_syst_handle sh; + struct mipi_syst_handle* ph; + + struct mipi_syst_header custom_hdr; + MIPI_SYST_INIT_STATE(&custom_hdr, mipi_syst_platform_init, (void*)0); + + ph = MIPI_SYST_INIT_HANDLE_STATE(&custom_hdr, &sh, &origin); + + ASSERT_EQ(ph, &sh) << "static allocation did not return passed pointer"; + + EXPECT_EQ(&custom_hdr, ph->systh_header) << "custom header not set in handle"; + EXPECT_EQ(0, ph->systh_flags.shf_alloc) << "handle indicates allocation, but is static"; +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + EXPECT_EQ(0x012, ph->systh_tag.et_modunit) << "origin id not set in handle"; +#endif + MIPI_SYST_DELETE_HANDLE(ph); + MIPI_SYST_SHUTDOWN_STATE(&custom_hdr, mipi_syst_platform_destroy); +} + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) +TEST_F(MipiSysTFixtureBase, syst_test_guid_origin_handle_creation) +{ + struct mipi_syst_handle sh; + struct mipi_syst_handle* ph; + struct mipi_syst_origin guid_origin = + MIPI_SYST_GEN_ORIGIN_GUID( + 0x494E5443, 0xA2AE, 0x4C70, 0xABB5, 0xD1A79E9CEA35, + 0x7FF); + + ph = MIPI_SYST_INIT_HANDLE(&sh, &guid_origin); + + ASSERT_EQ(ph, &sh) << "static allocation did not return passed pointer"; + + EXPECT_EQ(&syst_hdr, ph->systh_header) << "header not set in handle"; + EXPECT_EQ(0, ph->systh_flags.shf_alloc) << "handle indicates allocation, but is static"; + EXPECT_EQ(0x7FF, ph->systh_tag.et_modunit) << "module id not set in handle"; + EXPECT_EQ(ph->systh_guid.u.ll[0], MIPI_SYST_HTOLE64(guid_origin.guid.u.ll[0])); + EXPECT_EQ(ph->systh_guid.u.ll[1], MIPI_SYST_HTOLE64(guid_origin.guid.u.ll[1])); + MIPI_SYST_DELETE_HANDLE(ph); +} +#endif + +#if defined(MIPI_SYST_PCFG_ENABLE_HEAP_MEMORY) +TEST_F(MipiSysTFixtureBase, syst_handle_dynamic_creation) +{ + struct mipi_syst_handle* ph; + + ph = MIPI_SYST_ALLOC_HANDLE(NULL); + MIPI_SYST_SET_HANDLE_MODULE_UNIT(ph, 1,2); + + ASSERT_NE(ph, (struct mipi_syst_handle*)0) << "allocation failed"; + + EXPECT_EQ(&syst_hdr, ph->systh_header) << "header not set in handle"; + EXPECT_EQ(1, ph->systh_flags.shf_alloc) << "handle indicates static, but is allocated"; + EXPECT_EQ(0x012, ph->systh_tag.et_modunit) << "origin id not set in handle"; + + MIPI_SYST_DELETE_HANDLE(ph); +} + +TEST_F(MipiSysTFixtureBase, syst_custom_handle_dynamic_creation) +{ + struct mipi_syst_handle* ph; + struct mipi_syst_header custom_hdr; + MIPI_SYST_INIT_STATE(&custom_hdr, mipi_syst_platform_init, (void*)0); + + ph = MIPI_SYST_ALLOC_HANDLE_STATE(&custom_hdr, NULL); + MIPI_SYST_SET_HANDLE_MODULE_UNIT(ph, 1,2); + + ASSERT_NE(ph, (struct mipi_syst_handle*)0) << "allocation failed"; + + EXPECT_EQ(&custom_hdr, ph->systh_header) << "custom header not set in handle"; + EXPECT_EQ(1, ph->systh_flags.shf_alloc) << "handle indicates static, but is allocated"; + EXPECT_EQ(0x012, ph->systh_tag.et_modunit) << "origin id not set in handle"; + + MIPI_SYST_DELETE_HANDLE(ph); +} +#endif + +TEST_F(MipiSysTFixtureBase, syst_message_flags) +{ + struct mipi_syst_handle* ph; + struct mipi_syst_header custom_hdr; + MIPI_SYST_INIT_STATE(&custom_hdr, mipi_syst_platform_init, (void*)0); + + ph = MIPI_SYST_ALLOC_HANDLE_STATE(&custom_hdr, &origin); + + ASSERT_NE(ph, (struct mipi_syst_handle*)0) << "allocation failed"; + + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + EXPECT_EQ(0,MIPI_SYST_GET_HANDLE_CHECKSUM(ph)); + + MIPI_SYST_ENABLE_HANDLE_CHECKSUM(ph, 1); + EXPECT_NE(0, MIPI_SYST_GET_HANDLE_CHECKSUM(ph)); + + MIPI_SYST_ENABLE_HANDLE_CHECKSUM(ph, 0); + EXPECT_EQ(0, MIPI_SYST_GET_HANDLE_CHECKSUM(ph)); +#endif +#if defined(MIPI_SYST_PCFG_ENABLE_TIMESTAMP) + EXPECT_EQ(0,MIPI_SYST_GET_HANDLE_TIMESTAMP(ph)); + + MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(ph, 1); + EXPECT_NE(0, MIPI_SYST_GET_HANDLE_TIMESTAMP(ph)); + + MIPI_SYST_ENABLE_HANDLE_TIMESTAMP(ph, 0); + EXPECT_EQ(0, MIPI_SYST_GET_HANDLE_TIMESTAMP(ph)); +#endif + MIPI_SYST_DELETE_HANDLE(ph); +} + + +TEST_F(MipiSysTFixtureBase, syst_version_macro) +{ + mipi_syst_u32 version = (MIPI_SYST_VERSION_MAJOR<<16) |(MIPI_SYST_VERSION_MINOR<<8)|MIPI_SYST_VERSION_PATCH; + std::stringstream sstr; + sstr << MIPI_SYST_VERSION_MAJOR << "." << MIPI_SYST_VERSION_MINOR << "." << MIPI_SYST_VERSION_PATCH; + std::string verstr(sstr.str()); + + EXPECT_STREQ(verstr.c_str(), MIPI_SYST_VERSION_STRING); + + EXPECT_EQ(MIPI_SYST_VERSION_CODE, version) << "unexpected version code"; + + + ASSERT_LT(MIPI_SYST_MAKE_VERSION_CODE(1,2,3), + MIPI_SYST_MAKE_VERSION_CODE(2,0,0)); + ASSERT_LT(MIPI_SYST_MAKE_VERSION_CODE(1,2,3), + MIPI_SYST_MAKE_VERSION_CODE(1,3,3)); + ASSERT_LT(MIPI_SYST_MAKE_VERSION_CODE(1,2,3), + MIPI_SYST_MAKE_VERSION_CODE(1,2,4)); + + ASSERT_GT(MIPI_SYST_MAKE_VERSION_CODE(1,2,3), + MIPI_SYST_MAKE_VERSION_CODE(0,2,3)); + ASSERT_GT(MIPI_SYST_MAKE_VERSION_CODE(1,2,3), + MIPI_SYST_MAKE_VERSION_CODE(1,1,3)); + ASSERT_GT(MIPI_SYST_MAKE_VERSION_CODE(1,2,3), + MIPI_SYST_MAKE_VERSION_CODE(1,2,2)); +} + +TEST_F(MipiSysTFixtureBase, syst_handle_nullptr) +{ + MIPI_SYST_INIT_HANDLE(0,NULL); + MIPI_SYST_DELETE_HANDLE(0); + + EXPECT_EQ(0,0); // only reached if above calls don't crash +} + +// {1DBBA102-DFFD-4A05-8CED-F744046715ED} + +struct mipi_syst_guid guid1= +{{0x1d, 0xbb, 0xa1, 0x02, 0xdf, 0xfd, 0x4a, 0x05, 0x8c, 0xed, 0xf7, 0x44, 0x4, 0x67, 0x15, 0xed} }; + +struct mipi_syst_guid guid2 = MIPI_SYST_GEN_GUID(0x1DBBA102, 0xDFFD, 0x4A05, 0x8CED, 0xF744046715ED); + +TEST_F(MipiSysTFixtureBase, syst_guid) +{ + union { + struct mipi_syst_guid g; mipi_syst_u64 ll[2]; + } v; + + v.ll[0] = MIPI_SYST_HTOLE64(guid2.u.ll[0]); + v.ll[1] = MIPI_SYST_HTOLE64(guid2.u.ll[1]); + + EXPECT_EQ(guid1.u.b[0], guid2.u.b[0]); + EXPECT_EQ(guid1.u.b[1], guid2.u.b[1]); + EXPECT_EQ(guid1.u.b[2], guid2.u.b[2]); + EXPECT_EQ(guid1.u.b[3], guid2.u.b[3]); + EXPECT_EQ(guid1.u.b[4], guid2.u.b[4]); + EXPECT_EQ(guid1.u.b[5], guid2.u.b[5]); + EXPECT_EQ(guid1.u.b[6], guid2.u.b[6]); + EXPECT_EQ(guid1.u.b[7], guid2.u.b[7]); + EXPECT_EQ(guid1.u.b[8], guid2.u.b[8]); + EXPECT_EQ(guid1.u.b[9], guid2.u.b[9]); + EXPECT_EQ(guid1.u.b[10], guid2.u.b[10]); + EXPECT_EQ(guid1.u.b[11], guid2.u.b[11]); + EXPECT_EQ(guid1.u.b[12], guid2.u.b[12]); + EXPECT_EQ(guid1.u.b[13], guid2.u.b[13]); + EXPECT_EQ(guid1.u.b[14], guid2.u.b[14]); + EXPECT_EQ(guid1.u.b[15], guid2.u.b[15]); +} + +#define LONG_STR \ +"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \ +"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" \ +"ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" \ +"ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + +TEST_F(MipiSysTFixtureBase, syst_hash) +{ + mipi_syst_u32 val1, val2, val3; + + val1 = _MIPI_SYST_HASH_AT_CPP_TIME("", 0); + val2 = _MIPI_SYST_HASH_AT_RUN_TIME("", 0); + EXPECT_EQ(val1, val2); + + EXPECT_EQ(0x0, _MIPI_SYST_HASH_AT_RUN_TIME("", 0)); + EXPECT_EQ(0x19ae84c4, _MIPI_SYST_HASH_AT_RUN_TIME("hello world", 0)); + + val1 = _MIPI_SYST_HASH_AT_CPP_TIME("hello world", 0); + val2 = _MIPI_SYST_HASH_AT_RUN_TIME("hello world", 0); + EXPECT_EQ(val1, val2); + + val1 = _MIPI_SYST_HASH_AT_CPP_TIME(LONG_STR, 0); + val2 = _MIPI_SYST_HASH_AT_RUN_TIME(LONG_STR, 0); + EXPECT_EQ(val1, val2); + + val1 = _MIPI_SYST_HASH_AT_CPP_TIME(LONG_STR, 0); + val2 = _MIPI_SYST_HASH_AT_CPP_TIME(LONG_STR, 1); + val3 = _MIPI_SYST_HASH_AT_CPP_TIME(LONG_STR, 3); + EXPECT_NE(val1, val2); + EXPECT_NE(val1, val3); + EXPECT_NE(val2, val3); +} \ No newline at end of file diff --git a/library/test/unit/mipi_syst_printf_test.cpp b/library/test/unit/mipi_syst_printf_test.cpp new file mode 100644 index 0000000..d9c19bd --- /dev/null +++ b/library/test/unit/mipi_syst_printf_test.cpp @@ -0,0 +1,709 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#include +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) &&\ + defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) &&\ + defined(MIPI_SYST_PCFG_ENABLE_PRINTF_API) + +#define mipi_syst_write_printf_string(a,b,c, ...) \ + (sstr.str(""),\ + ::mipi_syst_write_printf_string(a,b,c, __VA_ARGS__ ),\ + result = sstr.str(),\ + result.c_str()) + +#define mipi_syst_write_printf_catalog64(a,b,c, ...) \ + (sstr.str(""),\ + ::mipi_syst_write_printf_catalog64(a,b,c, __VA_ARGS__ ),\ + result = sstr.str(),\ + result.c_str()) + +#define mipi_syst_write_printf_catalog32(a,b,c, ...) \ + (sstr.str(""),\ + ::mipi_syst_write_printf_catalog32(a,b,c, __VA_ARGS__ ),\ + result = sstr.str(),\ + result.c_str()) + +class MipiSysTFixturePrintf : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown() { + MipiSysTFixtureOutput::TearDown(); + } + + static std::string result; +}; + +std::string MipiSysTFixturePrintf::result; + +TEST_F(MipiSysTFixturePrintf, syst_printf_null) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_PRINTF(0, MIPI_SYST_SEVERITY_INFO, (char*) 0) + ); + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]00076c756e28296c00"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, (char*) 0) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_basic) +{ + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000100"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "") + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0003252500"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%%") + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000e6f77206f6c6c656820646c720021"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "hello world !") + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_invalid) +{ + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]00076c756e28296c00"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, 0) + ); + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]0003622500"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%b", 1) + ); + std::string tooLong(MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE, 'X'); + + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]00205858585858585858585858585858585858585858585858585858585858585858"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, tooLong.c_str(), 1) + ); + + tooLong.resize(MIPI_SYST_PCFG_PRINTF_ARGBUF_SIZE /2); + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]0006252073250073"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%s %s", tooLong.c_str(), tooLong.c_str()) + ); +} +TEST_F(MipiSysTFixturePrintf, syst_printf_flags) +{ + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00081122334400642b25"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%+d", 0x11223344) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00081122334400642d25"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%-d", 0x11223344) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00081122334400642025"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "% d", 0x11223344) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00081122334400642325"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%#d", 0x11223344) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00081122334400643025"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%0d", 0x11223344) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_width) +{ + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00081122334400643325"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%3d", 0x11223344) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000c000000ab00642a2511223344"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%*d", 0xab, 0x11223344) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0012ccdd00642a2e2a25334412345678aabb1122"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%*.*d", 0xaabbccdd, 0x12345678, 0x11223344) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_floatingpoint) +{ + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea006625092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%f", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea004625092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%F", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea006525092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%e", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea004525092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%E", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea006725092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%g", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea006125092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%a", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea004125092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%A", 3.14159265359) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea004725092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%G", 3.14159265359) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000c54442eea00664c25400921fb"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%Lf", (long double)3.14159265359) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_floatingpoint_precison) +{ + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bfb54442eea006625092140"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%f", 3.14159265359) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000c54442eea00663325400921fb"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%3f", 3.14159265359) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0010006630312e313125400921fb54442eea"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%11.10f", 3.14159265359) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0016000a00662a2e2a252eea0000000b000021fb54444009"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%*.*f", 10, 11, 3.14159265359) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_modifier) +{ + unsigned int hh = 0x12; + unsigned short int h = 0x1234; + long int l = (long int)-1; + unsigned long long int ll = 0x1122334455667788ull; + uintmax_t j = 0x1122334455667788ull; + size_t z = (size_t)-1; + ptrdiff_t t = (ptrdiff_t)-1; + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0009000012006468682500"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%hhd", hh) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00080000123400646825"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%hd", h) + ); +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000cffffffff00646c25ffffffff"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%ld", l) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000cffffffff00647a25ffffffff"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%zd", z) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000cffffffff00647425ffffffff"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%td", t) + ); +#else + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0008ffffffff00646c25"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%ld", l) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0008ffffffff00647a25"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%zd", z) + ); + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0008ffffffff00647425"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%td", t) + ); +#endif + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000d66778800646c6c252233445511"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%lld", ll) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000c5566778800646a2511223344"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%jd", j) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_pointer) +{ + void * p = (void*)-1; + + if (sizeof(p) == 8) { + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000bffffffffff007025ffffff"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%p", p) + ); + } else { + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]0007ff007025ffffff"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%p", p) + ); + } +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_char) +{ + char c = 'C'; + wint_t w = 'W'; + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]000743006325000000"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%c", c) + ); + + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00080000005700636c25"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "%lc", w) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_printf_combinations) +{ + EXPECT_STREQ( + xform("0b012242[typ=2:b mu=1:2 sev=4 len]00316a20732520656854766f206465706d7525206568742072656d6974206425207300776f63002e7365000005006e6f6f6d00"), + MIPI_SYST_PRINTF(ph, MIPI_SYST_SEVERITY_INFO, "The %s jumped over the %s %d times.", "cow", "moon", 5) + ); +} +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +TEST_F(MipiSysTFixturePrintf, syst_printf_loc) +{ + EXPECT_STREQ( + xform("0b012342[typ=2:b mu=1:2 sev=4 loc len]005678abcd00316a20732520656854766f206465706d7525206568742072656d6974206425207300776f63002e7365000005006e6f6f6d00"), + MIPI_SYST_PRINTF_LOC16(ph, MIPI_SYST_SEVERITY_INFO, 0xabcd, "The %s jumped over the %s %d times.", "cow", "moon", 5) + ); + + EXPECT_STREQ( + xform("0b012342[typ=2:b mu=1:2 sev=4 loc len]0112345678aabbccdd00316a20732520656854766f206465706d7525206568742072656d6974206425207300776f63002e7365000005006e6f6f6d00"), + MIPI_SYST_PRINTF_LOC32(ph, MIPI_SYST_SEVERITY_INFO, 0xaabbccdd, "The %s jumped over the %s %d times.", "cow", "moon", 5) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("0b012342[typ=2:b mu=1:2 sev=4 loc len]0312345678aabbccdd00316a20732520656854766f206465706d7525206568742072656d6974206425207300776f63002e7365000005006e6f6f6d00"), + MIPI_SYST_PRINTF_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO, "The %s jumped over the %s %d times.", "cow", "moon", 5) + ); +#else + EXPECT_STREQ( + xform("0b012342[typ=2:b mu=1:2 sev=4 loc len]021234567800316a20732520656854766f206465706d7525206568742072656d6974206425207300776f63002e7365000005006e6f6f6d00"), + MIPI_SYST_PRINTF_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO, "The %s jumped over the %s %d times.", "cow", "moon", 5) + ); +#endif +} +#endif // MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +TEST_F(MipiSysTFixturePrintf, syst_catalog64_printf_null) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATPRINTF64(NULL, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, "") + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog64_printf_invalid) +{ + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]000761746163677200"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, -1, -1) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog64_printf_basic) +{ + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]00081122334455667788"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, "") + ); + + // check that formt string is not added into payload + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]00081122334455667788"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, "Hello world") + ); + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c112233445566778800000058"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%c", MIPI_SYST_PARAM_CHAR('X')) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c112233445566778800000058"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%c", MIPI_SYST_PARAM_WCHAR(L'X')) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c1122334455667788abcd1234"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%c", MIPI_SYST_PARAM_INT(0xabcd1234)) + ); + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677881234567887654321"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%lld", MIPI_SYST_PARAM_LONGLONG(0x1234567887654321ull)) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677880000000012345678"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%ld", MIPI_SYST_PARAM_LONG(0x12345678)) + ); + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677881234567887654321"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%z", MIPI_SYST_PARAM_SIZE_T(0x1234567887654321ull)) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677881234567887654321"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%t", MIPI_SYST_PARAM_PTRDIFF_T(0x1234567887654321ull)) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677881234567887654321"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%p", MIPI_SYST_PARAM_PTR(0x1234567887654321ull)) + ); +#else + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c112233445566778812345678"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%ld", MIPI_SYST_PARAM_LONG(0x12345678)) + ); + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c112233445566778812345678"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%z", MIPI_SYST_PARAM_SIZE_T(0x12345678)) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c112233445566778812345678"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%t", MIPI_SYST_PARAM_PTRDIFF_T(0x12345678)) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]000c112233445566778812345678"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%p", MIPI_SYST_PARAM_PTR(0x12345678)) + ); +#endif //defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677884000000000000000"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%f", MIPI_SYST_PARAM_FLOAT((float)2.0)) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677884000000000000000"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%f", MIPI_SYST_PARAM_DOUBLE((double)2.0)) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001011223344556677884000000000000000"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788ull, + "%lf", MIPI_SYST_PARAM_LONGDOUBLE((long double)2.0)) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog64_printf_string) +{ + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]0009112233445566778800"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, + "%s", MIPI_SYST_PARAM_CSTR("")) + ); + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001611223344556677886f77206f6c6c656820646c720021"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, + "%s", MIPI_SYST_PARAM_CSTR("hello world !")) + ); + + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]00351122334455667788333300323200310035003434343400333636360035353535373737370036363638383838003737373838383800"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, + "%s", + MIPI_SYST_PARAM_CSTR(""), + MIPI_SYST_PARAM_CSTR("1"), + MIPI_SYST_PARAM_CSTR("22"), + MIPI_SYST_PARAM_CSTR("333"), + MIPI_SYST_PARAM_CSTR("4444"), + MIPI_SYST_PARAM_CSTR("55555"), + MIPI_SYST_PARAM_CSTR("666666"), + MIPI_SYST_PARAM_CSTR("7777777"), + MIPI_SYST_PARAM_CSTR("88888888") + ) + ); + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001e11223344556677886f77206f6c6c65683231002120646c7212340033abcd"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, + "%s %s %d", + MIPI_SYST_PARAM_CSTR("hello world !"), + MIPI_SYST_PARAM_CSTR("123"), + MIPI_SYST_PARAM_INT(0xabcd1234) + ) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog64_printf_mixed) +{ + EXPECT_STREQ( + xform("02012243[typ=3:2 mu=1:2 sev=4 len]001e11223344556677886f77206f6c6c65683231002120646c7212340033abcd"), + MIPI_SYST_CATPRINTF64(ph, MIPI_SYST_SEVERITY_INFO, 0x1122334455667788, + "%s %s %d", + MIPI_SYST_PARAM_CSTR("hello world !"), + MIPI_SYST_PARAM_CSTR("123"), + MIPI_SYST_PARAM_INT(0xabcd1234) + ) + ); +} +#endif // #if defined(MIPI_SYST_PCFG_ENABLE_CATID64_API) + +#if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) + +TEST_F(MipiSysTFixturePrintf, syst_catalog32_printf_null) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_CATPRINTF32(NULL, MIPI_SYST_SEVERITY_INFO, 0x11223344, "") + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog32_printf_invalid) +{ + EXPECT_STREQ( + xform("05012242[typ=2:5 mu=1:2 sev=4 len]000761746163677200"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, -1, -1) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog32_printf_basic) +{ + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000411223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, "") + ); + + // check that format string is not added into payload + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000411223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, "Hello world") + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00080000005811223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%c", MIPI_SYST_PARAM_CHAR('X')) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00080000123411223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%hhd", MIPI_SYST_PARAM_SHORT(0x1234)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00080000005811223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%lc", MIPI_SYST_PARAM_WCHAR(L'X')) + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]0008abcd123411223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%d", MIPI_SYST_PARAM_INT(0xabcd1234)) + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c876543211122334412345678"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%lld", MIPI_SYST_PARAM_LONGLONG(0x1234567887654321ull)) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c123456781122334400000000"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%ld", MIPI_SYST_PARAM_LONG(0x12345678)) + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c876543211122334412345678"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%z", MIPI_SYST_PARAM_SIZE_T(0x1234567887654321ull)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c876543211122334412345678"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%t", MIPI_SYST_PARAM_PTRDIFF_T(0x1234567887654321ull)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c876543211122334412345678"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%p", MIPI_SYST_PARAM_PTR(0x1234567887654321ull)) + ); +#else + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00081234567811223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%ld", MIPI_SYST_PARAM_LONG(0x12345678)) + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00081234567811223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%z", MIPI_SYST_PARAM_SIZE_T(0x12345678)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00081234567811223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%t", MIPI_SYST_PARAM_PTRDIFF_T(0x12345678)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00081234567811223344"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%p", MIPI_SYST_PARAM_PTR(0x12345678)) + ); +#endif //defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c000000001122334440000000"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%f", MIPI_SYST_PARAM_FLOAT((float)2.0)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c000000001122334440000000"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%f", MIPI_SYST_PARAM_DOUBLE((double)2.0)) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]000c000000001122334440000000"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344ull, + "%lf", MIPI_SYST_PARAM_LONGDOUBLE((long double)2.0)) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog32_printf_string) +{ + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00051122334400"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, + "%s", MIPI_SYST_PARAM_CSTR("")) + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]00126c6c65681122334420646c726f77206f0021"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, + "%s", MIPI_SYST_PARAM_CSTR("hello world !")) + ); + + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]003132003100112233443434003333330032353535353500343400363636363636000037373737373737383838383838383800"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, + "%s", + MIPI_SYST_PARAM_CSTR(""), + MIPI_SYST_PARAM_CSTR("1"), + MIPI_SYST_PARAM_CSTR("22"), + MIPI_SYST_PARAM_CSTR("333"), + MIPI_SYST_PARAM_CSTR("4444"), + MIPI_SYST_PARAM_CSTR("55555"), + MIPI_SYST_PARAM_CSTR("666666"), + MIPI_SYST_PARAM_CSTR("7777777"), + MIPI_SYST_PARAM_CSTR("88888888") + ) + ); + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]001a6c6c65681122334420646c726f77206f1234003332310021abcd"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, + "%s %s %d", + MIPI_SYST_PARAM_CSTR("hello world !"), + MIPI_SYST_PARAM_CSTR("123"), + MIPI_SYST_PARAM_INT(0xabcd1234) + ) + ); +} + +TEST_F(MipiSysTFixturePrintf, syst_catalog32_printf_mixed) +{ + EXPECT_STREQ( + xform("01012243[typ=3:1 mu=1:2 sev=4 len]001a6c6c65681122334420646c726f77206f1234003332310021abcd"), + MIPI_SYST_CATPRINTF32(ph, MIPI_SYST_SEVERITY_INFO, 0x11223344, + "%s %s %d", + MIPI_SYST_PARAM_CSTR("hello world !"), + MIPI_SYST_PARAM_CSTR("123"), + MIPI_SYST_PARAM_INT(0xabcd1234) + ) + ); +} +#endif // #if defined(MIPI_SYST_PCFG_ENABLE_CATID32_API) +#endif //MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA && MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE && MIPI_SYST_PCFG_ENABLE_PRINTF_API \ No newline at end of file diff --git a/library/test/unit/mipi_syst_raw_test.cpp b/library/test/unit/mipi_syst_raw_test.cpp new file mode 100644 index 0000000..bcb1b4a --- /dev/null +++ b/library/test/unit/mipi_syst_raw_test.cpp @@ -0,0 +1,162 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) &&\ + defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) &&\ + defined(MIPI_SYST_PCFG_ENABLE_WRITE_API) + +class MipiSysTFixtureRaw : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown(){ + MipiSysTFixtureOutput::TearDown(); + } + + const char * mipi_syst_write_raw_message( + struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_severity severity, + mipi_syst_u8 subtype, + const void * data, + mipi_syst_u16 length) + { + sstr.str(""); + + ::mipi_syst_write_raw_message(svh, loc, severity, subtype, data, length); + result = sstr.str(); + + return result.c_str(); + } + + static std::string result; +}; + +std::string MipiSysTFixtureRaw::result; + +TEST_F(MipiSysTFixtureRaw, syst_raw_nullptr) +{ + EXPECT_STREQ( + "", + MIPI_SYST_WRITE(NULL, MIPI_SYST_SEVERITY_INFO, 0x3f, NULL, 0) + ); + + EXPECT_STREQ( + xform("3f012246[typ=6:3f mu=1:2 sev=4 len]0000"), + MIPI_SYST_WRITE(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, NULL, 0) + ); +} + +TEST_F(MipiSysTFixtureRaw, syst_raw_output) +{ + mipi_syst_u8 byte = 0xab; + mipi_syst_u16 word =MIPI_SYST_HTOLE16(0xabcd); + mipi_syst_u32 dword =MIPI_SYST_HTOLE32(0xaabbccdd); + mipi_syst_u64 qword =MIPI_SYST_HTOLE64(0x1122aabbccddeeffull); + + EXPECT_STREQ( + xform("3f012246[typ=6:3f mu=1:2 sev=4 len]0001ab"), + MIPI_SYST_WRITE(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, &byte, 1) + ); + EXPECT_STREQ( + xform("3f012246[typ=6:3f mu=1:2 sev=4 len]0002abcd"), + MIPI_SYST_WRITE(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, &word, 2) + ); + EXPECT_STREQ( + xform("3f012246[typ=6:3f mu=1:2 sev=4 len]0004aabbccdd"), + MIPI_SYST_WRITE(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, &dword, 4) + ); + EXPECT_STREQ( + xform("3f012246[typ=6:3f mu=1:2 sev=4 len]00081122aabbccddeeff"), + MIPI_SYST_WRITE(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, &qword, 8) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + EXPECT_STREQ( + xform("3f012346[typ=6:3f mu=1:2 sev=4 loc len]005678abcd0001ab"), + MIPI_SYST_WRITE_LOC16(ph, MIPI_SYST_SEVERITY_INFO, 0xabcd, 0x3f, &byte, 1) + ); + + EXPECT_STREQ( + xform("3f012346[typ=6:3f mu=1:2 sev=4 loc len]0112345678aabbccdd0001ab"), + MIPI_SYST_WRITE_LOC32(ph, MIPI_SYST_SEVERITY_INFO, 0x12345678aabbccddull, 0x3f, &byte, 1) + ); +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("3f012346[typ=6:3f mu=1:2 sev=4 loc len]0312345678aabbccdd0001ab"), + MIPI_SYST_WRITE_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, &byte, 1) + ); +#else + EXPECT_STREQ( + xform("3f012346[typ=6:3f mu=1:2 sev=4 loc len]02123456780001ab"), + MIPI_SYST_WRITE_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO, 0x3f, &byte, 1) + ); +#endif //MIPI_SYST_PCFG_ENABLE_64BIT_ADDR +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD +} + +#endif //MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA && MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE && MIPI_SYST_PCFG_ENABLE_WRITE_API + +TEST_F(MipiSysTFixtureOutput, syst_short) +{ + std::string str; + + MIPI_SYST_SHORT32(ph, 0x02345678); + str = sstr.str(); + + EXPECT_STREQ( + xform("23456781"), + str.c_str() + ); + + sstr.str(""); + MIPI_SYST_SHORT64(ph, 0x0122334455667788); + str = sstr.str(); + + EXPECT_STREQ( + xform("1223344556677887"), + str.c_str() + ); +} \ No newline at end of file diff --git a/library/test/unit/mipi_syst_string_test.cpp b/library/test/unit/mipi_syst_string_test.cpp new file mode 100644 index 0000000..c2fdbcf --- /dev/null +++ b/library/test/unit/mipi_syst_string_test.cpp @@ -0,0 +1,325 @@ +/* +Copyright (c) 2018, MIPI Alliance, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include "mipi_syst_gtest.h" + +#if defined(MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA) &&\ + defined(MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE) &&\ + defined(MIPI_SYST_PCFG_ENABLE_STRING_API) + + +class MipiSysTFixtureDebugString : public MipiSysTFixtureOutput +{ +public: + void SetUp() { + MipiSysTFixtureOutput::SetUp(); + } + + void TearDown(){ + MipiSysTFixtureOutput::TearDown(); + } + + const char * mipi_syst_write_debug_string(struct mipi_syst_handle* svh, + struct mipi_syst_msglocation* loc, + enum mipi_syst_subtype_string type, + enum mipi_syst_severity severity, + mipi_syst_u16 len, + const char * str) + { + sstr.str(""); + + ::mipi_syst_write_debug_string(svh, loc, type, severity, len, str); + result = sstr.str(); + + return result.c_str(); + } + + static std::string result; +}; + +std::string MipiSysTFixtureDebugString::result; + +TEST_F(MipiSysTFixtureDebugString, syst_string_null) +{ + EXPECT_STREQ( + xform(""), + MIPI_SYST_DEBUG(NULL, MIPI_SYST_SEVERITY_WARNING, "", 1) + ); + + EXPECT_STREQ( + xform("05012232[typ=2:5 mu=1:2 sev=3 len]00076c756e28296c00"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_WARNING, NULL, 1) + ); +} + +TEST_F(MipiSysTFixtureDebugString, syst_func_enter_output) +{ + EXPECT_STREQ( + xform("02012232[typ=2:2 mu=1:2 sev=3 len]000b3736353433323130393800"), + MIPI_SYST_FUNC_ENTER(ph, MIPI_SYST_SEVERITY_WARNING) + ); +} + +TEST_F(MipiSysTFixtureDebugString, syst_func_exit_output) +{ + EXPECT_STREQ( + xform("03012232[typ=2:3 mu=1:2 sev=3 len]000b3736353433323130393800"), + MIPI_SYST_FUNC_EXIT(ph, MIPI_SYST_SEVERITY_WARNING) + ); +} + + +TEST_F(MipiSysTFixtureDebugString, syst_debugstring_output) +{ + EXPECT_STREQ( + xform("01012232[typ=2:1 mu=1:2 sev=3 len]000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!" , 12) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_CHECKSUM) + MIPI_SYST_ENABLE_HANDLE_CHECKSUM(ph,1); +#if defined(MIPI_SYST_PCFG_LENGTH_FIELD) + EXPECT_STREQ( + xform("01012632[typ=2:1 mu=1:2 sev=3 len chk]000c6f77206f6c6c654821646c72eab806d3"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!" , 12) + ); +#else + EXPECT_STREQ( + xform("01012432[typ=2:1 mu=1:2 sev=3 chk]6f77206f6c6c654821646c72ff19ff90"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!", 12) + ); +#endif + MIPI_SYST_ENABLE_HANDLE_CHECKSUM(ph,0); +#endif + + +#if defined(MIPI_SYST_PCFG_ENABLE_ORIGIN_GUID) + // {8887160A-C965-463b-9F43-1EFE9FDFE3F9} + const struct mipi_syst_guid aguid = MIPI_SYST_GEN_GUID(0x8887160A, 0xC965, 0x463b, 0x9F43, 0x1EFE9FDFE3F9); + + MIPI_SYST_SET_HANDLE_GUID_UNIT(ph, aguid, 7); + EXPECT_STREQ( + xform("01807252[typ=2:1 mu=0:7 sev=5 len]3b4665c90a168788f9e3df9ffe1e439f000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_USER1, "Hello world!" , 12) + ); +#endif +} + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +TEST_F(MipiSysTFixtureDebugString, syst_debugstring_loc) +{ + EXPECT_STREQ( + xform("01012332[typ=2:1 mu=1:2 sev=3 loc len]005678abcd000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG_LOC16(ph, MIPI_SYST_SEVERITY_WARNING, 0xabcd, "Hello world!" , 12) + ); + + EXPECT_STREQ( + xform("01012332[typ=2:1 mu=1:2 sev=3 loc len]01123456780000abcd000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG_LOC32(ph, MIPI_SYST_SEVERITY_WARNING,0xabcd, "Hello world!" , 12) + ); +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("01012332[typ=2:1 mu=1:2 sev=3 loc len]0312345678aabbccdd000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!" , 12) + ); +#else + EXPECT_STREQ( + xform("01012332[typ=2:1 mu=1:2 sev=3 loc len]0212345678000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG_LOCADDR(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!" , 12) + ); +#endif +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + +TEST_F(MipiSysTFixtureDebugString, syst_debugstring_nolength) +{ + MIPI_SYST_ENABLE_HANDLE_LENGTH(ph,0); + EXPECT_STREQ( + xform("01012032[typ=2:1 mu=1:2 sev=3]6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!" , 12) + ); + + MIPI_SYST_ENABLE_HANDLE_LENGTH(ph,1); + + EXPECT_STREQ( + xform("01012232[typ=2:1 mu=1:2 sev=3 len]000c6f77206f6c6c654821646c72"), + MIPI_SYST_DEBUG(ph, MIPI_SYST_SEVERITY_WARNING, "Hello world!" , 12) + ); +} + +TEST_F(MipiSysTFixtureDebugString, syst_func_enter) +{ + EXPECT_STREQ( + xform("02012242[typ=2:2 mu=1:2 sev=4 len]000b3736353433323130393800"), + MIPI_SYST_FUNC_ENTER(ph, MIPI_SYST_SEVERITY_INFO) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + EXPECT_STREQ( + xform("02012342[typ=2:2 mu=1:2 sev=4 loc len]005678abcd000b3736353433323130393800"), + MIPI_SYST_FUNC_ENTER_LOC16(ph, MIPI_SYST_SEVERITY_INFO,0xabcd) + ); + + EXPECT_STREQ( + xform("02012342[typ=2:2 mu=1:2 sev=4 loc len]01123456780000abcd000b3736353433323130393800"), + MIPI_SYST_FUNC_ENTER_LOC32(ph, MIPI_SYST_SEVERITY_INFO,0xabcd) + ); +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("02012342[typ=2:2 mu=1:2 sev=4 loc len]0312345678aabbccdd000b3736353433323130393800"), + MIPI_SYST_FUNC_ENTER_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO) + ); +#else + EXPECT_STREQ( + xform("02012342[typ=2:2 mu=1:2 sev=4 loc len]0212345678000b3736353433323130393800"), + MIPI_SYST_FUNC_ENTER_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO) + ); +#endif //MIPI_SYST_PCFG_ENABLE_64BIT_ADDR +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD +} + +TEST_F(MipiSysTFixtureDebugString, syst_func_exit) +{ + EXPECT_STREQ( + xform("03012242[typ=2:3 mu=1:2 sev=4 len]000b3736353433323130393800"), + MIPI_SYST_FUNC_EXIT(ph, MIPI_SYST_SEVERITY_INFO) + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) + EXPECT_STREQ( + xform("03012342[typ=2:3 mu=1:2 sev=4 loc len]005678abcd000b3736353433323130393800"), + MIPI_SYST_FUNC_EXIT_LOC16(ph, MIPI_SYST_SEVERITY_INFO,0xabcd) + ); + + EXPECT_STREQ( + xform("03012342[typ=2:3 mu=1:2 sev=4 loc len]01123456780000abcd000b3736353433323130393800"), + MIPI_SYST_FUNC_EXIT_LOC32(ph, MIPI_SYST_SEVERITY_INFO,0xabcd) + ); +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("03012342[typ=2:3 mu=1:2 sev=4 loc len]0312345678aabbccdd000b3736353433323130393800"), + MIPI_SYST_FUNC_EXIT_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO) + ); +#else + EXPECT_STREQ( + xform("03012342[typ=2:3 mu=1:2 sev=4 loc len]0212345678000b3736353433323130393800"), + MIPI_SYST_FUNC_EXIT_LOCADDR(ph, MIPI_SYST_SEVERITY_INFO) + ); +#endif //MIPI_SYST_PCFG_ENABLE_64BIT_ADDR +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD +} + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD) +TEST_F(MipiSysTFixtureDebugString, syst_debug_assert) +{ + MIPI_SYST_ASSERT(ph, MIPI_SYST_SEVERITY_ERROR, 0); + + EXPECT_STREQ( + xform("07012222[typ=2:7 mu=1:2 sev=2 len]00187473657474696e7533323178303a632e0030203837363534"), + result.c_str() + ); + + result = ""; + MIPI_SYST_ASSERT(ph, MIPI_SYST_SEVERITY_ERROR, 1); + + EXPECT_STREQ( + "", + result.c_str() + ); + +#if defined(MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS) + MIPI_SYST_ASSERT_LOCADDR(ph, MIPI_SYST_SEVERITY_ERROR, 0); +#if defined(MIPI_SYST_PCFG_ENABLE_64BIT_ADDR) + EXPECT_STREQ( + xform("07012322[typ=2:7 mu=1:2 sev=2 loc len]0312345678aabbccdd00187473657474696e7533323178303a632e0030203837363534"), + result.c_str() + ); +#else + EXPECT_STREQ( + xform("07012322[typ=2:7 mu=1:2 sev=2 loc len]021234567800187473657474696e7533323178303a632e0030203837363534"), + result.c_str() + ); +#endif + result = ""; + MIPI_SYST_ASSERT_LOCADDR(ph, MIPI_SYST_SEVERITY_ERROR, 1); + + EXPECT_STREQ( + "", + result.c_str() + ); +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_ADDRESS + + MIPI_SYST_ASSERT_LOC16(ph, MIPI_SYST_SEVERITY_ERROR, 0xabcd, 0); + + EXPECT_STREQ( + xform("07012322[typ=2:7 mu=1:2 sev=2 loc len]005678abcd00187473657474696e7533323178303a632e0030203837363534"), + result.c_str() + ); + + result = ""; + MIPI_SYST_ASSERT_LOC16(ph, MIPI_SYST_SEVERITY_ERROR,0xabcd, 1); + + EXPECT_STREQ( + "", + result.c_str() + ); + + MIPI_SYST_ASSERT_LOC32(ph, MIPI_SYST_SEVERITY_ERROR, 0xabcd, 0); + + EXPECT_STREQ( + xform("07012322[typ=2:7 mu=1:2 sev=2 loc len]01123456780000abcd00187473657474696e7533323178303a632e0030203837363534"), + result.c_str() + ); + + result = ""; + MIPI_SYST_ASSERT_LOC32(ph, MIPI_SYST_SEVERITY_ERROR, 0xabcd, 1); + + EXPECT_STREQ( + "", + result.c_str() + ); +} +#endif //MIPI_SYST_PCFG_ENABLE_LOCATION_RECORD + +#endif //MIPI_SYST_PCFG_ENABLE_PLATFORM_STATE_DATA && MIPI_SYST_PCFG_ENABLE_DEFAULT_SCATTER_WRITE && MIPI_SYST_PCFG_ENABLE_STRING_API \ No newline at end of file diff --git a/printer/CMakeLists.txt b/printer/CMakeLists.txt new file mode 100644 index 0000000..4b7aac5 --- /dev/null +++ b/printer/CMakeLists.txt @@ -0,0 +1,120 @@ +project (mipi_syst_printer) +cmake_minimum_required (VERSION 2.8) +enable_testing() + +# External third party build dependencies: +# * PugiXML https://github.com/zeux/pugixml +# +if (NOT DEFINED PUGIXML_SRC_DIR) + get_filename_component(PUGIXML "${CMAKE_CURRENT_LIST_DIR}/../external/pugixml/src" ABSOLUTE) + set(PUGIXML_SRC_DIR "${PUGIXML}" CACHE PATH "Location of pugixml XML parser code") +endif() +if (NOT EXISTS "${PUGIXML_SRC_DIR}/pugixml.cpp") + message(FATAL_ERROR + "PUGIXML_SRC_DIR=${PUGIXML_SRC_DIR} does not point to pugixml sources. Try running\n" + "git submodule update --init --recursive\n" + "to populate the external folder git submodules or change PUGIXML_SRC_DIR to point to pugixml sources." + ) +endif() + +if (WIN32) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +set (printer_Includes + include/mipi_syst_collateral.h + include/mipi_syst_printer.h + include/mipi_syst_decode.h + include/mipi_syst_message.h + include/mipi_syst_guid.h + include/mipi_syst_printf.h + + ${PUGIXML_SRC_DIR}/pugixml.hpp +) + +set (printer_Sources + src/mipi_syst_main.cpp + src/mipi_syst_collateral.cpp + src/mipi_syst_printf.cpp + src/mipi_syst_decode.cpp + src/mipi_syst_message.cpp + ${PUGIXML_SRC_DIR}/pugixml.cpp +) + +include_directories( + include + ${PUGIXML_SRC_DIR} +) + +add_executable(systprint + ${printer_Includes} + ${printer_Sources} +) + +# Request C++11 support +# +if (CMAKE_VERSION VERSION_LESS "3.1") + if (CMAKE_CXX_COMPILER_ID STREQUAL "CLANG") + set (CMAKE_CXX_FLAGS "-std=c++11" ${CMAKE_CXX_FLAGS}) + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + message( STATUS ${CMAKE_CXX_COMPILER_ID}) + set (CMAKE_CXX_FLAGS "-std=gnu++11" ${CMAKE_CXX_FLAGS}) + endif() +else() + set_property(TARGET systprint PROPERTY CXX_STANDARD 11) +endif() + +install(TARGETS systprint + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) + +# Simple test that print an input file +add_test( + NAME print_client_example + COMMAND systprint --short_guid {494E5443-8A9C-4014-A65A-2F36A36D96E4} --collateral collateral.xml input_client64.txt + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/test +) + +# pass option as single "^" separated option to test script to avoid CMAKE string list modifications on blanks +# +set(TEST_OPTIONS --short_guid {494E5443-8A9C-4014-A65A-2F36A36D96E4} --collateral collateral.xml) +string(REPLACE ";" "^" TEST_OPTIONS "${TEST_OPTIONS}") + +# Compare output from 32bit client +# +add_test( + NAME diff_output_with_32bit_reference + COMMAND ${CMAKE_COMMAND} + -DEXECUTABLE=$ + -DOPTIONS=${TEST_OPTIONS}^input_client32.txt + -DTEST_REFERENCE=output_client32.txt + -DTEST_OUTPUT=${CMAKE_CURRENT_BINARY_DIR}/output32.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/test/diff.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/test +) + +# Compare output from 64bit client +# +add_test( + NAME diff_output_with_64bit_reference + COMMAND ${CMAKE_COMMAND} + -DEXECUTABLE=$ + -DOPTIONS=${TEST_OPTIONS}^input_client64.txt + -DTEST_REFERENCE=output_client64.txt + -DTEST_OUTPUT=${CMAKE_CURRENT_BINARY_DIR}/output64.txt + -P ${CMAKE_CURRENT_SOURCE_DIR}/test/diff.cmake + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/test +) +# Add verbose test target to show the output of the tools run by tests +# +if (CMAKE_CONFIGURATION_TYPES) + add_custom_target(RUN_TEST_VERBOSE COMMAND ${CMAKE_CTEST_COMMAND} + --force-new-ctest-process --verbose + --build-config "$") +else() + add_custom_target(RUN_TEST_VERBOSE COMMAND ${CMAKE_CTEST_COMMAND} + --force-new-ctest-process --verbose) +endif() + diff --git a/printer/include/mipi_syst_collateral.h b/printer/include/mipi_syst_collateral.h new file mode 100644 index 0000000..86b95e6 --- /dev/null +++ b/printer/include/mipi_syst_collateral.h @@ -0,0 +1,204 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ +#ifndef MIPI_SYST_COLLATERL_H_included +#define MIPI_SYST_COLLATERL_H_included + +#include +#include +#include +#include +#include + +#include "pugixml.hpp" +#include "mipi_syst_printer.h" +#include "mipi_syst_guid.h" + +MIPI_SYST_NAMESPACE_BEGIN +class guid; + +class collateral { +public: + const std::string& getName() const { return m_name;} + const std::string& getFileName() const { return m_file; } + + /// Check if the given guid matches one of the catalog guid/mask pairs + /// + /// @param guid to check catalog for + /// @param build client build number + /// @return true if catalog matches, false otherwise + /// + bool match(const guid & g, const uint64_t build) const; + + static std::vector parseXml(const std::string& filename); + + struct sourcepos { + sourcepos(uint32_t file, uint32_t line) : + m_file(file), m_line(line) {}; + + uint32_t m_file = 0; + uint32_t m_line = 0; + }; + + /// Message entry for ID->MSG catalogs + /// + template struct catalogentry : public sourcepos { + std::string msg; + T mask; + + catalogentry(std::string s ="", T mask = (T)-1, uint32_t file = 0, uint32_t line=0) + : sourcepos(file, line), msg(s) + {} + + bool operator!=(const catalogentry& other) { + return msg != other.msg; + } + }; + + /// Container for (key:mask:value tuples + /// + template struct masked_item + { + masked_item() {} + masked_item(const K& k, const K& m, const V& v) : + m_key(k), m_mask(m), m_value(v) {} + + K& key() { return m_key; } + K& mask() {return m_mask;} + V& value() {return m_value;} + + const K& key() const { return m_key; } + const K& mask() const { return m_mask; } + const V& value() const { return m_value; } + + private: + K m_key; + K m_mask; + V m_value; + }; + + template + class masked_vector : public std::vector> + { + public: + typedef std::vector> base_type; + + /// Find key in item vector using item mask when comparing (const) + /// + /// @param k key to look for + /// @return iterator to matching element or end() if not found + /// + typename base_type::const_iterator + find(const K& k) const + { + return std::find_if(base_type::begin(), base_type::end(), + [& k](const masked_item& v) + { + return (v.key() & v.mask()) == (k & v.mask()); + } + ); + } + + + /// Find key in item vector using item mask when comparing + /// + /// @param k key to look for + /// @return iterator to matching element or end() if not found + /// + typename base_type::iterator + find(const K& k) + { + return std::find_if(base_type::begin(), base_type::end(), + [&k]( masked_item& v) + { + return (v.key() & v.mask()) == (k & v.mask()); + } + ); + } + }; + + /// container for ID <-> value mapping sections in collateral + /// + using guids = masked_vector; + using builds = masked_vector; + using srcfiles = masked_vector; + using origins = masked_vector; + using writetypes = masked_vector; + using catalog32 = masked_vector>; + using catalog64 = masked_vector>; + + template const catalogentry * getShortEntry(T id) const; + template const catalogentry * getCatalogEntry(T id) const; + + const std::string * getSourceFile(uint32_t id) const; + const std::string * getWriteType(uint8_t id) const; + + + /// Parse collateral from XML + /// + collateral(pugi::xml_node& node, const std::string& file); + + template + void parseMaskedItems( + pugi::xml_node root, + const char * tag, + masked_vector& dest); +private: + std::string m_file; /**< originating file name */ + + std::string m_name; /**< catalog name */ + guids m_guids; /**< Guids where the collateral is valid */ + builds m_builds; /**< builds where the collateral is valid */ + catalog32 m_msgs32; /**< message catalog with 32bit ID's */ + catalog64 m_msgs64; /**< message catalog with 64bit ID's */ + catalog32 m_shorts32; /**< short event id to message mapping */ + catalog64 m_shorts64; /**< short event id to message mapping */ + writetypes m_writeTypes; /**< write definitions */ + srcfiles m_files; /**< file catalog */ + origins m_modules; /**< module id to name mappings */ + + +private: + /* no copy, assign */ + collateral() = delete; + collateral(const collateral&) = delete; + collateral& operator=(const collateral&) = delete; +}; + +MIPI_SYST_NAMESPACE_END + +#endif // MIPI_SYST_COLLATERL_H_included diff --git a/printer/include/mipi_syst_decode.h b/printer/include/mipi_syst_decode.h new file mode 100644 index 0000000..50dd84b --- /dev/null +++ b/printer/include/mipi_syst_decode.h @@ -0,0 +1,187 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_DECODE_H_included +#define MIPI_SYST_DECODE_H_included + +#include +#include "mipi_syst_printer.h" +#include "mipi_syst_collateral.h" +#include "mipi_syst_message.h" + +MIPI_SYST_NAMESPACE_BEGIN + +class message; +class collateral; + +/// Base class for decoding exceptions +// +class decode_exception { +public: + decode_exception(message::decode_state s, + const std::string& what = std::string()) + : state(s), msg(what) + {} + virtual ~decode_exception() {}; + + virtual const std::string& what() const { return msg; } + message::decode_state get_state() const { return state; } + +protected: + message::decode_state state; + std::string msg; +}; + + +class tooshort_exception : public decode_exception +{ +public: + tooshort_exception() : + decode_exception(message::decode_state::TOO_SHORT) {} +}; +class toolong_exception : public decode_exception +{ +public: + toolong_exception() : + decode_exception(message::decode_state::TOO_LONG) {} +}; +class unknown_type_exception : public decode_exception +{ +public: + unknown_type_exception() : + decode_exception(message::decode_state::UNKNOWN_TYPE) {} +}; + +class crc_error_exception : public decode_exception +{ +public: + crc_error_exception() : + decode_exception(message::decode_state::CHECKSUM_ERROR) {} +}; + +class missing_collateral_exception : public decode_exception +{ +public: + missing_collateral_exception() : + decode_exception(message::decode_state::MISSING_COLLATERAL) {} +}; + +/// Decode context information. +// +// This class is delivering timstamp and identifcation information as +// side-band data. +// Context based message identification is needed for client identification +// if messages don't carry GUID information as part of the message data. +// Short messages are one example for such messages. In this case +// collateral matching relies on side-band information. In systems using +// MIPI System Trace Protocol (STP), the master and channel 16-bit values +// are typically used for this purpose. +// A timestamp is often also provided through a transport protocol and not +// embedded into SyS-T messages. +// +class decode_context { +public: + virtual const guid& getGuid() const = 0; ///< get context based guid + virtual uint64_t getTS() const = 0; ///< get context timestamp + virtual ~decode_context() {} +}; + +/// MIPI SyS-T data protocol decoder +// +// This class is decoding a sequence of bytes that represent one SyS-T message into +// a message data structure for post processing. +// +class decoder { +public: + /// Parse given file as a SyS-T collateral XML file + // + // Parse and add provided file as SyS-T collateral data. The function + // throws an exception if the XML is malformed. + // + // @param file filename to load + // + void loadCollateral(const std::string& file); + + /// Store Build ID for given GUID + // + // Cache build ID for given GUID to make collateral matching "build number" + // aware. If a build ID was seen, the decode looks for collateral matching this + // one. + // + // @param id 64-Bit build number to remember + // @param g client guid associated with this build number + // + void setBuildNumber(uint64_t id, const guid& g) const; + + /// Decode single SyS-T raw binary message + // + // @param dest message data structed holding decode result + // @param data raw data bytes representing one SyS-T message + // + // @return true on success + // + bool decode(message& dest, const std::vector& data, const decode_context * ctx) const; + +private: + bool decodeShortMessage(message& dest, const uint8_t *data, uint32_t length, const decode_context * ctx) const; + bool decodeNormalMessage(message& dest, const uint8_t *data, uint32_t length, const decode_context * ctx) const; + + void decodeBuildPayload(message& dest, const uint8_t * data, uint32_t len) const; + void decodeStringPayload(message& dest, const uint8_t * data, uint32_t len) const; + void decodeCatalogPayload(message& dest, const uint8_t * data, uint32_t len) const; + void decodeRawPayload(message& dest, const uint8_t * data, uint32_t len) const; + void decodeInvalidType(message& dest, const uint8_t * data, uint32_t len) const; + + + collateral * findCollateral(const guid& m) const; + + static guid generatePseudoGuid(uint8_t origin); + static uint32_t getCrc32(const uint8_t * data, size_t len); + + std::vector collaterals; + mutable std::map collateral_by_guid; + mutable std::map build_by_guid; + typedef void (decoder::*decode_payload_f)(message&, const uint8_t *, uint32_t len) const; + + static decode_payload_f payloadDecode[16]; + static const uint32_t crc32c_table[256]; +}; + +MIPI_SYST_NAMESPACE_END + +#endif // MIPI_SYST_PRINTER_H_included diff --git a/printer/include/mipi_syst_guid.h b/printer/include/mipi_syst_guid.h new file mode 100644 index 0000000..4ce5e53 --- /dev/null +++ b/printer/include/mipi_syst_guid.h @@ -0,0 +1,116 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_GUID_H_included +#define MIPI_SYST_GUID_H_included + +#include +#include +#include "mipi_syst_printer.h" + + +MIPI_SYST_NAMESPACE_BEGIN + +/// Container for 128 bit wide GUID (see https://www.ietf.org/rfc/rfc4122.txt) +// +class guid { +public: + union { + uint8_t b[16]; + uint64_t ll[2]; + } u; + + guid() + { + u.ll[0] = u.ll[1] = 0; + } + + guid(const uint8_t * p) + { + u.ll[0] = *(uint64_t*)p; + u.ll[1] = *(uint64_t*)(p+sizeof(uint64_t)); + } + + guid(const std::string& f) + { + if (!parse(f)) { + throw std::invalid_argument( + "invalid guid format " + + f + + " expected {xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} notation." + ); + } + } + + /** Helper to parse a GUID "{...}" string into the binrary representation. + * @param str GUID ascii string + * @param guid resulting guid + * @return true if guid could be parserd + */ + bool parse(const std::string& fmt); + + bool operator<(const guid& other) const + { + if (u.ll[0] == other.u.ll[0]) { + return u.ll[1] < other.u.ll[1]; + } else { + return u.ll[0] < other.u.ll[0]; + } + } + + guid operator&(const guid& mask) const + { + guid result(*this); + + result.u.ll[0] &= mask.u.ll[0]; + result.u.ll[1] &= mask.u.ll[1]; + + return result; + } + + bool operator==(const guid& other) const + { + return u.ll[0] == other.u.ll[0] && u.ll[1] == other.u.ll[1]; + } +}; + +std::ostream& operator<<(std::ostream& os, const guid& guid); + +MIPI_SYST_NAMESPACE_END + +#endif // MIPI_SYST_COLLATERL_H_included diff --git a/printer/include/mipi_syst_message.h b/printer/include/mipi_syst_message.h new file mode 100644 index 0000000..b43c5b1 --- /dev/null +++ b/printer/include/mipi_syst_message.h @@ -0,0 +1,228 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_MESSAGE_H_included +#define MIPI_SYST_MESSAGE_H_included + +#include +#include +#include +#include + +#include "mipi_syst_printer.h" +#include "mipi_syst_guid.h" + +MIPI_SYST_NAMESPACE_BEGIN + +class collateral; + +/// Internal representation of a decoded SyS-T message +/// +class message { +public: + enum decode_state { + OK = 0, + UNKNOWN_TYPE = 1, + TOO_SHORT = 2, + TOO_LONG = 3, + CHECKSUM_ERROR = 4, + MISSING_COLLATERAL = 5 + }; + + union header { + public: + struct fields { +#if defined(MIPI_SYST_BIG_ENDIAN) + uint32_t res31 : 1; ///< reserved, must be 0 + uint32_t res30 : 1; ///< reserved, must be 0 + uint32_t subtype : 6; ///< type dependent sub category + uint32_t guid : 1; ///< 128 bit GUID present + uint32_t originUnit : 11; ///< unit for GUID or module:unit pair + uint32_t timestamp : 1; ///< indicate 64 bit timestamp + uint32_t chksum : 1; ///< indicate 32bit CRC + uint32_t length : 1; ///< indicate variable length message + uint32_t location : 1; ///< indicate location information + uint32_t res7 : 1; ///> 4); } + uint32_t getUnit() const { + return m_hdr.field.guid ? m_hdr.field.originUnit : (m_hdr.field.originUnit & 0xF); + } + uint64_t getMessageTS() const{ return m_msgTS; } + uint64_t getContextTS()const { return m_ctxTS; } + uint64_t getBuild() const { return m_build; } + bool isShort() const { return isShort(getHeader()); }; + + static bool isShort(header hdr); + static const char csvHeaderString[]; +private: + decode_state m_state; + + header m_hdr; + uint64_t m_msgTS; + uint64_t m_ctxTS; + uint64_t m_build; + guid m_guid; + location m_loc; + std::string m_payload; + std::string m_clientname; + uint32_t m_length; + uint32_t m_crc; + const collateral * m_coll; +}; + +std::ostream& operator<<(std::ostream& os, const message& msg); +MIPI_SYST_NAMESPACE_END + +#endif // MIPI_SYST_MESSAGE_H_included diff --git a/printer/include/mipi_syst_printer.h b/printer/include/mipi_syst_printer.h new file mode 100644 index 0000000..5ad838f --- /dev/null +++ b/printer/include/mipi_syst_printer.h @@ -0,0 +1,183 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_PRINTER_H_included +#define MIPI_SYST_PRINTER_H_included + +#include +#include +#include +#include + + +// Is Host Big Endian ? +// +#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ +#define MIPI_SYST_BIG_ENDIAN +#endif + +#define MIPI_SYST_NAMESPACE ::mipi::syst +#define MIPI_SYST_NAMESPACE_BEGIN namespace mipi { namespace syst { +#define MIPI_SYST_NAMESPACE_END }} + +#define MIPI_SYST_NAMESPACE_USE using namespace MIPI_SYST_NAMESPACE + +MIPI_SYST_NAMESPACE_BEGIN + +/// This function template attempts to convert a string into a numeric value. +/// +/// Hexadecimal and decimal numbers are supported. +/// Hexadecimal values are expected to be prefixed with "0x"; without +/// this prefix the string is interpreted as a decimal value. +/// @param num_str the string to convert to a number +/// @param num the converted number will be stored in here +/// @return true if the conversion was successful, false otherwise +/// +template +bool stringToNum(const std::string& num_str, Type& num) +{ + const std::string terminator("@"); + std::string tail; + std::stringstream sstr; + + sstr << num_str << terminator; + auto base(num_str.find("0x") ? std::dec : std::hex); + + if (sizeof(Type) == 1) { + // workaround for byte type assignment to use numbers not characters + // + uint32_t temp; + sstr >> base >> temp >> tail; + num = (Type)temp; + } else { + sstr >> base >> num >> tail; + } + if (tail != terminator) + { + return false; + } + return !sstr.fail(); +} + +template std::string toHexValue(T val) +{ + std::stringstream sstr; + + sstr << "0x" + << std::hex << std::uppercase + << std::setfill('0') << std::setw(sizeof(T) * 2) + << val; + + return sstr.str(); +} + +/// Helper to extract little endian values of sizeof(T) from a byte array +/// +template T bytes2ValLE(const void * p) +{ + const uint8_t* data((const uint8_t*)p); + T result(0); + + for (size_t i(0); i < sizeof(T); ++i) { + result |= (T)(*data++) << (i * 8); + } + return result; +} + +/// Call the host libc printf for the formatting of one argument +/// to ensure compliance with C99 printf format rules. +/// The function needs to support 3 different call types. +/// One argument may use up to 2 star '*' format options +/// to dynamically change width and precisions. +/// +template bool hostPrintf( + std::stringstream& dest, + const std::string& format, T value, const std::vector& starArgs) +{ + int result(0); + char buf[64 * 1024]; + + // Map to native printf API on host system. + // The "_set_printf_count_output() is a Windows special. Without it + // a call the msvcrt runtime throws a SEH exception on %n usage as + // part of security enhancements. We can safely allow %n + // as the message printf treats it as a nop. + // +#if defined(_WIN32) + int(*nativeSprintf)(char * data, size_t buffer, const char * format, ...) = _snprintf; + int saved_flag(_set_printf_count_output(1)); +#else + int(*nativeSprintf)(char * data, size_t buffer, const char * format, ...) = snprintf; +#endif + + switch (starArgs.size()) { + case 0: + result = nativeSprintf(buf, sizeof(buf), format.c_str(), value); + break; + case 1: + result = nativeSprintf(buf, sizeof(buf), format.c_str(), starArgs[0], value); + break; + case 2: + result = nativeSprintf(buf, sizeof(buf), format.c_str(), starArgs[0], starArgs[1], value); + break; + default: + result = -1; // format error, too many stars seen in argument format + break; + } + +#if defined(_WIN32) + _set_printf_count_output(saved_flag); +#endif + + if (result < 0) { + dest << " - invalid format '" << format << "' in printf"; + } + else if (result >= sizeof(buf)) { + dest << " - printf result using format '" << format << "' is too large"; + } + else { + dest << buf; + return true; + } + + return false; +} + +MIPI_SYST_NAMESPACE_END + +#endif // MIPI_SYST_PRINTER_H_included diff --git a/printer/include/mipi_syst_printf.h b/printer/include/mipi_syst_printf.h new file mode 100644 index 0000000..cbe0bbf --- /dev/null +++ b/printer/include/mipi_syst_printf.h @@ -0,0 +1,203 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#ifndef MIPI_SYST_PRINTF_H_included +#define MIPI_SYST_PRINTF_H_included + +#include +#include +#include + +#include "mipi_syst_printer.h" + +MIPI_SYST_NAMESPACE_BEGIN + +/// Finite state machine parser to parse printf format strings used in catalog +/// and printf messages. It detects if we got a string embedded with formats like +/// this: +/// %[flags][width][.precision][length]specifier +/// +/// flags: - + (space) # 0 +/// width: (number) * +/// precision: .(number) .* +/// length: hh h l ll j z t L +/// specifier: d i u o x X f F e E g G a A c s p n +/// +/// details: http://www.cplusplus.com/reference/cstdio/printf/ +/// +class fmtscanner +{ +public: + fmtscanner(bool is32Bit) : + SIZEOF_PTR(is32Bit ? 4 : 8), + SIZEOF_INT(4), + SIZEOF_LONG(is32Bit ? 4 : 8), + SIZEOF_SIZEOF(is32Bit ? 4 : 8), + SIZEOF_LONGLONG(8) + {} + + ~fmtscanner() {} + + /// argument variants + // + enum ArgType { + INTEGER, ///< 32/64 bit integer + POINTER, ///< 32/64 bit pointer + DOUBLE, ///< floating point number + TEXT, ///< text portion in format + STRING, ///< pointer to string %s + PERCENT_N, ///< the odd %n format + STAR, ///< an int from a %* arg + UNKNOWN ///< invalid format + }; + + enum Result { + OK = 0, + UNKNOWN_FORMAT = (1 << 1), + INCOMPLETE_FORMAT = (1 << 2) + }; + + /// Helper class to store information for one printf format fragment + /// + class ArgFragment { + public: + ArgFragment(ArgType type, size_t size, const std::string& text); + + ArgType type() const { return _type; } + size_t size() const { return _size; } + const std::string& text() const { return _text; } + + private: + ArgType _type; ///< arg type + size_t _size; ///< arg buffer space usage + std::string _text; ///< argument string fragment + }; + + typedef std::vector Args; + +protected: + + /// Finite state machine states of the argument parser + /// + enum FmtScanState { + START, + PLAINTEXT, + PERCENT, + FLAGS, + WIDTH, WIDTH_NUMBER, + PRECISION_DOT, PRECISION_VAL, PRECISION_NUMBER, + MODIFIER, + MODIFIER_HALF, + MODIFIER_LONG, + SPECIFIER + }; + + /// Format modifier types + /// + enum Modifier { + MOD_NONE, MOD_HH, MOD_H, MOD_L, MOD_LL, MOD_J, MOD_Z, MOD_T, MOD_LD + }; + +public: + /// Parse a printf argument string into a vector of argument fragments + /// @eturn OK if no error, or bitmask of errors from Result enumeration. + /// + uint32_t parse(const std::string& fmt, Args& args); + + const uint32_t SIZEOF_PTR; + const uint32_t SIZEOF_INT; + const uint32_t SIZEOF_LONG; + const uint32_t SIZEOF_SIZEOF; + const uint32_t SIZEOF_LONGLONG; +}; + + +/// Printf style formatter for events +/// +/// This class does printf style formatting using a format string +/// and memory buffer for the printf arguments. The code assumes +/// that all arguments are stored in the buffer without any padding +/// bytes. Strings are embedded as byte sequences into the buffer, +/// including their terminating null byte. +/// +/// Here is an example of how the buffer is expected +/// to be setup for the given printf call: +/// +/// printf("the %s jumped over the %s, %d times", "cow", "moon", 2); +/// +/// Argument buffer layout, following the format string: +/// +/// +-----------------------------------------------------------------+ +/// | 'c' | 'o' | 'w' | 0 | 'm' | 'o' | 'o' | 'n' | 0 | 2 | 0 | 0 | 0 | +/// +-----------------------------------------------------------------+ +/// |<--- P1 --->| |<--- P2 -->| |<--- P3 -->| +/// +/// It will print "the cow jumped over the moon, 2 times". +/// +class msgprintf +{ +public: + msgprintf(bool is32bit) : + _scanner(is32bit) + {} + + /// Initialize a printf formatter based on fmt and argument buffer + /// + /// @param fmt a C99 language compliant printf format string + /// @param args the argument buffer + /// @param size number of bytes in argument buffer + /// @param result ougoing string result or error message + /// + /// @ return true if formatting succeeded, false if not. + /// + bool format(const std::string& fmt, + const void * args, uint32_t size, + std::string& result); + +private: + + fmtscanner _scanner; + fmtscanner::Args _args; + + msgprintf(const msgprintf&) = delete; + msgprintf operator=(const msgprintf&) = delete; +}; + +MIPI_SYST_NAMESPACE_END + +#endif // MIPI_SYST_PRINTER_H_included diff --git a/printer/src/mipi_syst_collateral.cpp b/printer/src/mipi_syst_collateral.cpp new file mode 100644 index 0000000..a421808 --- /dev/null +++ b/printer/src/mipi_syst_collateral.cpp @@ -0,0 +1,331 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#include +#include +#include + +#include "mipi_syst_collateral.h" +#include "mipi_syst_guid.h" + +MIPI_SYST_NAMESPACE_BEGIN + +const char tagCollateral[] = "syst:Collateral"; +const char tagClient[] = "syst:Client"; +const char tagGuids[] = "syst:Guids"; +const char tagGuid[] = "syst:Guid"; +const char tagBuilds[] = "syst:Builds"; +const char tagBuild[] = "syst:Build"; +const char tagCatalog32[] = "syst:Catalog32"; +const char tagCatalog64[] = "syst:Catalog64"; +const char tagSourceFiles[] = "syst:SourceFiles"; +const char tagFile[] = "syst:File"; +const char tagShort32[] = "syst:Short32"; +const char tagShort64[] = "syst:Short64"; +const char tagWrite[] = "syst:Write"; +const char tagProtocol[] = "syst:Protocol"; +const char tagModules[] = "syst:Modules"; +const char tagModule[] = "syst:Module"; +const char tagID[] = "ID"; +const char tagMask[] = "Mask"; +const char tagFileAttr[] = "File"; +const char tagLine[] = "Line"; +const char tagFormat[] = "syst:Format"; + + +std::vector collateral::parseXml(const std::string& filename) +{ + pugi::xml_document doc; + pugi::xml_parse_result scan_result(doc.load_file(filename.c_str())); + std::stringstream sstr; + + if (!scan_result) { + sstr + << "XML parser error on file " + << filename + << " : " + << scan_result.description(); + + throw std::invalid_argument(sstr.str()); + } + + std::vector result; + + for(auto client(doc.child(tagCollateral).child(tagClient)); + client; + client = client.next_sibling(tagClient)) + { + result.push_back(new collateral(client, filename)); + } + return result; +} + + +collateral::collateral(pugi::xml_node& node, const std::string& file) : + m_file(file), + m_name(node.attribute("Name").as_string()) +{ + // Scan id <-> item mappings + // + parseMaskedItems(node.child(tagGuids), tagGuid, m_guids); + parseMaskedItems(node.child(tagBuilds), tagBuild, m_builds); + parseMaskedItems(node.child(tagSourceFiles), tagFile, m_files); + parseMaskedItems(node.child(tagModules), tagModule, m_modules); + parseMaskedItems(node.child(tagCatalog32), tagFormat, m_msgs32); + parseMaskedItems(node.child(tagCatalog64), tagFormat, m_msgs64); + parseMaskedItems(node.child(tagShort32), tagFormat, m_shorts32); + parseMaskedItems(node.child(tagShort64), tagFormat, m_shorts64); + parseMaskedItems(node.child(tagWrite), tagProtocol, m_writeTypes); +} + +bool collateral::match(const guid& g, uint64_t build) const +{ + for (auto& it : m_guids) { + if ((g & it.mask()) == (it.key() & it.mask())) + { + if (build != 0x0) { + // find collateral with matching build number + // + if (m_builds.find(build) != m_builds.end()) + { + return true; + } + } else { + return true; + } + } + } + + return false; +} + +template<> const collateral::catalogentry * collateral::getCatalogEntry<>(uint32_t id) const +{ + auto hit = m_msgs32.find(id); + return (hit != m_msgs32.end()) ? &hit->value() : nullptr; +} + +template<> const collateral::catalogentry * collateral::getCatalogEntry<>(uint64_t id) const +{ + auto hit = m_msgs64.find(id); + return (hit != m_msgs64.end()) ? &hit->value() : nullptr; +} +const std::string * collateral::getSourceFile(uint32_t id) const +{ + auto hit = m_files.find(id); + return (hit != m_files.end()) ? &hit->value() : nullptr; +} + +const std::string * collateral::getWriteType(uint8_t id) const +{ + auto hit(m_writeTypes.find(id)); + return (hit != m_writeTypes.end()) ? &hit->value() : nullptr; +} + +template<> const collateral::catalogentry * collateral::getShortEntry<>(uint32_t id) const +{ + auto hit(m_shorts32.find(id)); + return (hit != m_shorts32.end()) ? &hit->value() : nullptr; +} +template<> const collateral::catalogentry * collateral::getShortEntry<>(uint64_t id) const +{ + auto hit(m_shorts64.find(id)); + return (hit != m_shorts64.end()) ? &hit->value() : nullptr; +} + +template bool parse(K& dest, const std::string& s) +{ + return stringToNum(s, dest); +} + +template<> bool parse(guid& g, const std::string& s) +{ + return g.parse(s); +} + +template K nomask() { return (K)-1; } +template<> guid nomask() { return guid("{ffffffff-ffff-ffff-ffff-ffffffffffff}"); } + +template std::ostream & operator<<(std::ostream &os, const collateral::catalogentry& p) +{ + return os << p.msg; +} + +template +void collateral::parseMaskedItems( + pugi::xml_node root, const char * tag, masked_vector& dest) +{ + for (pugi::xml_node item(root.child(tag)); + item; + item = item.next_sibling(tag)) + { + masked_item data; + + std::string keyStr(item.attribute(tagID).as_string()); + std::string val(item.child_value()); + + if (!parse(data.key(), keyStr)) { + std::stringstream what; + what << + "Malformed " << tag << "entry ID=\"" << keyStr << + "\" value =\"" << val << "\"" << + " for catalog " << m_name; + throw std::invalid_argument(what.str()); + } + + std::string maskStr(item.attribute(tagMask).as_string()); + if (!maskStr.empty()) { + if (!parse(data.mask(), maskStr)) { + std::stringstream what; + what << + "Malformed " << tag << "entry Mask=\"" << maskStr << + "\" value =\"" << val << "\"" << + " for catalog " << m_name; + throw std::invalid_argument(what.str()); + } + } else { + data.mask() = nomask(); + } + + data.value() = val; + + // scan option file/line data if value supports source positions + // + if (std::is_base_of, V>::value) { + catalogentry * entry((catalogentry*)&data.value()); + entry->mask = data.mask(); + + std::string file(item.attribute(tagFileAttr).as_string()); + std::string line(item.attribute(tagLine).as_string()); + + if (!file.empty()) { + if (!parse(entry->m_file, file)) { + std::stringstream what; + what << + "Malformed File attribute " << file << + "in section " << tag << + " for catalog " << m_name; + throw std::invalid_argument(what.str()); + } + } + + if (!line.empty()) { + if (!parse(entry->m_line, line)) { + std::stringstream what; + what << + "Malformed Line attribute " << line << + "in section " << tag << + " for catalog " << m_name; + throw std::invalid_argument(what.str()); + } + } + } + + auto it = dest.find(data.key()); + if (it != dest.end() && it->value() != val) { + std::cerr << + "Overwriting ID" << data.key() << " -> " << val << + " old value: " << it->value() << std::endl; + *it = data; + } + else { + dest.push_back(data); + } + } +} + +/** Helper to parse a GUID "{...}" string into the binary representation. +* @param str GUID ascii string "{xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" +* @param guid resulting guid +* @return true if guid could be parserd +*/ +bool guid::parse(const std::string& str) +{ + if ( + (str.length() != sizeof("{00000000-0000-0000-0000-000000000000}")-1) || + str[0]!= '{' ||str[37] != '}' || + str[9] != '-' || str[14] != '-' || str[19] != '-' || str[24] != '-' + ) + { + return false; + } + + // parse the byte values; + // + const char * p(str.c_str()+1); + + for (int i(0); i < 16; ++i, p += 2) { + if (i == 4 || i == 6|| i == 8 || i == 10) { + p++; // skip "-" + } + std::stringstream sstr(std::string(p, 2)); + uint16_t temp; + + if (! (sstr >> std::hex >>temp)) { + return false; + } + u.b[i] = (uint8_t)(temp); + } + + return true; +} + +std::ostream& operator<<(std::ostream& os, const guid& g) +{ + auto flags(os.flags()); + + + os << '{'; + + for (int i(0); i < 16; ++i) { + os << std::setfill('0') << std::noshowbase << std::hex << std::setw(2) + << (uint16_t)g.u.b[i]; + + if (i == 3 || i == 5|| i == 7 || i == 9) { + os << '-'; + } + } + + os << '}'; + + os.flags(flags); + return os; +} + +MIPI_SYST_NAMESPACE_END \ No newline at end of file diff --git a/printer/src/mipi_syst_decode.cpp b/printer/src/mipi_syst_decode.cpp new file mode 100644 index 0000000..1c9b1d8 --- /dev/null +++ b/printer/src/mipi_syst_decode.cpp @@ -0,0 +1,874 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ +#include +#include + +#include "mipi_syst_decode.h" +#include "mipi_syst_printf.h" + +MIPI_SYST_NAMESPACE_BEGIN + +/// Helper to extract string from byte array, +// +// @param dest where to write bytes to +// @param offset where to start from +// @param data byte array +// @param len number of bytes in array +// +// @return bytes consumed or < 0 if no null byte found +// +static int32_t bytes2String(std::string& dest, const uint8_t * data, uint32_t len) +{ + uint32_t i(0); + + while(i 0) { + printer.format(fmt, data, len, result); + } + else { + printer.format(fmt, NULL, 0, result); + } + return result; +} + +void decoder::setBuildNumber(uint64_t id, const guid& g) const +{ + // cache guid <-> id association + // TODO: A production quality implementation should add a sanity check here + // and issue a warning if the ID changes compared to an earlier one. + // + if (build_by_guid.find(g) != build_by_guid.end()) { + build_by_guid[g] = id; + } + + // Remove an eventually earlier cached collateral to guid mapping. We recompute + // next time with the now known build id. + // + auto cache_hit(collateral_by_guid.find(g)); + if (cache_hit != collateral_by_guid.end()) { + collateral_by_guid.erase(cache_hit); + } +} + + +// Decode single SyS-T message +// +bool decoder::decode(message& dest, const std::vector& data, const decode_context * ctx) const +{ + bool rt(false); + + try { + // header + // + if (data.size() < sizeof(uint32_t)) throw tooshort_exception(); + message::header hdr(bytes2ValLE(&data[0])); + + // short message ? + // + if (message::isShort(hdr)) { + rt = decodeShortMessage(dest, &data[0], (uint32_t)data.size(), ctx); + } else { + rt = decodeNormalMessage(dest, &data[0], (uint32_t)data.size(), ctx); + } + + if (rt && dest.getHeader().field.type == message::BUILD) { + // found build message, store build number for later + // + setBuildNumber(dest.getBuild(), dest.getGuid()); + } + } catch (decode_exception& de) { + dest.setStatus(de.get_state()); + + // decode failed, show raw byte dump as payload + // + std::stringstream sstr; + sstr << std::hex << std::uppercase << std::setfill('0') << std::setw(2); + for (auto uc : data) { + sstr << (uint16_t)uc; + } + dest.setPayload(sstr.str()); + } + return rt; +} + + +template void decodeShortPayload(message & m, T v) +{ + const collateral * coll(m.getCollateral()); + const collateral::catalogentry * entry( + coll ? coll->getShortEntry(v) : nullptr); + + if (entry) { + std::stringstream dest; + hostPrintf(dest, entry->msg, v & (~entry->mask), std::vector()); + m.setPayload(dest.str()); + } else { + m.setPayload(toHexValue(v)); + } +} + +bool decoder::decodeShortMessage( + message& dest, + const uint8_t *data, uint32_t length, + const decode_context * ctx) const +{ + if (length < sizeof(uint32_t)) throw tooshort_exception(); + + uint32_t type(data[0] & 0x0F); // Bit 0..3 = type + uint32_t subtype(data[3] & 0x3F); // Bit 24..29 = subtype + + dest.setHeader(0); // all optional fields off + dest.setType(type); + dest.setLength(length); + dest.setCollateral(ctx ? findCollateral(ctx->getGuid()) : nullptr); + dest.setContextTS(ctx ? ctx->getTS() : 0); + + switch (type) { + case message::type::SHORT32: + decodeShortPayload(dest, bytes2ValLE(data) >> 4); + break; + + case message::type::SHORT64: + if (length < sizeof(uint64_t)) throw tooshort_exception(); + decodeShortPayload(dest, bytes2ValLE(data) >> 4); + break; + + case message::type::BUILD: + dest.setSubType(subtype); + switch (subtype) { + case message::subtype_build::BUILD_COMPACT32: + { + uint32_t val(bytes2ValLE(data)); + val = ((val & 0x00FFFFF0) >> 4) | ((val & 0x30000000) >> 10); + dest.setBuild(val); + dest.setPayload(toHexValue(val)); + break; + } + case message::subtype_build::BUILD_COMPACT64: + { + if (length < sizeof(uint64_t)) throw tooshort_exception(); + + uint64_t val(bytes2ValLE(data)); + val = ((val & 0x0000000000FFFFF0ull) >> 4) | + ((val & 0xFFFFFFFF30000000ull) >> 10); + dest.setBuild(val); + dest.setPayload(toHexValue(val)); + + break; + } + default: + throw unknown_type_exception(); + } + break; + default: + throw unknown_type_exception(); + } + + dest.setStatus(message::decode_state::OK); + + return true; +} + +// Decode "normal" SyS-T message data +// +bool decoder::decodeNormalMessage(message& dest, const uint8_t * data, uint32_t length, const decode_context * ctx) const +{ + uint32_t offset(0); + + dest.setContextTS(ctx ? ctx->getTS() : 0); + dest.setLength(length); + + // header + // + if (length < (offset + sizeof(uint32_t))) throw tooshort_exception(); + dest.setHeader(bytes2ValLE(data+offset)); + offset += sizeof(uint32_t); + + // checksum at the end ? + // + if (dest.getHeader().field.chksum) { + if (length < offset + sizeof(uint32_t)) throw tooshort_exception(); + length -= sizeof(uint32_t); + dest.setCrc(bytes2ValLE(data+length)); + } + + // guid + // + if (dest.getHeader().field.guid) { + if (length < (offset + sizeof(uint64_t[2]))) throw tooshort_exception(); + + dest.setGuid(guid(data+offset)); + offset += sizeof(uint64_t[2]); + } else { + dest.setGuid(generatePseudoGuid(dest.getHeaderOrigin())); + } + + // location + // + if (dest.getHeader().field.location) { + if (length < offset + sizeof(uint8_t)) throw tooshort_exception(); + uint32_t tag(data[offset++]); + if (tag & 0x1) { + // 64 bit + if (length < offset + sizeof(uint64_t)) throw tooshort_exception(); + if (tag & 0x2) { // addr + uint64_t addr(bytes2ValLE(data+offset)); + dest.setLocAddr64(addr); + } else { + uint32_t file(bytes2ValLE(data + offset)); + uint32_t line(bytes2ValLE(data + offset + 4)); + dest.setLocFileLine(file, line); + } + offset += sizeof(uint64_t); + } else { + // 32 bit + if (length < offset + sizeof(uint32_t)) throw tooshort_exception(); + if (tag & 0x2) { // addr + uint32_t addr(bytes2ValLE(data + offset)); + dest.setLocAddr32(addr); + } else { + uint16_t file(bytes2ValLE(data + offset)); + uint16_t line(bytes2ValLE(data + offset + 2)); + dest.setLocFileLine(file, line); + } + offset += sizeof(uint32_t); + } + } + + // length + // + uint32_t payload_len(length - offset); + + if (dest.getHeader().field.length) { + if (length < offset + sizeof(uint16_t)) throw tooshort_exception(); + payload_len = bytes2ValLE(data + offset); + offset += sizeof(uint16_t); + } + + // timestamp + // + if (dest.getHeader().field.timestamp) { + if (length < offset + sizeof(uint64_t)) throw tooshort_exception(); + dest.setMessageTS(bytes2ValLE(data + offset)); + offset += sizeof(uint64_t); + } + + if (dest.getHeader().field.length) { + // length given, compare with remaining payload length + // + int diff(length - offset - payload_len); + if (diff < 0) { + throw tooshort_exception(); + } else if (diff > 0) { + throw toolong_exception(); + } + } + + // check CRC32 if set + // + if (dest.getHeader().field.chksum) { + uint32_t crc = getCrc32(data, length); + if (crc != dest.getCrc()) { + throw crc_error_exception(); + } + } + + // Check for collateral information + // + const collateral* coll = findCollateral(dest.getGuid()); + dest.setCollateral(coll); + + // Set client name based on collateral (or use raw guid/origin from message) + // + if (coll != nullptr) { + dest.setClientName(coll->getName()); + } + else { + std::stringstream sstr; + if (dest.getHeader().field.guid) { + sstr << dest.getGuid(); + } else { + sstr << dest.getHeaderOrigin(); + } + dest.setClientName(sstr.str()); + } + + // Payload decode depening on type + // + (this->*payloadDecode[dest.getHeader().field.type])(dest, data+offset, length - offset); + + dest.setStatus(message::decode_state::OK); + return true; +} + +void decoder::decodeInvalidType(message& dest, const uint8_t * data, uint32_t len) const +{ + (void)dest; + (void)data; + (void)len; + + throw unknown_type_exception(); +} + +void decoder::decodeBuildPayload(message& dest, const uint8_t * data, uint32_t len) const +{ + std::stringstream sstr; + + switch (dest.getHeader().field.subtype) { + case message::subtype_build::BUILD_LONG: + if (len < sizeof(uint64_t)) throw tooshort_exception(); + + dest.setBuild(bytes2ValLE(data)); + sstr << toHexValue(dest.getBuild()); + + data += sizeof(uint64_t); + len -= sizeof(uint64_t); + + if (0 != len) { // string follows .... + std::string payload; + if (bytes2String(payload, data, len) > 0) { + sstr << " " << payload; + } else { + throw tooshort_exception(); + } + } + break; + default: + throw unknown_type_exception(); + break; + } + + dest.setPayload(sstr.str()); +} + +void decoder::decodeStringPayload(message& dest, const uint8_t * data, uint32_t len) const +{ + std::string format; + int fmtlen; + + if (!len || (fmtlen = bytes2String(format, data, len)) <= 0) { + throw tooshort_exception(); + } + + std::stringstream sstr; + + switch (dest.getHeader().field.subtype) { + case message::subtype_string::STRING_PRINTF_32: + case message::subtype_string::STRING_PRINTF_64: + sstr << printfFormat( + format, + dest.getHeader().field.subtype == + message::subtype_string::STRING_PRINTF_32, + &data[fmtlen+1], + len - fmtlen - 1); + break; + + case message::subtype_string::STRING_ASSERT: + case message::subtype_string::STRING_FUNCTIONENTER: + case message::subtype_string::STRING_FUNCTIONEXIT: + case message::subtype_string::STRING_GENERIC: + case message::subtype_string::STRING_INVALIDPARAM: + sstr << format; + break; + default: + throw unknown_type_exception(); + break; + } + + dest.setPayload(sstr.str()); +} + +void decoder::decodeCatalogPayload(message& dest, const uint8_t * data, uint32_t len) const +{ + const collateral * coll(dest.getCollateral()); + if (coll == nullptr) throw missing_collateral_exception(); + + std::stringstream sstr; + bool is32Bit(false); + const collateral::sourcepos * srcpos(nullptr); + const std::string * fmt(nullptr); + + switch (dest.getHeader().field.subtype) { + case message::subtype_catalog::CATALOG_ID32_P32: + is32Bit = true; + // fall through + + case message::subtype_catalog::CATALOG_ID32_P64: + { + if (len < sizeof(uint32_t)) throw tooshort_exception(); + const collateral::catalogentry * entry(nullptr); + + if ((entry = coll->getCatalogEntry(bytes2ValLE(data))) == nullptr) { + sstr + << "Undefined catalog id 0x" + << toHexValue(bytes2ValLE(data)); + } else { + fmt = &entry->msg; + srcpos = entry; + } + data += sizeof(uint32_t); + len -= sizeof(uint32_t); + break; + } + case message::subtype_catalog::CATALOG_ID64_P32: + is32Bit = true; + // fall through + case message::subtype_catalog::CATALOG_ID64_P64: + { + if (len < sizeof(uint64_t)) throw tooshort_exception(); + const collateral::catalogentry * entry(nullptr); + + if ((entry = coll->getCatalogEntry(bytes2ValLE(data))) == nullptr) { + sstr + << "Undefined catalog id 0x" + << toHexValue(bytes2ValLE(data)); + } else { + fmt = &entry->msg; + srcpos = entry; + } + data += sizeof(uint64_t); + len -= sizeof(uint64_t); + break; + } + default: + throw unknown_type_exception(); + break; + } + + if (fmt != nullptr) { + sstr << printfFormat(*fmt, is32Bit, data, len); + + // if current message has no file attribute from payload, but the catalog entry + // does provides one, use the one from the catalog + // + if (0 != srcpos->m_file && 0 == (dest.getLocation().tag & message::IDANDLINE)) + { + dest.setLocFileLine(srcpos->m_file, srcpos->m_line); + } + } + + dest.setPayload(sstr.str()); +} + +void decoder::decodeRawPayload(message& dest, const uint8_t * data, uint32_t len) const +{ + std::stringstream sstr; + + while (len--) { + sstr << std::setfill('0') << std::setw(2) << std::hex << (uint16_t)*data++; + } + + dest.setPayload(sstr.str()); +} + +void decoder::loadCollateral(const std::string& filename) +{ + for (auto items : collateral::parseXml(filename)) { + collaterals.insert(collaterals.end(), items); + } +} + +guid decoder::generatePseudoGuid(uint8_t origin) +{ + // A pseudo-guid is defined by storing the origin value into + // bits [7..0] of the guid[8] byte. The highest bit is forced + // to zero, which distiquishes it from an RFC4122 compliant + // GUID. + // This example code has no additional transport data for + // identifying the message client. All other values are + // set to 0. + // + uint8_t pseudo_guid_data[16] = { + 0,0,0,0, + 0,0,0,origin, + 0,0,0,0, + 0,0,0,0 + }; + return guid(pseudo_guid_data); +} + +collateral * decoder::findCollateral(const guid& g) const +{ + // do we already know the catalog for this GUID ? + // + auto cache_hit(collateral_by_guid.find(g)); + if (cache_hit != collateral_by_guid.end()) { + return cache_hit->second; + } + + uint64_t build(0); + auto build_hit(build_by_guid.find(g)); + if (build_hit != build_by_guid.end()) { + build = build_hit->second; + } + + // search all catalogs + // + auto match = std::find_if(collaterals.begin(), collaterals.end(), + [&g,build](const collateral* v) + { + return (v->match(g, build)); + }); + + if (match != collaterals.end()) { + collateral_by_guid[g] = *match; + return *match; + } + return nullptr; +} + +// Message type dependend payload decode handlers +// +decoder::decode_payload_f decoder::payloadDecode[] = { + &decoder::decodeBuildPayload, // [0] + &decoder::decodeInvalidType, // [1] + &decoder::decodeStringPayload, // [2] + &decoder::decodeCatalogPayload, // [3] + &decoder::decodeInvalidType, // [4] + &decoder::decodeInvalidType, // [5] + &decoder::decodeRawPayload, // [6] + &decoder::decodeInvalidType, // [7] + &decoder::decodeInvalidType, // [8] + &decoder::decodeInvalidType, // [9] + &decoder::decodeInvalidType, // [10] + &decoder::decodeInvalidType, // [11] + &decoder::decodeInvalidType, // [12] + &decoder::decodeInvalidType, // [13] + &decoder::decodeInvalidType, // [14] + &decoder::decodeInvalidType // [15] +}; + +// Build CRC over a byte buffer (Castagnoli CRC-32C) +// +uint32_t decoder::getCrc32(const uint8_t * data, size_t len) +{ + uint32_t crc(0xFFFFFFFF); + + while (len--) { + crc = crc32c_table[((int)crc ^ (*data++)) & 0xFF] ^ (crc >> 8); + } + return crc ^ 0xFFFFFFFF; +} + +// Pre-computed CRC-C values for all byte values using the +// polynomial 0x1EDC6F41 (Castagnoli). +// +const uint32_t decoder::crc32c_table[256] = { + 0x00000000, + 0xF26B8303, + 0xE13B70F7, + 0x1350F3F4, + 0xC79A971F, + 0x35F1141C, + 0x26A1E7E8, + 0xD4CA64EB, + 0x8AD958CF, + 0x78B2DBCC, + 0x6BE22838, + 0x9989AB3B, + 0x4D43CFD0, + 0xBF284CD3, + 0xAC78BF27, + 0x5E133C24, + 0x105EC76F, + 0xE235446C, + 0xF165B798, + 0x030E349B, + 0xD7C45070, + 0x25AFD373, + 0x36FF2087, + 0xC494A384, + 0x9A879FA0, + 0x68EC1CA3, + 0x7BBCEF57, + 0x89D76C54, + 0x5D1D08BF, + 0xAF768BBC, + 0xBC267848, + 0x4E4DFB4B, + 0x20BD8EDE, + 0xD2D60DDD, + 0xC186FE29, + 0x33ED7D2A, + 0xE72719C1, + 0x154C9AC2, + 0x061C6936, + 0xF477EA35, + 0xAA64D611, + 0x580F5512, + 0x4B5FA6E6, + 0xB93425E5, + 0x6DFE410E, + 0x9F95C20D, + 0x8CC531F9, + 0x7EAEB2FA, + 0x30E349B1, + 0xC288CAB2, + 0xD1D83946, + 0x23B3BA45, + 0xF779DEAE, + 0x05125DAD, + 0x1642AE59, + 0xE4292D5A, + 0xBA3A117E, + 0x4851927D, + 0x5B016189, + 0xA96AE28A, + 0x7DA08661, + 0x8FCB0562, + 0x9C9BF696, + 0x6EF07595, + 0x417B1DBC, + 0xB3109EBF, + 0xA0406D4B, + 0x522BEE48, + 0x86E18AA3, + 0x748A09A0, + 0x67DAFA54, + 0x95B17957, + 0xCBA24573, + 0x39C9C670, + 0x2A993584, + 0xD8F2B687, + 0x0C38D26C, + 0xFE53516F, + 0xED03A29B, + 0x1F682198, + 0x5125DAD3, + 0xA34E59D0, + 0xB01EAA24, + 0x42752927, + 0x96BF4DCC, + 0x64D4CECF, + 0x77843D3B, + 0x85EFBE38, + 0xDBFC821C, + 0x2997011F, + 0x3AC7F2EB, + 0xC8AC71E8, + 0x1C661503, + 0xEE0D9600, + 0xFD5D65F4, + 0x0F36E6F7, + 0x61C69362, + 0x93AD1061, + 0x80FDE395, + 0x72966096, + 0xA65C047D, + 0x5437877E, + 0x4767748A, + 0xB50CF789, + 0xEB1FCBAD, + 0x197448AE, + 0x0A24BB5A, + 0xF84F3859, + 0x2C855CB2, + 0xDEEEDFB1, + 0xCDBE2C45, + 0x3FD5AF46, + 0x7198540D, + 0x83F3D70E, + 0x90A324FA, + 0x62C8A7F9, + 0xB602C312, + 0x44694011, + 0x5739B3E5, + 0xA55230E6, + 0xFB410CC2, + 0x092A8FC1, + 0x1A7A7C35, + 0xE811FF36, + 0x3CDB9BDD, + 0xCEB018DE, + 0xDDE0EB2A, + 0x2F8B6829, + 0x82F63B78, + 0x709DB87B, + 0x63CD4B8F, + 0x91A6C88C, + 0x456CAC67, + 0xB7072F64, + 0xA457DC90, + 0x563C5F93, + 0x082F63B7, + 0xFA44E0B4, + 0xE9141340, + 0x1B7F9043, + 0xCFB5F4A8, + 0x3DDE77AB, + 0x2E8E845F, + 0xDCE5075C, + 0x92A8FC17, + 0x60C37F14, + 0x73938CE0, + 0x81F80FE3, + 0x55326B08, + 0xA759E80B, + 0xB4091BFF, + 0x466298FC, + 0x1871A4D8, + 0xEA1A27DB, + 0xF94AD42F, + 0x0B21572C, + 0xDFEB33C7, + 0x2D80B0C4, + 0x3ED04330, + 0xCCBBC033, + 0xA24BB5A6, + 0x502036A5, + 0x4370C551, + 0xB11B4652, + 0x65D122B9, + 0x97BAA1BA, + 0x84EA524E, + 0x7681D14D, + 0x2892ED69, + 0xDAF96E6A, + 0xC9A99D9E, + 0x3BC21E9D, + 0xEF087A76, + 0x1D63F975, + 0x0E330A81, + 0xFC588982, + 0xB21572C9, + 0x407EF1CA, + 0x532E023E, + 0xA145813D, + 0x758FE5D6, + 0x87E466D5, + 0x94B49521, + 0x66DF1622, + 0x38CC2A06, + 0xCAA7A905, + 0xD9F75AF1, + 0x2B9CD9F2, + 0xFF56BD19, + 0x0D3D3E1A, + 0x1E6DCDEE, + 0xEC064EED, + 0xC38D26C4, + 0x31E6A5C7, + 0x22B65633, + 0xD0DDD530, + 0x0417B1DB, + 0xF67C32D8, + 0xE52CC12C, + 0x1747422F, + 0x49547E0B, + 0xBB3FFD08, + 0xA86F0EFC, + 0x5A048DFF, + 0x8ECEE914, + 0x7CA56A17, + 0x6FF599E3, + 0x9D9E1AE0, + 0xD3D3E1AB, + 0x21B862A8, + 0x32E8915C, + 0xC083125F, + 0x144976B4, + 0xE622F5B7, + 0xF5720643, + 0x07198540, + 0x590AB964, + 0xAB613A67, + 0xB831C993, + 0x4A5A4A90, + 0x9E902E7B, + 0x6CFBAD78, + 0x7FAB5E8C, + 0x8DC0DD8F, + 0xE330A81A, + 0x115B2B19, + 0x020BD8ED, + 0xF0605BEE, + 0x24AA3F05, + 0xD6C1BC06, + 0xC5914FF2, + 0x37FACCF1, + 0x69E9F0D5, + 0x9B8273D6, + 0x88D28022, + 0x7AB90321, + 0xAE7367CA, + 0x5C18E4C9, + 0x4F48173D, + 0xBD23943E, + 0xF36E6F75, + 0x0105EC76, + 0x12551F82, + 0xE03E9C81, + 0x34F4F86A, + 0xC69F7B69, + 0xD5CF889D, + 0x27A40B9E, + 0x79B737BA, + 0x8BDCB4B9, + 0x988C474D, + 0x6AE7C44E, + 0xBE2DA0A5, + 0x4C4623A6, + 0x5F16D052, + 0xAD7D5351 +}; + +MIPI_SYST_NAMESPACE_END \ No newline at end of file diff --git a/printer/src/mipi_syst_main.cpp b/printer/src/mipi_syst_main.cpp new file mode 100644 index 0000000..32f6aeb --- /dev/null +++ b/printer/src/mipi_syst_main.cpp @@ -0,0 +1,265 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#include +#include +#include +#include + +#include "mipi_syst_decode.h" +#include "mipi_syst_guid.h" + +// print program usage banner +// +static void usage(const std::string& details) +{ + std::cerr << "usage: systprint [-p] [-c ...] [-g short-message-guid] [-o output] [inputfile(s)...]" << std::endl; + std::cerr << " -p / --payload_only only print payload (default is CSV)" << std::endl; + std::cerr << " -c / --colateral filename load given SyS-T collateral XML" << std::endl; + std::cerr << " -g / --short_guid guid guid value for short messages" << std::endl; + std::cerr << " -o / --output file output file name (default stdout)" << std::endl; + std::cerr << " inputfile(s)... file(s) with example library platform output or '-' for stdin" << std::endl; + std::cerr << std::endl; + + if (!details.empty()) { + std::cerr << details << std::endl; + } + exit(1); +} + + +// ASCII char -> HEX nibble value, or 0xFF if invalid +// +static const uint8_t hexCharVal[] = +{ + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 10, 11, 12, 13, 14, 15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 10, 11, 12, 13, 14, 15, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF +}; + + +// Convert ASCII hex string into byte array, fail if string is not a +// sequence of 0..(2*n) hex characters +// +static bool hex2bin(const std::string& hexStr, std::vector& dest) +{ + size_t nibbles(hexStr.size()); + + if (nibbles % 2) { // 2 chars needed for 1 value + return false; + } + dest.clear(); + + for(auto hexChar(hexStr.c_str()); nibbles ; nibbles -= 2) + { + auto high(hexCharVal[(uint8_t)*hexChar++]); + auto low(hexCharVal[(uint8_t)*hexChar++]); + if (high == 0xFF || low == 0xFF) { + return false; + } + dest.push_back((high << 4) | low); + } + return true; +} + + +// Scan input file that is assumed to come from the SyS-T library example platform. +// Extract the raw event HEX data lines that look like this +// +// SYS-T RAW DATA: 4202000B0... +// +// Then parse the hex portion of the line and try to decode it as a SyS-T message. +// +static void readAndPrint(std::istream& is, std::ostream& os, + bool payload_only, + const mipi::syst::decode_context * ctx, + const mipi::syst::decoder& decoder) +{ + static const std::string pattern("SYS-T RAW DATA: "); + std::string line; + + while (getline(is, line)) { + if (line.compare(0, pattern.size(), pattern)) { + continue; // not a raw dump of a SyS-T message + } + + // sanitize line endings + // + while (line.size() && + (line[line.size()-1] == '\r' || + line[line.size()-1] == '\n')) + { + line.erase(line.size()-1); + } + std::vector bytes; + if (!hex2bin(line.substr(pattern.size()), bytes)) { + continue; + } + mipi::syst::message msg; + + decoder.decode(msg, bytes, ctx); + if (payload_only) { + os << msg.getPayload() << std::endl; + } else { + os << msg; + } + } +} + +/// Simple GUID context wrapper +// +// This class implements a trivial decode context provider by just +// wrapping a guid set from the command line. A real implementation would +// encapsulate transport information here to build client identifying +// information. @see mipi::syst::decode_context +// +class short_guid_context : public mipi::syst::decode_context { +public: + short_guid_context(const mipi::syst::guid& g) : m_guid(g), m_fakeTS(0) {} + + const mipi::syst::guid& getGuid() const { + return m_guid; + } + + uint64_t getTS() const { + return m_fakeTS++; // replace with transport TS + } +private: + mipi::syst::guid m_guid; + mutable uint64_t m_fakeTS; +}; + + +int main(int argc, char ** argv) +{ + std::vector inputs; + std::string output; + bool payload_only(false); + std::shared_ptr short_ctx(nullptr); // guid to use for short messages + + mipi::syst::decoder decoder; + + // parse & check arguments + // + for (auto i = 1; i < argc; ++i) { + const std::string arg(argv[i]); + if (arg == "-c" || arg == "--collateral") { + if (++i >= argc) { + usage("missing collateral file argument"); + } + try { + decoder.loadCollateral(argv[i]); + } + catch (std::exception& e) { + std::cerr << "error loading '" << argv[i] << "': " << e.what(); + exit(1); + } + } else if (arg == "-p" || arg == "--payload_only") { + payload_only = true; + } else if (arg == "-g" || arg == "--short_guid") { + if (++i >= argc) { + usage("missing guid argument for -g/--short_guid option"); + } + try { + short_ctx = std::make_shared( + mipi::syst::guid(argv[i])); + } catch (std::exception& e) { + std::cerr << e.what(); + exit(1); + } + } else if (arg == "-o" || arg == "--output") { + if (++i >= argc) { + usage("missing filename argument for -o/--output option"); + } + output = argv[i]; + } else if (arg == "-") { //stdin + inputs.push_back(arg); + } else if (arg[0] == '-') { + usage(std::string("unknown argument : ") + arg); + } else { + inputs.push_back(arg); + } + } + + if (inputs.empty()) { + usage("no input provided"); + } + + // set output destination (default stdout) + // + std::ostream * os(&std::cout); + std::ofstream ofs; + + if (!output.empty()) { + ofs.open(output.c_str(), std::ofstream::out); + if (!ofs.is_open()) { + std::cerr << "unable to open output file : " << output << std::endl; + exit(1); + } + os = &ofs; + } + + if (!payload_only) { + *os << mipi::syst::message::csvHeaderString << std::endl; + } + for (auto input : inputs) { + if (input == "-") { + readAndPrint(std::cin, *os, payload_only, short_ctx.get(), decoder); + } else { + std::ifstream ifs(input); + if (!ifs.is_open()) { + std::cerr << "unable to open input file : " << input << std::endl; + exit(1); + } + readAndPrint(ifs, *os, payload_only, short_ctx.get(), decoder); + ifs.close(); + } + } + + if (ofs.is_open()) { + ofs.close(); + } + + return 0; +} \ No newline at end of file diff --git a/printer/src/mipi_syst_message.cpp b/printer/src/mipi_syst_message.cpp new file mode 100644 index 0000000..f67c2b6 --- /dev/null +++ b/printer/src/mipi_syst_message.cpp @@ -0,0 +1,371 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#include +#include "mipi_syst_message.h" +#include "mipi_syst_collateral.h" +#include "mipi_syst_printf.h" + +MIPI_SYST_NAMESPACE_BEGIN + +// Code for storing and printing out decoded message content +// + +void message::setLocAddr32(uint32_t addr) +{ + m_loc.tag |= location_type::ADDRESS32; + m_loc.tag &= ~location_type::ADDRESS64; + m_loc.address = addr; +} + +void message::setLocAddr64(uint64_t addr) +{ + m_loc.tag |= location_type::ADDRESS64; + m_loc.tag &= ~location_type::ADDRESS32; + m_loc.address = addr; +} + +void message::setLocFileLine(uint32_t file, uint32_t line) +{ + m_loc.tag |= location_type::IDANDLINE; + m_loc.file = file; + m_loc.line = line; +} + +// Check type for short message +// +bool message::isShort(message::header hdr) { + switch (hdr.field.type) { + case message::type::SHORT32: + case message::type::SHORT64: + return true; + + case message::type::BUILD: + switch (hdr.field.subtype) { + case message::subtype_build::BUILD_COMPACT32: + case message::subtype_build::BUILD_COMPACT64: + return true; + } + } + return false; +} + + +// Pretty print decode status value +// +static const char * status2string(const message& msg) +{ + switch (msg.getState()) { + case message::decode_state::OK: + return "OK"; + case message::decode_state::UNKNOWN_TYPE: + return "UNKNOWN_TYPE"; + case message::decode_state::TOO_SHORT: + return "TOO_SHORT"; + case message::decode_state::CHECKSUM_ERROR: + return "CHECKSUM_ERROR"; + case message::decode_state::MISSING_COLLATERAL: + return "MISSING_COLLATERAL"; + default: + return "UNKNOWN_STATE"; + } +} + +// Pretty print sevrity values +// +static const char * severity2string[] = { + "MAX", + "FATAL", + "ERROR", + "WARNING", + "INFO", + "USER1", + "USER2", + "DEBUG" +}; + +// Pretty print type:subtype values +// +static const std::string type2string( + message::header hdr, + const collateral * coll) +{ + static const char * typenames[] = { + "BUILD", + "SHORT32", + "STRING", + "CATALOG", + "UNKNOWN(4)", + "UNKNOWN(5)", + "RAW", + "SHORT64", + "CLOCK", + "UNKNOWN(9)", + "UNKNOWN(10)", + "UNKNOWN(11)", + "UNKNOWN(12)", + "UNKNOWN(13)", + "UNKNOWN(14)", + "UNKNOWN(15)", + }; + + uint32_t type(hdr.field.type); + std::stringstream sstr; + + sstr << typenames[type]; + + // compute subtype string + // + std::string subtype("??"); + + switch (type) { + case message::type::SHORT32: + case message::type::SHORT64: + subtype.clear(); // no subtype + break; + + case message::type::BUILD: + switch (hdr.field.subtype) { + case message::subtype_build::BUILD_LONG: + subtype = "LONG"; + break; + case message::subtype_build::BUILD_COMPACT32: + subtype = "COMPACT32"; + break; + case message::subtype_build::BUILD_COMPACT64: + subtype = "COMPACT64"; + break; + } + break; + case message::type::STRING: + switch (hdr.field.subtype) { + case message::subtype_string::STRING_GENERIC: + subtype = "GENERIC"; + break; + case message::subtype_string::STRING_FUNCTIONENTER: + subtype = "ENTER"; + break; + case message::subtype_string::STRING_FUNCTIONEXIT: + subtype = "EXIT"; + break; + case message::subtype_string::STRING_INVALIDPARAM: + subtype = "INVPARAM"; + break; + case message::subtype_string::STRING_ASSERT: + subtype = "ASSERT"; + break; + case message::subtype_string::STRING_PRINTF_32: + subtype = "PRINTF32"; + break; + case message::subtype_string::STRING_PRINTF_64: + subtype = "PRINTF64"; + break; + } + break; + case message::type::CATALOG: + switch (hdr.field.subtype) { + case message::subtype_catalog::CATALOG_ID32_P32: + subtype = "ID32P32"; + break; + case message::subtype_catalog::CATALOG_ID64_P32: + subtype = "ID64P32"; + break; + case message::subtype_catalog::CATALOG_ID32_P64: + subtype = "ID32P64"; + break; + case message::subtype_catalog::CATALOG_ID64_P64: + subtype = "ID64P64"; + break; + } + break; + case message::type::RAW: + { + const std::string * name(nullptr); + if (coll && (name = coll->getWriteType(hdr.field.subtype)) != nullptr) + { + std::stringstream dest; + hostPrintf(dest, *name, hdr.field.subtype, std::vector()); + subtype = dest.str(); + } else { + subtype = std::to_string(hdr.field.subtype); + } + } break; + + case message::type::CLOCK: + switch (hdr.field.subtype) { + case message::subtype_clock::CLOCK_SYNC: + subtype = "SYNC"; + break; + } + break; + } + + if (!subtype.empty()) { + sstr << ':' << subtype; + } + + return sstr.str(); +} + +// CSV double-quote escaping, replace " with "" and eliminate newlines +// +void csvQuoteString(std::ostream& os, const std::string& s) +{ + for (auto c : s) { + if (c == '\n') { + os << ' '; // newline not supported in CSV + } else if (c == '"') { + os << c << c; + } else { + os << c; + } + } +} + +// location information printing +// +std::string location2string( + const message::location& loc, + const collateral * collateral) +{ + bool hasAddress(0!=(loc.tag & (message::ADDRESS32 | message::ADDRESS32))); + bool hasFileLine(0 != (loc.tag & message::IDANDLINE)); + + std::stringstream sstr; + + if (hasFileLine) { + const std::string * fileName( + collateral != nullptr ? + collateral->getSourceFile(loc.file) : nullptr); + + if (fileName != nullptr) { + sstr << (*fileName) << ':' << loc.line; + } else { + sstr << loc.file << ':' << loc.line; + } + if (hasAddress) sstr << ' '; + } + + if (hasAddress) { + if (loc.tag & message::ADDRESS32) { + sstr << toHexValue((uint32_t)loc.address); + } else { + sstr << toHexValue(loc.address); + } + } + + return sstr.str(); +} +const char message::csvHeaderString[] = "Decode Status,Payload,Type,Severity,Origin,Unit,Message TimeStamp,Context TimeStamp,Location,Raw Length,Checksum,Collateral"; + +// CSV line formatting of a message +// +std::ostream& operator << (std::ostream& os, const message& msg) +{ + char delimiter(','); + const collateral * coll(msg.getCollateral()); + + // turn volatile fields like timestamp/crc off when running unit testing + // + static bool unit_testing(getenv("SYST_UNITTESTING") != NULL); + + // status + os << status2string(msg) << delimiter; + + // payload + os << '"'; + csvQuoteString(os, msg.getPayload()); + os << '"' << delimiter; + + if (msg.getState() != message::OK && msg.getState() != message::MISSING_COLLATERAL) + { + // decode failed, report other fields as empty. The data can't be trusted. + // + os << ",,,,," << std::endl; + return os; + } + + // Type/Subtype + // + os << type2string(msg.getHeader(), msg.getCollateral()) << delimiter; + + // Severity + // + os << severity2string[msg.getHeader().field.severity] << delimiter; + + // client name and unit + // + os << msg.getClientName() << delimiter; + os << msg.getUnit() << delimiter; + + // time stamps + if (msg.getHeader().field.timestamp) { + os << (unit_testing ? + "<--UNITTEST-HIDE_TS-->" : toHexValue(msg.getMessageTS())); + } + os << delimiter; + + os << (unit_testing ? + "<--UNITTEST-HIDE_TS-->" : toHexValue(msg.getContextTS())) << delimiter; + + // location + // + csvQuoteString(os, location2string(msg.getLocation(), coll)); + os << delimiter; + + // raw message length + // + os << std::to_string(msg.getLength()) << delimiter; + + // crc + // + if (msg.getHeader().field.chksum) { + os << (unit_testing ? "<--UNITTEST-HIDE_CRC-->" : toHexValue(msg.getCrc())); + } + os << delimiter; + + if (coll != nullptr) { + csvQuoteString(os, coll->getFileName()); + } + os << std::endl; + + return os; +} + +MIPI_SYST_NAMESPACE_END \ No newline at end of file diff --git a/printer/src/mipi_syst_printf.cpp b/printer/src/mipi_syst_printf.cpp new file mode 100644 index 0000000..e0da037 --- /dev/null +++ b/printer/src/mipi_syst_printf.cpp @@ -0,0 +1,435 @@ +/* + Copyright (c) 2018, MIPI Alliance, Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * Contributors: + * Norbert Schulz (Intel Corporation) - Initial API and implementation + */ + +#include +#include "mipi_syst_printf.h" + +MIPI_SYST_NAMESPACE_BEGIN + +template<> double bytes2ValLE(const void * data) +{ + union { uint64_t ll; double d; } u = { bytes2ValLE(data) }; + return u.d; +} + +// Parse printf style format string into a sequence of text and format fragments +// +uint32_t +fmtscanner::parse(const std::string& fmt, Args& args) +{ + uint32_t result(OK); + + const char * p(fmt.c_str()); + const char * eof(p + fmt.size()); + FmtScanState state(START); + Modifier modifier(MOD_NONE); + size_t fmtPos = 0; // curremt position in format + size_t fragmentStart = 0; // where current fragment started + size_t lastPercentPos = 0; // where the last % fmt start was seen + + args.clear(); + + while (p < eof) { + switch (state) { + case START: + fragmentStart = fmtPos; + modifier = MOD_NONE; + + state = PLAINTEXT; + ; // deliberate fall through + + case PLAINTEXT: + if (*p == '%') { + lastPercentPos = fmtPos; + state = PERCENT; + } + break; + + case PERCENT: + if (*p == '%') { + lastPercentPos = 0; // '%%' is not a format, but the % char + state = PLAINTEXT; + } else { + // arg fmt definition is starting + // + if (lastPercentPos != fragmentStart) { + args.push_back( + ArgFragment(TEXT, 0, + fmt.substr(fragmentStart, + lastPercentPos - fragmentStart))); + } + fragmentStart = lastPercentPos; + state = FLAGS; + continue; + } + break; + + case FLAGS: + switch (*p) { + case '-': + case '+': + case ' ': + case '#': + case '0': + break; + default: + state = WIDTH; + continue; + break; + } + break; + + case WIDTH: + if (*p == '*') { + args.push_back(ArgFragment(STAR, SIZEOF_INT, "")); + state = PRECISION_DOT; + } else { + state = WIDTH_NUMBER; + continue; + } + break; + + case WIDTH_NUMBER: + if (!isdigit(*p)) { + state = PRECISION_DOT; + continue; + } + break; + + case PRECISION_DOT: + if (*p == '.') { + state = PRECISION_VAL; + } else { + state = MODIFIER; + continue; + } + break; + + case PRECISION_VAL: + if (*p == '*') { + args.push_back(ArgFragment(STAR, SIZEOF_INT, std::string())); + state = MODIFIER; + } else { + state = PRECISION_NUMBER; + continue; + } + break; + + case PRECISION_NUMBER: + if (!isdigit(*p)) { + state = MODIFIER; + continue; + } + break; + + case MODIFIER: + state = SPECIFIER; + + switch (*p) { + case 'h': + modifier = MOD_H; + state = MODIFIER_HALF; + break; + case 'l': + modifier = MOD_L; + state = MODIFIER_LONG; + break; + case 'j': + modifier = MOD_J; + break; + case 'z': + modifier = MOD_Z; + break; + case 't': + modifier = MOD_T; + break; + case 'L': + modifier = MOD_LD; + break; + default: + continue; + } + break; + + case MODIFIER_HALF: + state = SPECIFIER; + if (*p == 'h') { + modifier = MOD_HH; + break; + } else { + continue; + } + break; + + + case MODIFIER_LONG: + state = SPECIFIER; + if (*p == 'l') { + modifier = MOD_LL; + break; + } else { + continue; + } + + case SPECIFIER: + { + std::string fragment = fmt.substr(fragmentStart, + fmtPos - fragmentStart + 1); + + switch (*p) { + case 'd': + case 'i': + case 'u': + case 'o': + case 'x': + case 'X': + switch (modifier) { + case MOD_L: + // convert long to longlong if client is 64bit, but host 32bit + // + if ((SIZEOF_LONG == 8) && (sizeof(long) != 8)) { + size_t pos(fragment.find('l')); + if (pos != std::string::npos) { + fragment = fragment.insert(pos, "l"); + } + } + args.push_back(ArgFragment(INTEGER, SIZEOF_LONG, fragment)); + break; + case MOD_LL: + case MOD_J: + args.push_back(ArgFragment(INTEGER, SIZEOF_LONGLONG, fragment)); + break; + case MOD_Z: + args.push_back(ArgFragment(INTEGER, SIZEOF_SIZEOF, fragment)); + break; + default: + args.push_back(ArgFragment(INTEGER, SIZEOF_INT, fragment)); + break; + } + state = START; + break; + case 'f': + case 'F': + case 'e': + case 'E': + case 'g': + case 'G': + case 'a': + case 'A': + args.push_back(ArgFragment(DOUBLE, SIZEOF_LONGLONG, fragment)); + break; + case 'c': + args.push_back(ArgFragment(INTEGER, SIZEOF_INT, fragment)); + break; + case 'p': + args.push_back(ArgFragment(POINTER, SIZEOF_PTR, fragment)); + break; + case 's': + args.push_back(ArgFragment(STRING, SIZEOF_PTR, fragment)); + break; + case 'n': + args.push_back(ArgFragment(PERCENT_N, SIZEOF_PTR, fragment)); + break; + default: // unsupported format + args.push_back(ArgFragment(UNKNOWN, 0, fragment)); + result |= UNKNOWN_FORMAT; + break; + } + state = START; + } + break; + + default: + break; + } + ++p; + ++fmtPos; + } + + // check if we have a tail plain text string at the end of the format + // and add it to arg list. + // + if (state == PLAINTEXT) { + args.push_back(ArgFragment(TEXT, 0, + fmt.substr(fragmentStart, fmtPos - fragmentStart + 1))); + state = START; + } + + if (state != START) { + result |= INCOMPLETE_FORMAT; + } + + return result; +} + + +fmtscanner::ArgFragment::ArgFragment( + ArgType type, size_t size, const std::string& text) : + _type(type), _size(size), _text(text) +{} + + + +bool msgprintf::format( + const std::string& fmt, + const void * args, uint32_t size, + std::string& result) +{ + std::stringstream sstr; // where the result is build + + // Parse the format string for the number of needed parameters + // + uint32_t parseResult; + if ((parseResult = _scanner.parse(fmt, _args)) != fmtscanner::OK) { + sstr << "invalid format string '" << fmt << "'"; + result = sstr.str(); + return false; + } + + const char * bufPtr((const char *)args); //current byte from arg buffer + const void * eob((const char *)args + size); // end of buffer address + std::vector starArgs; // '*' args like in "%*.*f" + bool success(true); + + // Loop over the argument fragments to format each using local printf + // and then add it to the result string. + // + for (fmtscanner::Args::const_iterator it(_args.begin()); + it != _args.end(); + ++it) + { + size_t need(it->size()); // number of bytes needed for format + fmtscanner::ArgType type(it->type()); + + switch (type) { + case fmtscanner::INTEGER: + case fmtscanner::POINTER: + if (bufPtr + need <= eob) { + if (need == sizeof(uint64_t)) { + uint64_t val(bytes2ValLE(bufPtr)); + success = hostPrintf(sstr, it->text(), val, starArgs); + } else { + uint32_t val(bytes2ValLE(bufPtr)); + success = hostPrintf(sstr, it->text(), val, starArgs); + } + } + break; + + case fmtscanner::DOUBLE: + if (bufPtr + need <= eob) { + double val(bytes2ValLE(bufPtr)); + success = hostPrintf(sstr, it->text(), val, starArgs); + } + break; + + case fmtscanner::TEXT: + // copy text, but "%%" means "%" in printf format + // + for (const char *c = it->text().c_str(); *c; ++c) { + if ('%' == *c && '%' == *(c+1)) continue; + sstr << *c; + } + + break; + + case fmtscanner::STRING: + // String embedded in message buffer + // check if it is valid (zero terminated inside message) and + // then format it into result + // + { + const char * str(bufPtr); + + // Hunt the null byte + // + for (need = 1; str <= eob && *str; ++str, ++need) + ; + + if (str > eob) { + result = " - corrupt printf payload, missing argument string termination"; + return false; + } + + success = hostPrintf(sstr, it->text(), bufPtr, starArgs); + } + break; + case fmtscanner::PERCENT_N: + // %n is a nop . There is no usefull place to return the + // output to. + // + break; + + case fmtscanner::STAR: + // A star argument was seen in fmt, put on the *-stack (can be up to 2) + // + if (bufPtr + need <= eob) { + starArgs.push_back(bytes2ValLE(bufPtr)); + } + break; + + default: + sstr << "- printf internal error, unkown argtype in format '" + << fmt << "'"; + success = false; + } + + // Check for overflow in input buffer + // + if ((bufPtr + need) > eob) { + sstr << "- insufficient argument bytes for format '" + << fmt << "'"; + success = false; + } + + if (!success) { + result = sstr.str(); + return false; + } + + if (type != fmtscanner::STAR) { + starArgs.clear(); + } + bufPtr += need; + } + + result = sstr.str(); + + return true; +} + +MIPI_SYST_NAMESPACE_END \ No newline at end of file diff --git a/printer/test/collateral.xml b/printer/test/collateral.xml new file mode 100644 index 0000000..61cdd6d --- /dev/null +++ b/printer/test/collateral.xml @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/printer/test/diff.cmake b/printer/test/diff.cmake new file mode 100644 index 0000000..dc61a65 --- /dev/null +++ b/printer/test/diff.cmake @@ -0,0 +1,21 @@ +set(ENV{SYST_UNITTESTING} "1") +string(REPLACE "^" ";" OPTIONS ${OPTIONS}) + +execute_process( + COMMAND ${EXECUTABLE} ${OPTIONS} + OUTPUT_FILE ${TEST_OUTPUT} + RESULT_VARIABLE EXIT_CODE +) + +if(EXIT_CODE) + message(FATAL_ERROR "execution of ${EXECUTABLE} ${OPTIONS} failed") +endif(EXIT_CODE) + +execute_process( + COMMAND ${CMAKE_COMMAND} -E compare_files ${TEST_REFERENCE} ${TEST_OUTPUT} + RESULT_VARIABLE DIFF_FAIL +) + +if (DIFF_FAIL) + message(FATAL_ERROR "Reference match failed.") +endif(DIFF_FAIL) \ No newline at end of file diff --git a/printer/test/input_client32.txt b/printer/test/input_client32.txt new file mode 100644 index 0000000..4064b64 --- /dev/null +++ b/printer/test/input_client32.txt @@ -0,0 +1,5142 @@ + in SyS-T platform init hook: "mipi_syst_platform_state_init()" + systh = 013632B8, platform_data = 00000000 + in SyS-T platform handle init hook: systh = 005FBFE8 + +STP Protocol Output: + 0 02801c00 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 00010000 + 8 00000000 + 9 73726576 + 10 206e6f69 + 11 6e6e6162 + 12 73207265 + 13 6e697274 + 14 0067 + 15 1bf821f5 + 16 +SYS-T RAW DATA: 001C8002494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500000001000000000076657273696F6E2062616E6E657220737472696E6700F521F81B + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 32ca5ed8 + 8 00000001 + 9 00000000 + 10 00000000 + 11 a9c581be + 12 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500D85ECA32010000000000000000000000BE81C5A9 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 e4876129 + 8 1fbab93c + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500296187E43CB9BA1F + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 16028e9a + 8 4460167e + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C05009A8E02167E166044 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 c5d41bc9 + 8 36c7c321 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500C91BD4C521C3C736 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 23f66c1e + 8 8089a23e + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C05001E6CF6233EA28980 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 95095f2f + 8 2f125a7f + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C05002F5F09957F5A122F + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 c645d04b + 8 81c94048 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C05004BD045C64840C981 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 54d8b7ff + 8 b372bf1d + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500FFB7D8541DBF72B3 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 d48907f7 + 8 0e71b9ac + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500F70789D4ACB9710E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170f7c0 + 6 00054c09 + 7 9e125f25 + 8 698e2b83 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4C0F77061094C0500255F129E832B8E69 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 e487612a + 8 47189bd5 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05002A6187E4D59B1847 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 cf292f8b + 8 f8fa0a46 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05008B2F29CF460AFAF8 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 886b15e0 + 8 bb24ce1e + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C0500E0156B881ECE24BB + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 f0e43f1b + 8 68676972 + 9 756a2d74 + 10 66697473 + 11 00646569 + 12 8c3c9f00 + 13 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05001B3FE4F072696768742D6A757374696669656400009F3C8C + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 8bb1283d + 8 7466656c + 9 73756a2d + 10 69666974 + 11 6465 + 12 00 + 13 073de214 + 14 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05003D28B18B6C6566742D6A75737469666965640014E23D07 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 237ce64f + 8 98055fa8 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05004FE67C23A85F0598 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 80f4ba3d + 8 24232221 + 9 28272625 + 10 2d2b2a29 + 11 31302f2e + 12 35343332 + 13 39383736 + 14 3d3c3b3a + 15 003e + 16 d391a9a9 + 17 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05003DBAF4802122232425262728292A2B2D2E2F303132333435363738393A3B3C3D3E00A9A991D3 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 80f4ba3e + 8 4241403f + 9 46454443 + 10 4a494847 + 11 4e4d4c4b + 12 5251504f + 13 56555453 + 14 5a595857 + 15 005b + 16 5e5c5f1a + 17 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05003EBAF4803F404142434445464748494A4B4C4D4E4F505152535455565758595A5B001A5F5C5E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 80f4ba3f + 8 5f5e5d5c + 9 63627160 + 10 67666564 + 11 6b6a6968 + 12 6f6e6d6c + 13 73727170 + 14 77767574 + 15 0078 + 16 462d9c85 + 17 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C05003FBAF4805C5D5E5F607162636465666768696A6B6C6D6E6F70717273747576777800859C2D46 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 80f4ba40 + 8 7c7b7a79 + 9 20207e7d + 10 20202020 + 11 20202020 + 12 20202020 + 13 20202020 + 14 20202020 + 15 0020 + 16 80b4d2cd + 17 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C050040BAF480797A7B7C7D7E202020202020202020202020202020202020202020202000CDD2B480 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 e29131c9 + 8 cc752ab7 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C0500C93191E2B72A75CC + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170fba7 + 6 00054c09 + 7 ddc39ddb + 8 00000001 + 9 c3ef3aae + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7FB7061094C0500DB9DC3DD01000000AE3AEFC3 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 ddc39ddc + 8 0000000a + 9 d991e259 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DC9DC3DD0A00000059E291D9 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 ddc39ddd + 8 00000064 + 9 de2fa586 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DD9DC3DD6400000086A52FDE + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 ddc39dde + 8 000003e8 + 9 308379b6 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DE9DC3DDE8030000B6798330 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 ddc39ddf + 8 00002710 + 9 37260b17 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DF9DC3DD10270000170B2637 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 ddc39de0 + 8 000186a0 + 9 b6538c33 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500E09DC3DDA0860100338C53B6 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 789086fd + 8 00000001 + 9 3452738d + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500FD869078010000008D735234 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 789086fe + 8 0000000a + 9 7b701e3b + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500FE8690780A0000003B1E707B + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 789086ff + 8 00000064 + 9 7cce59e4 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500FF86907864000000E459CE7C + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 78908700 + 8 000003e8 + 9 3e301ed0 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C050000879078E8030000D01E303E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 78908701 + 8 00002710 + 9 39956c71 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C05000187907810270000716C9539 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 78908702 + 8 000186a0 + 9 52b001cf + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C050002879078A0860100CF01B052 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 149a8033 + 8 6a9dafe2 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C050033809A14E2AF9D6A + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 f74474db + 8 0000000a + 9 83c89610 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DB7444F70A0000001096C883 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 f74474dc + 8 000000ab + 9 2151e418 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DC7444F7AB00000018E45121 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 f74474dd + 8 00000abc + 9 ef37fc00 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DD7444F7BC0A000000FC37EF + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 f74474de + 8 0000abcd + 9 b3f335a9 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DE7444F7CDAB0000A935F3B3 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6170ff90 + 6 00054c09 + 7 f74474df + 8 000abcde + 9 cf8a9a3f + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E490FF7061094C0500DF7444F7DEBC0A003F9A8ACF + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 f74474e0 + 8 00abcdef + 9 d85ebe52 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500E07444F7EFCDAB0052BE5ED8 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 92115dfd + 8 0000000a + 9 e054b3f7 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500FD5D11920A000000F7B354E0 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 92115dfe + 8 000000ab + 9 63d04392 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500FE5D1192AB0000009243D063 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 92115dff + 8 00000abc + 9 adb65b8a + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500FF5D1192BC0A00008A5BB6AD + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 92115e00 + 8 0000abcd + 9 8d2650b7 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500005E1192CDAB0000B750268D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 92115e01 + 8 000abcde + 9 f15fff21 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500015E1192DEBC0A0021FF5FF1 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 92115e02 + 8 00abcdef + 9 ad3762f3 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500025E1192EFCDAB00F36237AD + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 9b431cdb + 8 0000000a + 9 a4772ad4 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500DB1C439B0A000000D42A77A4 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 9b431cdc + 8 000000ab + 9 06ee58dc + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500DC1C439BAB000000DC58EE06 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 9b431cdd + 8 00000abc + 9 c88840c4 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500DD1C439BBC0A0000C44088C8 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 9b431cde + 8 0000abcd + 9 944c896d + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500DE1C439BCDAB00006D894C94 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 9b431cdf + 8 000abcde + 9 e83526fb + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500DF1C439BDEBC0A00FB2635E8 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 9b431ce0 + 8 00abcdef + 9 5e0d51b3 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500E01C439BEFCDAB00B3510D5E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 361005fd + 8 0000000a + 9 32ea06da + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500FD0510360A000000DA06EA32 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710378 + 6 00054c09 + 7 361005fe + 8 000000ab + 9 b16ef6bf + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E478037161094C0500FE051036AB000000BFF66EB1 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 361005ff + 8 00000abc + 9 89106634 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C0500FF051036BC0A000034661089 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 36100600 + 8 0000abcd + 9 a9806d09 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C050000061036CDAB0000096D80A9 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 36100601 + 8 000abcde + 9 d5f9c29f + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C050001061036DEBC0A009FC2F9D5 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 36100602 + 8 00abcdef + 9 89915f4d + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C050002061036EFCDAB004D5F9189 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 02408d9a + 8 d2a0edf8 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05009A8D4002F8EDA0D2 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 1bfd1b9b + 8 54442eea + 9 400921fb + 10 26fd43c6 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05009B1BFD1BEA2E4454FB210940C643FD26 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 43dfc0db + 8 54442eea + 9 400921fb + 10 0a0413d5 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C0500DBC0DF43EA2E4454FB210940D513040A + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 6bc2661b + 8 54442eea + 9 400921fb + 10 f7b182f5 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05001B66C26BEA2E4454FB210940F582B1F7 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 93a50b5b + 8 54442eea + 9 400921fb + 10 3eff2187 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05005B0BA593EA2E4454FB2109408721FF3E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 bb87b09b + 8 54442eea + 9 400921fb + 10 5d19c567 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05009BB087BBEA2E4454FB21094067C5195D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 e36a55db + 8 54442eea + 9 400921fb + 10 3cce26b7 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C0500DB556AE3EA2E4454FB210940B726CE3C + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 0b4cfb1b + 8 54442eea + 9 400921fb + 10 9711f3f8 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05001BFB4C0BEA2E4454FB210940F8F31197 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710761 + 6 00054c09 + 7 332fa05b + 8 54442eea + 9 400921fb + 10 91397545 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E461077161094C05005BA02F33EA2E4454FB21094045753991 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 5b12459b + 8 54442eea + 9 400921fb + 10 7dc81b50 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05009B45125BEA2E4454FB210940501BC87D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 10b5637d + 8 54442eea + 9 400921fb + 10 ec9adb02 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05007D63B510EA2E4454FB21094002DB9AEC + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 dda393bd + 8 54442eea + 9 400921fb + 10 eb81c138 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500BD93A3DDEA2E4454FB21094038C181EB + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 058638fd + 8 54442eea + 9 400921fb + 10 8f745fb7 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500FD388605EA2E4454FB210940B75F748F + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 2d68de3d + 8 54442eea + 9 400921fb + 10 8d5b65bf + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05003DDE682DEA2E4454FB210940BF655B8D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 554b837d + 8 54442eea + 9 400921fb + 10 1aaec488 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05007D834B55EA2E4454FB21094088C4AE1A + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 7d2e28bd + 8 54442eea + 9 400921fb + 10 62aca70a + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500BD282E7DEA2E4454FB2109400AA7AC62 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 a510cdfd + 8 54442eea + 9 400921fb + 10 37a0b385 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500FDCD10A5EA2E4454FB21094085B3A037 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 ccf3733d + 8 54442eea + 9 400921fb + 10 3c92d894 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05003D73F3CCEA2E4454FB21094094D8923C + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 f4d6187d + 8 54442eea + 9 400921fb + 10 5129d83c + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05007D18D6F4EA2E4454FB2109403CD82951 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 1cb8bdbd + 8 54442eea + 9 400921fb + 10 91635891 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500BDBDB81CEA2E4454FB21094091586391 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 30cef3db + 8 54442eea + 9 400921fb + 10 50886736 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500DBF3CE30EA2E4454FB21094036678850 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 75ff3462 + 8 b927aa6a + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C05006234FF756AAA27B9 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710b4b + 6 00054c09 + 7 811d10db + 8 00000000 + 9 3ff80000 + 10 e25ff081 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E44B0B7161094C0500DB101D81000000000000F83F81F05FE2 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 a8ffb61b + 8 00000000 + 9 40250000 + 10 e5e85f84 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05001BB6FFA80000000000002540845FE8E5 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 d0e25b5b + 8 00000000 + 9 40250000 + 10 16342c45 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05005B5BE2D00000000000002540452C3416 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 f8c5009b + 8 00000000 + 9 40592000 + 10 3fb8b45d + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05009B00C5F800000000002059405DB4B83F + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 20a7a5db + 8 00000000 + 9 408f4400 + 10 26369d19 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C0500DBA5A7200000000000448F40199D3626 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 488a4b1b + 8 00000000 + 9 40c38840 + 10 2b01893a + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05001B4B8A48000000004088C3403A89012B + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 706cf05b + 8 00000000 + 9 40c38840 + 10 90df95ac + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05005BF06C70000000004088C340AC95DF90 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 984f959b + 8 00000000 + 9 40c38840 + 10 5788c040 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05009B954F98000000004088C34040C08857 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 c0323adb + 8 00000000 + 9 40f86a08 + 10 635cfa62 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C0500DB3A32C000000000086AF84062FA5C63 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 75d558bd + 8 00000000 + 9 412e8481 + 10 dd97473b + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C0500BD58D5750000000081842E413B4797DD + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 42c388fd + 8 00000000 + 9 3ff80000 + 10 00958000 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C0500FD88C342000000000000F83F00809500 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 6aa62e3d + 8 00000000 + 9 40250000 + 10 c161dc2f + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05003D2EA66A00000000000025402FDC61C1 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 9288d37d + 8 00000000 + 9 40250000 + 10 0261e1a7 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05007DD388920000000000002540A7E16102 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 ba6b78bd + 8 00000000 + 9 40592000 + 10 3dd290ca + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C0500BD786BBA0000000000205940CA90D23D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 e24e1dfd + 8 00000000 + 9 408f4400 + 10 50b30391 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C0500FD1D4EE20000000000448F409103B350 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61710f33 + 6 00054c09 + 7 0a30c33d + 8 00000000 + 9 40c38840 + 10 f5f14c72 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4330F7161094C05003DC3300A000000004088C340724CF1F5 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 3213687d + 8 00000000 + 9 40c38840 + 10 f5ea072d + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05007D681332000000004088C3402D07EAF5 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 59f60dbd + 8 00000000 + 9 40c38840 + 10 7a477189 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C0500BD0DF659000000004088C3408971477A + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 81d8b2fd + 8 00000000 + 9 40f86a08 + 10 5dc76ab9 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C0500FDB2D88100000000086AF840B96AC75D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 95eee91b + 8 00000000 + 9 412e8481 + 10 4e0ec5dc + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05001BE9EE950000000081842E41DCC50E4E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 66ad3a7f + 8 176c54b2 + 9 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05007F3AAD66B2546C17 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 4e9894fd + 8 000000ff + 9 9e18d548 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C0500FD94984EFF00000048D5189E + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 1870c29b + 8 ffffffff + 9 e906b61d + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05009BC27018FFFFFFFF1DB606E9 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 b7fb579b + 8 ffffffff + 9 1d79aa9b + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05009B57FBB7FFFFFFFF9BAA791D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 c63dd4fd + 8 ffffffff + 9 ffffffff + 10 b4b7b8b5 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C0500FDD43DC6FFFFFFFFFFFFFFFFB5B8B7B4 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 ad58547d + 8 000000ff + 9 3da41cce + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05007D5458ADFF000000CE1CA43D + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 7730821b + 8 ffffffff + 9 e85ca6c4 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05001B823077FFFFFFFFC4A65CE8 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 16bb171b + 8 ffffffff + 9 10d06fc9 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05001B17BB16FFFFFFFFC96FD010 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 24fd947d + 8 ffffffff + 9 ffffffff + 10 396be477 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05007D94FD24FFFFFFFFFFFFFFFF77E46B39 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171131c + 6 00054c09 + 7 1f38b53d + 8 000000ff + 9 fcdfe2e1 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E41C137161094C05003DB5381FFF000000E1E2DFFC + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 e910e2db + 8 ffffffff + 9 46dd3fbd + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C0500DBE210E9FFFFFFFFBD3FDD46 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 889b77db + 8 ffffffff + 9 be51f6b0 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C0500DB779B88FFFFFFFFB0F651BE + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 96ddf53d + 8 ffffffff + 9 ffffffff + 10 d5de3946 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05003DF5DD96FFFFFFFFFFFFFFFF4639DED5 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 3ff8653d + 8 000000ff + 9 10e1c030 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05003D65F83FFF00000030C0E110 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 60d8e25b + 8 ffffffff + 9 9302ec9a + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05005BE2D860FFFFFFFF9AEC0293 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 2c427ef9 + 8 ffffffff + 9 cf7ec942 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C0500F97E422CFFFFFFFF42C97ECF + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 e3d00a1b + 8 ffffffff + 9 ffffffff + 10 be7a76a7 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05001B0AD0E3FFFFFFFFFFFFFFFFA7767ABE + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 caea899b + 8 000000ff + 9 cd67d3c8 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05009B89EACAFF000000C8D367CD + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 fb29257d + 8 ffffffff + 9 6b4be65a + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05007D2529FBFFFFFFFF5AE64B6B + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 9ab3ba7d + 8 ffffffff + 9 22d0d0b3 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05007DBAB39AFFFFFFFFB3D0D022 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 428fc99b + 8 ffffffff + 9 ffffffff + 10 6ae3ae76 + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05009BC98F42FFFFFFFFFFFFFFFF76AEE36A + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 3ccaea5b + 8 000000ff + 9 c4656312 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05005BEACA3CFF000000126365C4 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 6d09863d + 8 ffffffff + 9 f5681693 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05003D86096DFFFFFFFF931668F5 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 0c941b3d + 8 ffffffff + 9 eabc8547 + 10 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05003D1B940CFFFFFFFF4785BCEA + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 b4702a5b + 8 ffffffff + 9 ffffffff + 10 66cdb99c + 11 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E405177161094C05005B2A70B4FFFFFFFFFFFFFFFF9CB9CD66 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 2d2d2d2d + 16 2d2d2d2d + 17 2d2d2d2d + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 83c07719 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E405177161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C001977C083 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711705 + 6 00054c09 + 7 2020207c + 8 69727020 + 9 2066746e + 10 6d726f46 + 11 20207461 + 12 20207c20 + 13 20202020 + 14 70202020 + 15 746e6972 + 16 65522066 + 17 746c7573 + 18 20202020 + 19 20202020 + 20 20202020 + 21 007c + 22 ed6b43d6 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E405177161094C05007C202020207072696E746620466F726D61742020207C2020202020202020207072696E746620526573756C742020202020202020202020207C00D6436BED + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 74732d2d + 16 676e6972 + 17 2d2d2d73 + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 1650bb63 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D737472696E67732D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C0063BB5016 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2527207c + 8 73303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202773 + 15 67697200 + 16 6a2d7468 + 17 69747375 + 18 64656966 + 19 00 + 20 a4bded67 + 21 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2027252533307327202020202020202020202020207C20272533307327207C0072696768742D6A75737469666965640067EDBDA4 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202773 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277330 + 15 656c007c + 16 6a2d7466 + 17 69747375 + 18 64656966 + 19 00 + 20 5e60d015 + 21 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C202725252D333073272020202020202020202020207C2027252D33307327207C006C6566742D6A75737469666965640015D0605E + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 53412d2d + 16 2d494943 + 17 2d2d2d2d + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 c782e186 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D41534349492D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C0086E182C7 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2527207c + 8 20277325 + 9 20202020 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 27732527 + 14 007c2020 + 15 24232221 + 16 28272625 + 17 2d2b2a29 + 18 31302f2e + 19 35343332 + 20 39383736 + 21 3d3c3b3a + 22 003e + 23 054ee828 + 24 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2027252573272020202020202020202020202020207C202725732720207C002122232425262728292A2B2D2E2F303132333435363738393A3B3C3D3E0028E84E05 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2527207c + 8 20277325 + 9 20202020 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 27732527 + 14 007c2020 + 15 4241403f + 16 46454443 + 17 4a494847 + 18 4e4d4c4b + 19 5251504f + 20 56555453 + 21 5a595857 + 22 005b + 23 0b9e82e8 + 24 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2027252573272020202020202020202020202020207C202725732720207C003F404142434445464748494A4B4C4D4E4F505152535455565758595A5B00E8829E0B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2527207c + 8 20277325 + 9 20202020 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 27732527 + 14 007c2020 + 15 5f5e5d5c + 16 63627160 + 17 67666564 + 18 6b6a6968 + 19 6f6e6d6c + 20 73727170 + 21 77767574 + 22 0078 + 23 6d1bcaa6 + 24 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2027252573272020202020202020202020202020207C202725732720207C005C5D5E5F607162636465666768696A6B6C6D6E6F70717273747576777800A6CA1B6D + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2527207c + 8 20277325 + 9 20202020 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 27732527 + 14 007c2020 + 15 7c7b7a79 + 16 20207e7d + 17 20202020 + 18 20202020 + 19 20202020 + 20 20202020 + 21 20202020 + 22 0020 + 23 e4889804 + 24 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2027252573272020202020202020202020202020207C202725732720207C00797A7B7C7D7E202020202020202020202020202020202020202020202000049888E4 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711aed + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 65642d2d + 16 616d6963 + 17 2d2d736c + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 07de865b + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED1A7161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D646563696D616C732D2D2D2D2D2D2D2D2D2D2D2D2D2D7C005B86DE07 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 64303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202764 + 15 00000100 + 16 00 + 17 f21840be + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C2027252533306427202020202020202020202020207C20272533306427207C0001000000BE4018F2 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 64303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202764 + 15 00000a00 + 16 00 + 17 667eaa61 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C2027252533306427202020202020202020202020207C20272533306427207C000A00000061AA7E66 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 64303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202764 + 15 00006400 + 16 00 + 17 28fc9099 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C2027252533306427202020202020202020202020207C20272533306427207C00640000009990FC28 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 64303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202764 + 15 0003e800 + 16 00 + 17 1d14cbc0 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C2027252533306427202020202020202020202020207C20272533306427207C00E8030000C0CB141D + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 64303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202764 + 15 00271000 + 16 00 + 17 538dc446 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C2027252533306427202020202020202020202020207C20272533306427207C001027000046C48D53 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 64303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202764 + 15 0186a000 + 16 00 + 17 e3ec2e91 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C2027252533306427202020202020202020202020207C20272533306427207C00A0860100912EECE3 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202764 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20276430 + 15 0001007c + 16 0000 + 17 5a29fc06 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C000100000006FC295A + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202764 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20276430 + 15 000a007c + 16 0000 + 17 ce4f16d9 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C000A000000D9164FCE + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202764 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20276430 + 15 0064007c + 16 0000 + 17 80cd2c21 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C0064000000212CCD80 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61711ed6 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202764 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20276430 + 15 03e8007c + 16 0000 + 17 b5257778 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4D61E7161094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C00E8030000787725B5 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202764 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20276430 + 15 2710007c + 16 0000 + 17 180fce5f + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C00102700005FCE0F18 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202764 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20276430 + 15 86a0007c + 16 0001 + 17 a86e2488 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C00A086010088246EA8 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 682d2d2d + 16 64617865 + 17 6d696365 + 18 2d736c61 + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 f7fb0aa2 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D68657861646563696D616C732D2D2D2D2D2D2D2D2D7C00A20AFBF7 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 78303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202778 + 15 00000a00 + 16 00 + 17 53b8d8f7 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2027252533307827202020202020202020202020207C20272533307827207C000A000000F7D8B853 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 78303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202778 + 15 0000ab00 + 16 00 + 17 0b78affb + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2027252533307827202020202020202020202020207C20272533307827207C00AB000000FBAF780B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 78303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202778 + 15 000abc00 + 16 00 + 17 8c22cac4 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2027252533307827202020202020202020202020207C20272533307827207C00BC0A0000C4CA228C + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 78303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202778 + 15 00abcd00 + 16 00 + 17 0ba28404 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2027252533307827202020202020202020202020207C20272533307827207C00CDAB00000484A20B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 78303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202778 + 15 0abcde00 + 16 00 + 17 3ee756b5 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2027252533307827202020202020202020202020207C20272533307827207C00DEBC0A00B556E73E + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 78303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202778 + 15 abcdef00 + 16 00 + 17 b9cb4c0e + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C2027252533307827202020202020202020202020207C20272533307827207C00EFCDAB000E4CCBB9 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202778 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277830 + 15 000a007c + 16 0000 + 17 9b24690e + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C000A0000000E69249B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617122bf + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202778 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277830 + 15 00ab007c + 16 0000 + 17 c3e41e02 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4BF227161094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00AB000000021EE4C3 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202778 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277830 + 15 0abc007c + 16 0000 + 17 e6feb8be + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00BC0A0000BEB8FEE6 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202778 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277830 + 15 abcd007c + 16 0000 + 17 617ef67e + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00CDAB00007EF67E61 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202778 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277830 + 15 bcde007c + 16 000a + 17 543b24cf + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00DEBC0A00CF243B54 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202778 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20277830 + 15 cdef007c + 16 00ab + 17 d3173e74 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00EFCDAB00743E17D3 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 58303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202758 + 15 00000a00 + 16 00 + 17 0e69162b + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C2027252533305827202020202020202020202020207C20272533305827207C000A0000002B16690E + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 58303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202758 + 15 0000ab00 + 16 00 + 17 56a96127 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C2027252533305827202020202020202020202020207C20272533305827207C00AB0000002761A956 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 58303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202758 + 15 000abc00 + 16 00 + 17 d1f30418 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C2027252533305827202020202020202020202020207C20272533305827207C00BC0A00001804F3D1 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 58303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202758 + 15 00abcd00 + 16 00 + 17 56734ad8 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C2027252533305827202020202020202020202020207C20272533305827207C00CDAB0000D84A7356 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 58303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202758 + 15 0abcde00 + 16 00 + 17 63369869 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C2027252533305827202020202020202020202020207C20272533305827207C00DEBC0A0069983663 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 58303325 + 9 20202027 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 7c202758 + 15 abcdef00 + 16 00 + 17 e41a82d2 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C2027252533305827202020202020202020202020207C20272533305827207C00EFCDAB00D2821AE4 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617126a7 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202758 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20275830 + 15 000a007c + 16 0000 + 17 6fc341f1 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4A7267161094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C000A000000F141C36F + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202758 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20275830 + 15 00ab007c + 16 0000 + 17 0c5f7044 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00AB00000044705F0C + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202758 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20275830 + 15 0abc007c + 16 0000 + 17 8b05157b + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00BC0A00007B15058B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202758 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20275830 + 15 abcd007c + 16 0000 + 17 0c855bbb + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00CDAB0000BB5B850C + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202758 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20275830 + 15 bcde007c + 16 000a + 17 39c0890a + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00DEBC0A000A89C039 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20202758 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 20275830 + 15 cdef007c + 16 00ab + 17 beec93b1 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00EFCDAB00B193ECBE + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 2d2d2d2d + 16 62756f64 + 17 2d2d656c + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 b612b359 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D646F75626C652D2D2D2D2D2D2D2D2D2D2D2D2D2D7C0059B312B6 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276631 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766312e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 a68ec7f6 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C2027252533302E31662720202020202020202020207C20272533302E316627207C00EA2E4454FB210940F6C78EA6 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276632 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766322e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 38cc8259 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C2027252533302E32662720202020202020202020207C20272533302E326627207C00EA2E4454FB2109405982CC38 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276633 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766332e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 4d0d413c + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C2027252533302E33662720202020202020202020207C20272533302E336627207C00EA2E4454FB2109403C410D4D + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276634 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766342e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 01a47ff6 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C2027252533302E34662720202020202020202020207C20272533302E346627207C00EA2E4454FB210940F67FA401 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712a90 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276635 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766352e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 7465bc93 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4902A7161094C05007C2027252533302E35662720202020202020202020207C20272533302E356627207C00EA2E4454FB21094093BC6574 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276636 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766362e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 18c369af + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C2027252533302E36662720202020202020202020207C20272533302E366627207C00EA2E4454FB210940AF69C318 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276637 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766372e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 6d02aaca + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C2027252533302E37662720202020202020202020207C20272533302E376627207C00EA2E4454FB210940CAAA026D + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276638 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766382e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 8191143b + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C2027252533302E38662720202020202020202020207C20272533302E386627207C00EA2E4454FB2109403B149181 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276639 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2766392e + 15 ea007c20 + 16 fb54442e + 17 0921 + 18 40 + 19 f450d75e + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C2027252533302E39662720202020202020202020207C20272533302E396627207C00EA2E4454FB2109405ED750F4 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 27663031 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 6630312e + 15 007c2027 + 16 54442eea + 17 400921fb + 18 82814dab + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C2027252533302E31306627202020202020202020207C20272533302E31306627207C00EA2E4454FB210940AB4D8182 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766312e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66312e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 7c48229f + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C202725252D33302E316627202020202020202020207C2027252D33302E316627207C00EA2E4454FB2109409F22487C + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766322e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66322e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 e20a6730 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C202725252D33302E326627202020202020202020207C2027252D33302E326627207C00EA2E4454FB21094030670AE2 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766332e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66332e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 97cba455 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C202725252D33302E336627202020202020202020207C2027252D33302E336627207C00EA2E4454FB21094055A4CB97 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766342e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66342e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 db629a9f + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C202725252D33302E346627202020202020202020207C2027252D33302E346627207C00EA2E4454FB2109409F9A62DB + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61712e78 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766352e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66352e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 aea359fa + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4782E7161094C05007C202725252D33302E356627202020202020202020207C2027252D33302E356627207C00EA2E4454FB210940FA59A3AE + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766362e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66362e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 734b8bfa + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C202725252D33302E366627202020202020202020207C2027252D33302E366627207C00EA2E4454FB210940FA8B4B73 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766372e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66372e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 068a489f + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C202725252D33302E376627202020202020202020207C2027252D33302E376627207C00EA2E4454FB2109409F488A06 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766382e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66382e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 ea19f66e + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C202725252D33302E386627202020202020202020207C2027252D33302E386627207C00EA2E4454FB2109406EF619EA + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2766392e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 66392e30 + 15 007c2027 + 16 54442eea + 17 400921fb + 18 9fd8350b + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C202725252D33302E396627202020202020202020207C2027252D33302E396627207C00EA2E4454FB2109400B35D89F + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 6630312e + 10 20202027 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 30312e30 + 15 7c202766 + 16 442eea00 + 17 0921fb54 + 18 40 + 19 e63e0b86 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C202725252D33302E313066272020202020202020207C2027252D33302E31306627207C00EA2E4454FB210940860B3EE6 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 2d2d2d2d + 16 65696373 + 17 6669746e + 18 2d2d6369 + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 ec391c9f + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D736369656E74696669632D2D2D2D2D2D2D2D2D2D7C009F1C39EC + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276531 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765312e + 15 00007c20 + 16 00000000 + 17 f800 + 18 3f + 19 22d1ee45 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C2027252533302E31652720202020202020202020207C20272533302E316527207C00000000000000F83F45EED122 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276532 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765322e + 15 00007c20 + 16 00000000 + 17 2500 + 18 40 + 19 683534ac + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C2027252533302E32652720202020202020202020207C20272533302E326527207C000000000000002540AC343568 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276533 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765332e + 15 00007c20 + 16 00000000 + 17 2500 + 18 40 + 19 1df4f7c9 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C2027252533302E33652720202020202020202020207C20272533302E336527207C000000000000002540C9F7F41D + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276534 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765342e + 15 00007c20 + 16 00000000 + 17 5920 + 18 40 + 19 dcde44f4 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C2027252533302E34652720202020202020202020207C20272533302E346527207C000000000000205940F444DEDC + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713261 + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276535 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765352e + 15 00007c20 + 16 00000000 + 17 8f44 + 18 40 + 19 433ec408 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E461327161094C05007C2027252533302E35652720202020202020202020207C20272533302E356527207C000000000000448F4008C43E43 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276536 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765362e + 15 00007c20 + 16 40000000 + 17 c388 + 18 40 + 19 820e680e + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C2027252533302E36652720202020202020202020207C20272533302E366527207C00000000004088C3400E680E82 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276537 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765372e + 15 00007c20 + 16 40000000 + 17 c388 + 18 40 + 19 f7cfab6b + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C2027252533302E37652720202020202020202020207C20272533302E376527207C00000000004088C3406BABCFF7 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276538 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765382e + 15 00007c20 + 16 40000000 + 17 c388 + 18 40 + 19 1b5c159a + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C2027252533302E38652720202020202020202020207C20272533302E386527207C00000000004088C3409A155C1B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 20276539 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 2765392e + 15 00007c20 + 16 08000000 + 17 f86a + 18 40 + 19 38abcddf + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C2027252533302E39652720202020202020202020207C20272533302E396527207C0000000000086AF840DFCDAB38 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 2e303325 + 9 27653031 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 30332527 + 14 6530312e + 15 007c2027 + 16 00000000 + 17 412e8481 + 18 809df2da + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C2027252533302E31306527202020202020202020207C20272533302E31306527207C000000000081842E41DAF29D80 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765312e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65312e30 + 15 007c2027 + 16 00000000 + 17 3ff80000 + 18 6b765a54 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C202725252D33302E316527202020202020202020207C2027252D33302E316527207C00000000000000F83F545A766B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765322e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65322e30 + 15 007c2027 + 16 00000000 + 17 40250000 + 18 219280bd + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C202725252D33302E326527202020202020202020207C2027252D33302E326527207C000000000000002540BD809221 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765332e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65332e30 + 15 007c2027 + 16 00000000 + 17 40250000 + 18 545343d8 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C202725252D33302E336527202020202020202020207C2027252D33302E336527207C000000000000002540D8435354 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765342e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65342e30 + 15 007c2027 + 16 00000000 + 17 40592000 + 18 9579f0e5 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C202725252D33302E346527202020202020202020207C2027252D33302E346527207C000000000000205940E5F07995 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 6171364a + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765352e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65352e30 + 15 007c2027 + 16 00000000 + 17 408f4400 + 18 0a997019 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E44A367161094C05007C202725252D33302E356527202020202020202020207C2027252D33302E356527207C000000000000448F401970990A + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765362e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65362e30 + 15 007c2027 + 16 00000000 + 17 40c38840 + 18 6e30d3e5 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C202725252D33302E366527202020202020202020207C2027252D33302E366527207C00000000004088C340E5D3306E + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765372e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65372e30 + 15 007c2027 + 16 00000000 + 17 40c38840 + 18 1bf11080 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C202725252D33302E376527202020202020202020207C2027252D33302E376527207C00000000004088C3408010F11B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765382e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65382e30 + 15 007c2027 + 16 00000000 + 17 40c38840 + 18 f762ae71 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C202725252D33302E386527202020202020202020207C2027252D33302E386527207C00000000004088C34071AE62F7 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 2765392e + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 65392e30 + 15 007c2027 + 16 00000000 + 17 40f86a08 + 18 d4957634 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C202725252D33302E396527202020202020202020207C2027252D33302E396527207C0000000000086AF840347695D4 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 6530312e + 10 20202027 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 30312e30 + 15 7c202765 + 16 00000000 + 17 2e848100 + 18 41 + 19 fac8cf40 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C202725252D33302E313065272020202020202020207C2027252D33302E31306527207C000000000081842E4140CFC8FA + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 2d2d2d2d + 16 746f7865 + 17 2d736369 + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 6f4003f0 + 23 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D65786F746963732D2D2D2D2D2D2D2D2D2D2D2D2D7C00F003406F + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30333025 + 9 27756868 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 75686830 + 15 007c2027 + 16 000000ff + 17 07d74cc1 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C2027252530333068687527202020202020202020207C20272530333068687527207C00FF000000C14CD707 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30333025 + 9 20277568 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 27756830 + 15 ff007c20 + 16 ffff + 17 ff + 18 8b857322 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C2027252530333068752720202020202020202020207C202725303330687527207C00FFFFFFFF2273858B + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713a33 + 6 00054c09 + 7 2527207c + 8 30333025 + 9 2027756c + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 27756c30 + 15 ff007c20 + 16 ffff + 17 ff + 18 4f99f260 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4333A7161094C05007C202725253033306C752720202020202020202020207C2027253033306C7527207C00FFFFFFFF60F2994F + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 27756c6c + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 756c6c30 + 15 007c2027 + 16 ffffffff + 17 ffffffff + 18 a7324457 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C202725253033306C6C7527202020202020202020207C2027253033306C6C7527207C00FFFFFFFFFFFFFFFF574432A7 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 276f6868 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 6f686830 + 15 007c2027 + 16 000000ff + 17 f886f0fd + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C2027252530333068686F27202020202020202020207C20272530333068686F27207C00FF000000FDF086F8 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 20276f68 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 276f6830 + 15 ff007c20 + 16 ffff + 17 ff + 18 26f64ae7 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C20272525303330686F2720202020202020202020207C202725303330686F27207C00FFFFFFFFE74AF626 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 20276f6c + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 276f6c30 + 15 ff007c20 + 16 ffff + 17 ff + 18 e2eacba5 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C202725253033306C6F2720202020202020202020207C2027253033306C6F27207C00FFFFFFFFA5CBEAE2 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 276f6c6c + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 6f6c6c30 + 15 007c2027 + 16 ffffffff + 17 ffffffff + 18 b448b3f9 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C202725253033306C6C6F27202020202020202020207C2027253033306C6C6F27207C00FFFFFFFFFFFFFFFFF9B348B4 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 27786868 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 78686830 + 15 007c2027 + 16 000000ff + 17 7c950c66 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C2027252530333068687827202020202020202020207C20272530333068687827207C00FF000000660C957C + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 20277868 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 27786830 + 15 ff007c20 + 16 ffff + 17 ff + 18 a2e5b67c + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C2027252530333068782720202020202020202020207C202725303330687827207C00FFFFFFFF7CB6E5A2 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 2027786c + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 27786c30 + 15 ff007c20 + 16 ffff + 17 ff + 18 66f9373e + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C202725253033306C782720202020202020202020207C2027253033306C7827207C00FFFFFFFF3E37F966 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61713e1c + 6 00054c09 + 7 2527207c + 8 30333025 + 9 27786c6c + 10 20202020 + 11 20202020 + 12 207c2020 + 13 33302527 + 14 786c6c30 + 15 007c2027 + 16 ffffffff + 17 ffffffff + 18 ae8f3f80 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E41C3E7161094C05007C202725253033306C6C7827202020202020202020207C2027253033306C6C7827207C00FFFFFFFFFFFFFFFF803F8FAE + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 27756868 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 75686830 + 15 007c2027 + 16 000000ff + 17 903fbcbf + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C202725252D333068687527202020202020202020207C2027252D333068687527207C00FF000000BFBC3F90 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 30332d25 + 9 20277568 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 332d2527 + 14 27756830 + 15 ff007c20 + 16 ffff + 17 ff + 18 d9d4b787 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C202725252D333068752720202020202020202020207C2027252D3330687527207C00FFFFFFFF87B7D4D9 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 27756c30 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 756c3033 + 15 007c2027 + 16 ffffffff + 17 20eeabd8 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D33306C7527202020202020202020207C202725232D33306C7527207C00FFFFFFFFD8ABEE20 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 756c6c30 + 10 20202027 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 6c6c3033 + 15 7c202775 + 16 ffffff00 + 17 ffffffff + 18 ff + 19 d636b3e3 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D33306C6C75272020202020202020207C202725232D33306C6C7527207C00FFFFFFFFFFFFFFFFE3B336D6 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 6f686830 + 10 20202027 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 68683033 + 15 7c20276f + 16 0000ff00 + 17 00 + 18 c769468c + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D333068686F272020202020202020207C202725232D333068686F27207C00FF0000008C4669C7 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 276f6830 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 6f683033 + 15 007c2027 + 16 ffffffff + 17 1cef7d88 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D3330686F27202020202020202020207C202725232D3330686F27207C00FFFFFFFF887DEF1C + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 276f6c30 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 6f6c3033 + 15 007c2027 + 16 ffffffff + 17 d8f3fcca + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D33306C6F27202020202020202020207C202725232D33306C6F27207C00FFFFFFFFCAFCF3D8 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 6f6c6c30 + 10 20202027 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 6c6c3033 + 15 7c20276f + 16 ffffff00 + 17 ffffffff + 18 ff + 19 c54c444d + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D33306C6C6F272020202020202020207C202725232D33306C6C6F27207C00FFFFFFFFFFFFFFFF4D444CC5 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714204 + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 78686830 + 10 20202027 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 68683033 + 15 7c202778 + 16 0000ff00 + 17 00 + 18 437aba17 + 19 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E404427161094C05007C20272525232D3330686878272020202020202020207C202725232D333068687827207C00FF00000017BA7A43 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 27786830 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 78683033 + 15 007c2027 + 16 ffffffff + 17 32182fb8 + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED457161094C05007C20272525232D3330687827202020202020202020207C202725232D3330687827207C00FFFFFFFFB82F1832 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 27786c30 + 10 20202020 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 786c3033 + 15 007c2027 + 16 ffffffff + 17 f604aefa + 18 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED457161094C05007C20272525232D33306C7827202020202020202020207C202725232D33306C7827207C00FFFFFFFFFAAE04F6 + +STP Protocol Output: + 0 0b801c42 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 2527207c + 8 332d2325 + 9 786c6c30 + 10 20202027 + 11 20202020 + 12 207c2020 + 13 2d232527 + 14 6c6c3033 + 15 7c202778 + 16 ffffff00 + 17 ffffffff + 18 ff + 19 9d90fd43 + 20 +SYS-T RAW DATA: 421C800B494E54438A9C4014A65A2F36A36D96E4ED457161094C05007C20272525232D33306C6C78272020202020202020207C202725232D33306C6C7827207C00FFFFFFFFFFFFFFFF43FD909D + +STP Protocol Output: + 0 0b801c72 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 2d2d2d2d + 16 2d2d2d2d + 17 2d2d2d2d + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 0243d30a + 23 +SYS-T RAW DATA: 721C800B494E54438A9C4014A65A2F36A36D96E4ED457161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C000AD34302 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 0000000e + 9 00000e00 + 10 0000 + 11 527a0480 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD40E000000000E0000000080047A52 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 0000000c + 9 00001000 + 10 0000 + 11 1b188e91 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD40C000000001000000000918E181B + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 00000009 + 9 00001300 + 10 0000 + 11 bb103047 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD409000000001300000000473010BB + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 00000006 + 9 00001600 + 10 0000 + 11 5ee585cc + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD406000000001600000000CC85E55E + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 00000004 + 9 00001800 + 10 0000 + 11 98a56e0e + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD4040000000018000000000E6EA598 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 00000002 + 9 00001a00 + 10 0000 + 11 58aa456a + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD402000000001A000000006A45AA58 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617145ed + 6 00054c09 + 7 d44fd581 + 8 00000001 + 9 00001b00 + 10 0000 + 11 38add0d8 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4ED457161094C050081D54FD401000000001B00000000D8D0AD38 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000001 + 9 00001b00 + 10 0000 + 11 1b77dff4 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD401000000001B00000000F4DF771B + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000001 + 9 00001b00 + 10 0000 + 11 1b77dff4 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD401000000001B00000000F4DF771B + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000001 + 9 00001b00 + 10 0000 + 11 1b77dff4 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD401000000001B00000000F4DF771B + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000002 + 9 00001a00 + 10 0000 + 11 7b704a46 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD402000000001A00000000464A707B + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000004 + 9 00001800 + 10 0000 + 11 bb7f6122 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD40400000000180000000022617FBB + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000006 + 9 00001600 + 10 0000 + 11 7d3f8ae0 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD406000000001600000000E08A3F7D + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000009 + 9 00001300 + 10 0000 + 11 98ca3f6b + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD4090000000013000000006B3FCA98 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 0000000c + 9 00001000 + 10 0000 + 11 38c281bd + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD40C000000001000000000BD81C238 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 0000000e + 9 00000e00 + 10 0000 + 11 71a00bac + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD40E000000000E00000000AC0BA071 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000010 + 9 00000c00 + 10 0000 + 11 7ac01dda + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD410000000000C00000000DA1DC07A + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000013 + 9 00000900 + 10 0000 + 11 fa8236d8 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD413000000000900000000D83682FA + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617149d6 + 6 00054c09 + 7 d44fd581 + 8 00000016 + 9 00000600 + 10 0000 + 11 7fa83d2f + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4D6497161094C050081D54FD4160000000006000000002F3DA87F + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 00000018 + 9 00000400 + 10 0000 + 11 a67c91ec + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD418000000000400000000EC917CA6 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 0000001a + 9 00000200 + 10 0000 + 11 a55b71bf + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD41A000000000200000000BF715BA5 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 0000001b + 9 00000100 + 10 0000 + 11 263ebaee + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD41B000000000100000000EEBA3E26 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 0000001b + 9 00000100 + 10 0000 + 11 263ebaee + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD41B000000000100000000EEBA3E26 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 0000001b + 9 00000100 + 10 0000 + 11 263ebaee + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD41B000000000100000000EEBA3E26 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 0000001b + 9 00000100 + 10 0000 + 11 263ebaee + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD41B000000000100000000EEBA3E26 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 0000001a + 9 00000200 + 10 0000 + 11 a55b71bf + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD41A000000000200000000BF715BA5 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 00000018 + 9 00000400 + 10 0000 + 11 a67c91ec + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD418000000000400000000EC917CA6 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 00000016 + 9 00000600 + 10 0000 + 11 20a95186 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD4160000000006000000008651A920 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 00000013 + 9 00000900 + 10 0000 + 11 a5835a71 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD413000000000900000000715A83A5 + +STP Protocol Output: + 0 01801c73 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 61714dc4 + 6 00054c09 + 7 d44fd581 + 8 00000010 + 9 00000c00 + 10 0000 + 11 25c17173 + 12 +SYS-T RAW DATA: 731C8001494E54438A9C4014A65A2F36A36D96E4C44D7161094C050081D54FD410000000000C000000007371C125 + +STP Protocol Output: + 0 0b801c72 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617151a7 + 6 00054c09 + 7 2d2d2d7c + 8 2d2d2d2d + 9 2d2d2d2d + 10 2d2d2d2d + 11 2d2d2d2d + 12 2d2d2d2d + 13 2d2d2d2d + 14 2d2d2d2d + 15 2d2d2d2d + 16 2d2d2d2d + 17 2d2d2d2d + 18 2d2d2d2d + 19 2d2d2d2d + 20 2d2d2d2d + 21 007c + 22 634285a8 + 23 +SYS-T RAW DATA: 721C800B494E54438A9C4014A65A2F36A36D96E4A7517161094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C00A8854263 + +STP Protocol Output: + 0 01801c06 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617151a7 + 6 00054c09 + 7 03020100 + 8 07060504 + 9 0908 + 10 cc309a26 + 11 +SYS-T RAW DATA: 061C8001494E54438A9C4014A65A2F36A36D96E4A7517161094C050000010203040506070809269A30CC + +STP Protocol Output: + 0 12345671 +SYS-T RAW DATA: 71563412 + +STP Protocol Output: + 0 1122334455667787 +SYS-T RAW DATA: 8777665544332211 + +STP Protocol Output: + 0 e0000011 +SYS-T RAW DATA: 110000E0 + +STP Protocol Output: + 0 e0000021 +SYS-T RAW DATA: 210000E0 + +STP Protocol Output: + 0 f0000011 +SYS-T RAW DATA: 110000F0 + +STP Protocol Output: + 0 f0000021 +SYS-T RAW DATA: 210000F0 + +STP Protocol Output: + 0 02801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617151a7 + 6 00054c09 + 7 55667788 + 8 11223344 + 9 ad66a069 + 10 +SYS-T RAW DATA: 431C8002494E54438A9C4014A65A2F36A36D96E4A7517161094C0500887766554433221169A066AD + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617151a7 + 6 00054c09 + 7 00000002 + 8 74617473 + 9 000a0065 + 10 0000 + 11 a0911a8d + 12 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7517161094C0500020000007374617465000A0000008D1A91A0 + +STP Protocol Output: + 0 01801c43 + 1 43544e49 + 2 14409c8a + 3 362f5aa6 + 4 e4966da3 + 5 617151a7 + 6 00054c09 + 7 e054cf5c + 8 74617473 + 9 000a0065 + 10 0000 + 11 7bd72a8e + 12 +SYS-T RAW DATA: 431C8001494E54438A9C4014A65A2F36A36D96E4A7517161094C05005CCF54E07374617465000A0000008E2AD77B + + in SyS-T platform handle release hook:systh = 005FBFE8 \ No newline at end of file diff --git a/printer/test/input_client64.txt b/printer/test/input_client64.txt new file mode 100644 index 0000000..2a32038 --- /dev/null +++ b/printer/test/input_client64.txt @@ -0,0 +1,3588 @@ + in SyS-T platform init hook: "mipi_syst_platform_state_init()" + systh = 00007FF724389730, platform_data = 0000000000000000 + in SyS-T platform handle init hook: systh = 000000E3C08BF840 + +STP Protocol Output: + 0 02801c00 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 0000000000010000 + 5 206e6f6973726576 + 6 732072656e6e6162 + 7 6e697274 + 8 0067 + 9 7875c94c + 10 +SYS-T RAW DATA: 001C8002494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500000001000000000076657273696F6E2062616E6E657220737472696E67004CC97578 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 32ca5ed8 + 5 0000000000000001 + 6 00000000 + 7 a4d91b12 + 8 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500D85ECA32010000000000000000000000121BD9A4 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 e4876129 + 5 2d722a0f + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500296187E40F2A722D + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 16028e9a + 5 76a8854d + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C05009A8E02164D85A876 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 c5d41bc9 + 5 040f5012 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500C91BD4C512500F04 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 23f66c1e + 5 b241310d + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C05001E6CF6230D3141B2 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 95095f2f + 5 1ddac94c + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C05002F5F09954CC9DA1D + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 c645d04b + 5 b301d37b + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C05004BD045C67BD301B3 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 54d8b7ff + 5 81ba2c2e + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500FFB7D8542E2CBA81 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 d48907f7 + 5 3cb92a9f + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500F70789D49F2AB93C + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 9e125f25 + 5 5b46b8b0 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C0500255F129EB0B8465B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 e487612a + 5 4f50a336 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C05002A6187E436A3504F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d590 + 4 cf292f8b + 5 f0b232a5 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E490D5F95D094C05008B2F29CFA532B2F0 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 886b15e0 + 5 58956654 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500E0156B8854669558 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 68676972f0e43f1b + 5 66697473756a2d74 + 6 00646569 + 7 16a5fecc + 8 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05001B3FE4F072696768742D6A757374696669656400CCFEA516 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 7466656c8bb1283d + 5 6966697473756a2d + 6 6465 + 7 00 + 8 19c38e0c + 9 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05003D28B18B6C6566742D6A7573746966696564000C8EC319 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 237ce64f + 5 7bb4f7e2 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05004FE67C23E2F7B47B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 2423222180f4ba3d + 5 2d2b2a2928272625 + 6 3534333231302f2e + 7 3d3c3b3a39383736 + 8 003e + 9 927a5224 + 10 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05003DBAF4802122232425262728292A2B2D2E2F303132333435363738393A3B3C3D3E0024527A92 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 4241403f80f4ba3e + 5 4a49484746454443 + 6 5251504f4e4d4c4b + 7 5a59585756555453 + 8 005b + 9 1fb7a497 + 10 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05003EBAF4803F404142434445464748494A4B4C4D4E4F505152535455565758595A5B0097A4B71F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 5f5e5d5c80f4ba3f + 5 6766656463627160 + 6 6f6e6d6c6b6a6968 + 7 7776757473727170 + 8 0078 + 9 07c66708 + 10 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05003FBAF4805C5D5E5F607162636465666768696A6B6C6D6E6F707172737475767778000867C607 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 7c7b7a7980f4ba40 + 5 2020202020207e7d + 6 2020202020202020 + 7 2020202020202020 + 8 0020 + 9 c15f2940 + 10 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C050040BAF480797A7B7C7D7E20202020202020202020202020202020202020202020200040295FC1 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 e29131c9 + 5 2fc482fd + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500C93191E2FD82C42F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 00000001ddc39ddb + 5 2b17bc5f + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500DB9DC3DD010000005FBC172B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 0000000addc39ddc + 5 45285384 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500DC9DC3DD0A00000084532845 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 00000064ddc39ddd + 5 4296145b + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500DD9DC3DD640000005B149642 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 000003e8ddc39dde + 5 ac3ac86b + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500DE9DC3DDE80300006BC83AAC + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 00002710ddc39ddf + 5 ab9fbaca + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500DF9DC3DD10270000CABA9FAB + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 000186a0ddc39de0 + 5 2aea3dee + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500E09DC3DDA0860100EE3DEA2A + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 00000001789086fd + 5 a8ebc250 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500FD8690780100000050C2EBA8 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 0000000a789086fe + 5 e7c9afe6 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500FE8690780A000000E6AFC9E7 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 00000064789086ff + 5 e077e839 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C0500FF8690786400000039E877E0 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 000003e878908700 + 5 a289af0d + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C050000879078E80300000DAF89A2 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 0000271078908701 + 5 a52cddac + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C05000187907810270000ACDD2CA5 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9d978 + 4 000186a078908702 + 5 ce09b012 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E478D9F95D094C050002879078A086010012B009CE + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 149a8033 + 5 9239985f + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C050033809A145F983992 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000000af74474db + 5 e969af5e + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DB7444F70A0000005EAF69E9 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000000abf74474dc + 5 4bf0dd56 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DC7444F7AB00000056DDF04B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00000abcf74474dd + 5 8596c54e + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DD7444F7BC0A00004EC59685 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000abcdf74474de + 5 d9520ce7 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DE7444F7CDAB0000E70C52D9 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000abcdef74474df + 5 a52ba371 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DF7444F7DEBC0A0071A32BA5 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00abcdeff74474e0 + 5 1313d439 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500E07444F7EFCDAB0039D41313 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000000a92115dfd + 5 2b19d99c + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500FD5D11920A0000009CD9192B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000000ab92115dfe + 5 a89d29f9 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500FE5D1192AB000000F9299DA8 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00000abc92115dff + 5 66fb31e1 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500FF5D1192BC0A0000E131FB66 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000abcd92115e00 + 5 466b3adc + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500005E1192CDAB0000DC3A6B46 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000abcde92115e01 + 5 3a12954a + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500015E1192DEBC0A004A95123A + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00abcdef92115e02 + 5 667a0898 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500025E1192EFCDAB0098087A66 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000000a9b431cdb + 5 6f3a40bf + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DB1C439B0A000000BF403A6F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000000ab9b431cdc + 5 cda332b7 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DC1C439BAB000000B732A3CD + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00000abc9b431cdd + 5 03c52aaf + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DD1C439BBC0A0000AF2AC503 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000abcd9b431cde + 5 5f01e306 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DE1C439BCDAB000006E3015F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000abcde9b431cdf + 5 23784c90 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500DF1C439BDEBC0A00904C7823 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00abcdef9b431ce0 + 5 95403bd8 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500E01C439BEFCDAB00D83B4095 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000000a361005fd + 5 f9a76cb1 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500FD0510360A000000B16CA7F9 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000000ab361005fe + 5 7a239cd4 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500FE051036AB000000D49C237A + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00000abc361005ff + 5 b44584cc + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C0500FF051036BC0A0000CC8445B4 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 0000abcd36100600 + 5 94d58ff1 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C050000061036CDAB0000F18FD594 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 000abcde36100601 + 5 e8ac2067 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C050001061036DEBC0A006720ACE8 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 00abcdef36100602 + 5 b4c4bdb5 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C050002061036EFCDAB00B5BDC4B4 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9dd61 + 4 02408d9a + 5 88cc9ab9 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E461DDF95D094C05009A8D4002B99ACC88 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea1bfd1b9b + 5 400921fb + 6 4a38c9a1 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05009B1BFD1BEA2E4454FB210940A1C9384A + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea43dfc0db + 5 400921fb + 6 66c199b2 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500DBC0DF43EA2E4454FB210940B299C166 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea6bc2661b + 5 400921fb + 6 9b740892 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05001B66C26BEA2E4454FB2109409208749B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea93a50b5b + 5 400921fb + 6 523aabe0 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05005B0BA593EA2E4454FB210940E0AB3A52 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eeabb87b09b + 5 400921fb + 6 31dc4f00 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05009BB087BBEA2E4454FB210940004FDC31 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eeae36a55db + 5 400921fb + 6 500bacd0 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500DB556AE3EA2E4454FB210940D0AC0B50 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea0b4cfb1b + 5 400921fb + 6 fbd4799f + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05001BFB4C0BEA2E4454FB2109409F79D4FB + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea332fa05b + 5 400921fb + 6 fdfcff22 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05005BA02F33EA2E4454FB21094022FFFCFD + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea5b12459b + 5 400921fb + 6 00dc60a1 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05009B45125BEA2E4454FB210940A160DC00 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea10b5637d + 5 400921fb + 6 918ea0f3 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05007D63B510EA2E4454FB210940F3A08E91 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eeadda393bd + 5 400921fb + 6 9695bac9 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500BD93A3DDEA2E4454FB210940C9BA9596 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea058638fd + 5 400921fb + 6 f2602446 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500FD388605EA2E4454FB210940462460F2 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea2d68de3d + 5 400921fb + 6 f04f1e4e + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05003DDE682DEA2E4454FB2109404E1E4FF0 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea554b837d + 5 400921fb + 6 67babf79 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05007D834B55EA2E4454FB21094079BFBA67 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea7d2e28bd + 5 400921fb + 6 1fb8dcfb + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500BD282E7DEA2E4454FB210940FBDCB81F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eeaa510cdfd + 5 400921fb + 6 4ab4c874 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500FDCD10A5EA2E4454FB21094074C8B44A + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eeaccf3733d + 5 400921fb + 6 4186a365 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05003D73F3CCEA2E4454FB21094065A38641 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eeaf4d6187d + 5 400921fb + 6 2c3da3cd + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05007D18D6F4EA2E4454FB210940CDA33D2C + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea1cb8bdbd + 5 400921fb + 6 ec772360 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500BDBDB81CEA2E4454FB210940602377EC + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 54442eea30cef3db + 5 400921fb + 6 2d9c1cc7 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500DBF3CE30EA2E4454FB210940C71C9C2D + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 75ff3462 + 5 6719b2f0 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05006234FF75F0B21967 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 00000000811d10db + 5 3ff80000 + 6 9f4b8b70 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C0500DB101D81000000000000F83F708B4B9F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 00000000a8ffb61b + 5 40250000 + 6 abe5e5aa + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05001BB6FFA80000000000002540AAE5E5AB + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e149 + 4 00000000d0e25b5b + 5 40250000 + 6 5839966b + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E449E1F95D094C05005B5BE2D000000000000025406B963958 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000f8c5009b + 5 40592000 + 6 1b68d76b + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05009B00C5F800000000002059406BD7681B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 0000000020a7a5db + 5 408f4400 + 6 02e6fe2f + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C0500DBA5A7200000000000448F402FFEE602 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000488a4b1b + 5 40c38840 + 6 0fd1ea0c + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05001B4B8A48000000004088C3400CEAD10F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000706cf05b + 5 40c38840 + 6 b40ff69a + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05005BF06C70000000004088C3409AF60FB4 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000984f959b + 5 40c38840 + 6 7358a376 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05009B954F98000000004088C34076A35873 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000c0323adb + 5 40f86a08 + 6 478c9954 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C0500DB3A32C000000000086AF84054998C47 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 0000000075d558bd + 5 412e8481 + 6 f947240d + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C0500BD58D5750000000081842E410D2447F9 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 0000000042c388fd + 5 3ff80000 + 6 2445e336 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C0500FD88C342000000000000F83F36E34524 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 000000006aa62e3d + 5 40250000 + 6 e5b1bf19 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05003D2EA66A000000000000254019BFB1E5 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 000000009288d37d + 5 40250000 + 6 26b18291 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05007DD3889200000000000025409182B126 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000ba6b78bd + 5 40592000 + 6 1902f3fc + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C0500BD786BBA0000000000205940FCF30219 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 00000000e24e1dfd + 5 408f4400 + 6 746360a7 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C0500FD1D4EE20000000000448F40A7606374 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e532 + 4 000000000a30c33d + 5 40c38840 + 6 d1212f44 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E432E5F95D094C05003DC3300A000000004088C340442F21D1 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 000000003213687d + 5 40c38840 + 6 63d986f0 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05007D681332000000004088C340F086D963 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 0000000059f60dbd + 5 40c38840 + 6 ec74f054 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500BD0DF659000000004088C34054F074EC + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 0000000081d8b2fd + 5 40f86a08 + 6 cbf4eb64 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500FDB2D88100000000086AF84064EBF4CB + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 0000000095eee91b + 5 412e8481 + 6 d83d4401 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05001BE9EE950000000081842E4101443DD8 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 66ad3a7f + 5 c7508d11 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05007F3AAD66118D50C7 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 000000ff4e9894fd + 5 984cf622 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500FD94984EFF00000022F64C98 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff1870c29b + 5 ef529577 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05009BC27018FFFFFFFF779552EF + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffffb7fb579b + 5 ffffffff + 6 c5aa0894 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05009B57FBB7FFFFFFFFFFFFFFFF9408AAC5 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffffc63dd4fd + 5 ffffffff + 6 22843968 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500FDD43DC6FFFFFFFFFFFFFFFF68398422 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 000000ffad58547d + 5 3bf03fa4 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05007D5458ADFF000000A43FF03B + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff7730821b + 5 ee0885ae + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05001B823077FFFFFFFFAE8508EE + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff16bb171b + 5 ffffffff + 6 fa040ad6 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05001B17BB16FFFFFFFFFFFFFFFFD60A04FA + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff24fd947d + 5 ffffffff + 6 af5865aa + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05007D94FD24FFFFFFFFFFFFFFFFAA6558AF + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 000000ff1f38b53d + 5 fa8bc18b + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05003DB5381FFF0000008BC18BFA + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffffe910e2db + 5 b6919444 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500DBE210E9FFFFFFFF449491B6 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff889b77db + 5 ffffffff + 6 d9abf5bd + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500DB779B88FFFFFFFFFFFFFFFFBDF5ABD9 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff96ddf53d + 5 ffffffff + 6 5e63ba82 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05003DF5DD96FFFFFFFFFFFFFFFF82BA635E + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 000000ff3ff8653d + 5 e0ad6bc9 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05003D65F83FFF000000C96BADE0 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff60d8e25b + 5 634e4763 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05005BE2D860FFFFFFFF63474E63 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffff2c427ef9 + 5 ffffffff + 6 67cd0791 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C0500F97E422CFFFFFFFFFFFFFFFF9107CD67 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9e91d + 4 ffffffffe3d00a1b + 5 ffffffff + 6 35c7f563 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E41DE9F95D094C05001B0AD0E3FFFFFFFFFFFFFFFF63F5C735 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 000000ffcaea899b + 5 ceedb8ee + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05009B89EACAFF000000EEB8EDCE + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 fffffffffb29257d + 5 68c18d7c + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007D2529FBFFFFFFFF7C8DC168 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 ffffffff9ab3ba7d + 5 ffffffff + 6 82b7dad3 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007DBAB39AFFFFFFFFFFFFFFFFD3DAB782 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 ffffffff428fc99b + 5 ffffffff + 6 df1fd7af + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05009BC98F42FFFFFFFFFFFFFFFFAFD71FDF + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 000000ff3ccaea5b + 5 c7ef0834 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05005BEACA3CFF0000003408EFC7 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 ffffffff6d09863d + 5 f6e27db5 + 6 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05003D86096DFFFFFFFFB57DE2F6 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 ffffffff0c941b3d + 5 ffffffff + 6 a8dcea10 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05003D1B940CFFFFFFFFFFFFFFFF10EADCA8 + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 ffffffffb4702a5b + 5 ffffffff + 6 d331c045 + 7 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E417EDF95D094C05005B2A70B4FFFFFFFFFFFFFFFF45C031D3 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 2d2d2d2d2d2d2d2d + 9 2d2d2d2d2d2d2d2d + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 3c0c50ef + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C00EF500C3C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 697270202020207c + 5 6d726f462066746e + 6 20207c2020207461 + 7 7020202020202020 + 8 65522066746e6972 + 9 20202020746c7573 + 10 2020202020202020 + 11 007c + 12 52a76420 + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C202020207072696E746620466F726D61742020207C2020202020202020207072696E746620526573756C742020202020202020202020207C002064A752 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 676e697274732d2d + 9 2d2d2d2d2d2d2d73 + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 407ee394 + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D737472696E67732D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C0094E37E40 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 733033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277330332527 + 8 6a2d746867697200 + 9 6465696669747375 + 10 00 + 11 8d302ad0 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2027252533307327202020202020202020202020207C20272533307327207C0072696768742D6A757374696669656400D02A308D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 30332d252527207c + 5 2020202020202773 + 6 207c202020202020 + 7 20277330332d2527 + 8 6a2d7466656c007c + 9 6465696669747375 + 10 00 + 11 77ed17a2 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C202725252D333073272020202020202020202020207C2027252D33307327207C006C6566742D6A757374696669656400A217ED77 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 2d49494353412d2d + 9 2d2d2d2d2d2d2d2d + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 91acb971 + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D41534349492D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C0071B9AC91 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 202773252527207c + 5 2020202020202020 + 6 207c202020202020 + 7 007c202027732527 + 8 2827262524232221 + 9 31302f2e2d2b2a29 + 10 3938373635343332 + 11 3d3c3b3a + 12 003e + 13 a84beca9 + 14 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2027252573272020202020202020202020202020207C202725732720207C002122232425262728292A2B2D2E2F303132333435363738393A3B3C3D3E00A9EC4BA8 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 202773252527207c + 5 2020202020202020 + 6 207c202020202020 + 7 007c202027732527 + 8 464544434241403f + 9 4e4d4c4b4a494847 + 10 565554535251504f + 11 5a595857 + 12 005b + 13 a69b8669 + 14 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2027252573272020202020202020202020202020207C202725732720207C003F404142434445464748494A4B4C4D4E4F505152535455565758595A5B0069869BA6 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9ed17 + 4 202773252527207c + 5 2020202020202020 + 6 207c202020202020 + 7 007c202027732527 + 8 636271605f5e5d5c + 9 6b6a696867666564 + 10 737271706f6e6d6c + 11 77767574 + 12 0078 + 13 c01ece27 + 14 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E417EDF95D094C05007C2027252573272020202020202020202020202020207C202725732720207C005C5D5E5F607162636465666768696A6B6C6D6E6F7071727374757677780027CE1EC0 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 202773252527207c + 5 2020202020202020 + 6 207c202020202020 + 7 007c202027732527 + 8 20207e7d7c7b7a79 + 9 2020202020202020 + 10 2020202020202020 + 11 20202020 + 12 0020 + 13 b799227c + 14 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252573272020202020202020202020202020207C202725732720207C00797A7B7C7D7E2020202020202020202020202020202020202020202020007C2299B7 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 616d696365642d2d + 9 2d2d2d2d2d2d736c + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 f5fd859c + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D646563696D616C732D2D2D2D2D2D2D2D2D2D2D2D2D2D7C009C85FDF5 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 643033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20276430332527 + 8 00000100 + 9 00 + 10 2c184f29 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252533306427202020202020202020202020207C20272533306427207C0001000000294F182C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 643033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20276430332527 + 8 00000a00 + 9 00 + 10 b87ea5f6 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252533306427202020202020202020202020207C20272533306427207C000A000000F6A57EB8 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 643033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20276430332527 + 8 00006400 + 9 00 + 10 f6fc9f0e + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252533306427202020202020202020202020207C20272533306427207C00640000000E9FFCF6 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 643033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20276430332527 + 8 0003e800 + 9 00 + 10 c314c457 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252533306427202020202020202020202020207C20272533306427207C00E803000057C414C3 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 643033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20276430332527 + 8 00271000 + 9 00 + 10 8d8dcbd1 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252533306427202020202020202020202020207C20272533306427207C0010270000D1CB8D8D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 643033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20276430332527 + 8 0186a000 + 9 00 + 10 3dec2106 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C2027252533306427202020202020202020202020207C20272533306427207C00A08601000621EC3D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 30332d252527207c + 5 2020202020202764 + 6 207c202020202020 + 7 20276430332d2527 + 8 0001007c + 9 0000 + 10 1c9564f5 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C0001000000F564951C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 30332d252527207c + 5 2020202020202764 + 6 207c202020202020 + 7 20276430332d2527 + 8 000a007c + 9 0000 + 10 88f38e2a + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C000A0000002A8EF388 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 30332d252527207c + 5 2020202020202764 + 6 207c202020202020 + 7 20276430332d2527 + 8 0064007c + 9 0000 + 10 c671b4d2 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C0064000000D2B471C6 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 30332d252527207c + 5 2020202020202764 + 6 207c202020202020 + 7 20276430332d2527 + 8 03e8007c + 9 0000 + 10 f399ef8b + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C00E80300008BEF99F3 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f109 + 4 30332d252527207c + 5 2020202020202764 + 6 207c202020202020 + 7 20276430332d2527 + 8 2710007c + 9 0000 + 10 bd00e00d + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E409F1F95D094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C00102700000DE000BD + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202764 + 6 207c202020202020 + 7 20276430332d2527 + 8 86a0007c + 9 0001 + 10 50b50f93 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333064272020202020202020202020207C2027252D33306427207C00A0860100930FB550 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 64617865682d2d2d + 9 2d736c616d696365 + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 f9886c00 + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D68657861646563696D616C732D2D2D2D2D2D2D2D2D7C00006C88F9 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 783033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277830332527 + 8 00000a00 + 9 00 + 10 c7ab9a9c + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533307827202020202020202020202020207C20272533307827207C000A0000009C9AABC7 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 783033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277830332527 + 8 0000ab00 + 9 00 + 10 9f6bed90 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533307827202020202020202020202020207C20272533307827207C00AB00000090ED6B9F + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 783033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277830332527 + 8 000abc00 + 9 00 + 10 183188af + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533307827202020202020202020202020207C20272533307827207C00BC0A0000AF883118 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 783033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277830332527 + 8 00abcd00 + 9 00 + 10 9fb1c66f + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533307827202020202020202020202020207C20272533307827207C00CDAB00006FC6B19F + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 783033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277830332527 + 8 0abcde00 + 9 00 + 10 aaf414de + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533307827202020202020202020202020207C20272533307827207C00DEBC0A00DE14F4AA + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 783033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20277830332527 + 8 abcdef00 + 9 00 + 10 2dd80e65 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533307827202020202020202020202020207C20272533307827207C00EFCDAB00650ED82D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202778 + 6 207c202020202020 + 7 20277830332d2527 + 8 000a007c + 9 0000 + 10 63ff4215 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C000A0000001542FF63 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202778 + 6 207c202020202020 + 7 20277830332d2527 + 8 00ab007c + 9 0000 + 10 3b3f3519 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00AB00000019353F3B + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202778 + 6 207c202020202020 + 7 20277830332d2527 + 8 0abc007c + 9 0000 + 10 bc655026 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00BC0A0000265065BC + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202778 + 6 207c202020202020 + 7 20277830332d2527 + 8 abcd007c + 9 0000 + 10 3be51ee6 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00CDAB0000E61EE53B + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202778 + 6 207c202020202020 + 7 20277830332d2527 + 8 bcde007c + 9 000a + 10 0ea0cc57 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00DEBC0A0057CCA00E + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 30332d252527207c + 5 2020202020202778 + 6 207c202020202020 + 7 20277830332d2527 + 8 cdef007c + 9 00ab + 10 898cd6ec + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C202725252D333078272020202020202020202020207C2027252D33307827207C00EFCDAB00ECD68C89 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 583033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20275830332527 + 8 00000a00 + 9 00 + 10 910c71e0 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533305827202020202020202020202020207C20272533305827207C000A000000E0710C91 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f4e4 + 4 583033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20275830332527 + 8 0000ab00 + 9 00 + 10 c9cc06ec + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4E4F4F95D094C05007C2027252533305827202020202020202020202020207C20272533305827207C00AB000000EC06CCC9 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 583033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20275830332527 + 8 000abc00 + 9 00 + 10 8e2c4451 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533305827202020202020202020202020207C20272533305827207C00BC0A000051442C8E + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 583033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20275830332527 + 8 00abcd00 + 9 00 + 10 09ac0a91 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533305827202020202020202020202020207C20272533305827207C00CDAB0000910AAC09 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 583033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20275830332527 + 8 0abcde00 + 9 00 + 10 3ce9d820 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533305827202020202020202020202020207C20272533305827207C00DEBC0A0020D8E93C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 583033252527207c + 5 2020202020202027 + 6 207c202020202020 + 7 7c20275830332527 + 8 abcdef00 + 9 00 + 10 bbc5c29b + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533305827202020202020202020202020207C20272533305827207C00EFCDAB009BC2C5BB + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 30332d252527207c + 5 2020202020202758 + 6 207c202020202020 + 7 20275830332d2527 + 8 000a007c + 9 0000 + 10 565558c1 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C000A000000C1585556 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 30332d252527207c + 5 2020202020202758 + 6 207c202020202020 + 7 20275830332d2527 + 8 00ab007c + 9 0000 + 10 0e952fcd + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00AB000000CD2F950E + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 30332d252527207c + 5 2020202020202758 + 6 207c202020202020 + 7 20275830332d2527 + 8 0abc007c + 9 0000 + 10 89cf4af2 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00BC0A0000F24ACF89 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 30332d252527207c + 5 2020202020202758 + 6 207c202020202020 + 7 20275830332d2527 + 8 abcd007c + 9 0000 + 10 0e4f0432 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00CDAB000032044F0E + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 30332d252527207c + 5 2020202020202758 + 6 207c202020202020 + 7 20275830332d2527 + 8 bcde007c + 9 000a + 10 3b0ad683 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00DEBC0A0083D60A3B + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 30332d252527207c + 5 2020202020202758 + 6 207c202020202020 + 7 20275830332d2527 + 8 cdef007c + 9 00ab + 10 bc26cc38 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C202725252D333058272020202020202020202020207C2027252D33305827207C00EFCDAB0038CC26BC + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 62756f642d2d2d2d + 9 2d2d2d2d2d2d656c + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 cb4dc8cc + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D646F75626C652D2D2D2D2D2D2D2D2D2D2D2D2D2D7C00CCC84DCB + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 2e3033252527207c + 5 2020202020276631 + 6 207c202020202020 + 7 2766312e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 84e5e8dd + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533302E31662720202020202020202020207C20272533302E316627207C00EA2E4454FB210940DDE8E584 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 2e3033252527207c + 5 2020202020276632 + 6 207c202020202020 + 7 2766322e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 1aa7ad72 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533302E32662720202020202020202020207C20272533302E326627207C00EA2E4454FB21094072ADA71A + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 2e3033252527207c + 5 2020202020276633 + 6 207c202020202020 + 7 2766332e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 6f666e17 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533302E33662720202020202020202020207C20272533302E336627207C00EA2E4454FB210940176E666F + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9f8ce + 4 2e3033252527207c + 5 2020202020276634 + 6 207c202020202020 + 7 2766342e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 23cf50dd + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4CEF8F95D094C05007C2027252533302E34662720202020202020202020207C20272533302E346627207C00EA2E4454FB210940DD50CF23 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 2e3033252527207c + 5 2020202020276635 + 6 207c202020202020 + 7 2766352e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 f37d4a82 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C2027252533302E35662720202020202020202020207C20272533302E356627207C00EA2E4454FB210940824A7DF3 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 2e3033252527207c + 5 2020202020276636 + 6 207c202020202020 + 7 2766362e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 6d3f0f2d + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C2027252533302E36662720202020202020202020207C20272533302E366627207C00EA2E4454FB2109402D0F3F6D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 2e3033252527207c + 5 2020202020276637 + 6 207c202020202020 + 7 2766372e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 18fecc48 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C2027252533302E37662720202020202020202020207C20272533302E376627207C00EA2E4454FB21094048CCFE18 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 2e3033252527207c + 5 2020202020276638 + 6 207c202020202020 + 7 2766382e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 f46d72b9 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C2027252533302E38662720202020202020202020207C20272533302E386627207C00EA2E4454FB210940B9726DF4 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 2e3033252527207c + 5 2020202020276639 + 6 207c202020202020 + 7 2766392e30332527 + 8 fb54442eea007c20 + 9 0921 + 10 40 + 11 81acb1dc + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C2027252533302E39662720202020202020202020207C20272533302E396627207C00EA2E4454FB210940DCB1AC81 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 2e3033252527207c + 5 2020202027663031 + 6 207c202020202020 + 7 6630312e30332527 + 8 54442eea007c2027 + 9 400921fb + 10 e139fa42 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C2027252533302E31306627202020202020202020207C20272533302E31306627207C00EA2E4454FB21094042FA39E1 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766312e + 6 207c202020202020 + 7 66312e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 1ff09576 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E316627202020202020202020207C2027252D33302E316627207C00EA2E4454FB2109407695F01F + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766322e + 6 207c202020202020 + 7 66322e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 81b2d0d9 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E326627202020202020202020207C2027252D33302E326627207C00EA2E4454FB210940D9D0B281 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766332e + 6 207c202020202020 + 7 66332e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 f47313bc + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E336627202020202020202020207C2027252D33302E336627207C00EA2E4454FB210940BC1373F4 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766342e + 6 207c202020202020 + 7 66342e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 b8da2d76 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E346627202020202020202020207C2027252D33302E346627207C00EA2E4454FB210940762DDAB8 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766352e + 6 207c202020202020 + 7 66352e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 cd1bee13 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E356627202020202020202020207C2027252D33302E356627207C00EA2E4454FB21094013EE1BCD + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766362e + 6 207c202020202020 + 7 66362e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 5359abbc + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E366627202020202020202020207C2027252D33302E366627207C00EA2E4454FB210940BCAB5953 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766372e + 6 207c202020202020 + 7 66372e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 269868d9 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E376627202020202020202020207C2027252D33302E376627207C00EA2E4454FB210940D9689826 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766382e + 6 207c202020202020 + 7 66382e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 ca0bd628 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E386627202020202020202020207C2027252D33302E386627207C00EA2E4454FB21094028D60BCA + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020202766392e + 6 207c202020202020 + 7 66392e30332d2527 + 8 54442eea007c2027 + 9 400921fb + 10 bfca154d + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E396627202020202020202020207C2027252D33302E396627207C00EA2E4454FB2109404D15CABF + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095df9fcb7 + 4 30332d252527207c + 5 202020276630312e + 6 207c202020202020 + 7 30312e30332d2527 + 8 442eea007c202766 + 9 0921fb54 + 10 40 + 11 81c4e3f2 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E4B7FCF95D094C05007C202725252D33302E313066272020202020202020207C2027252D33302E31306627207C00EA2E4454FB210940F2E3C481 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 656963732d2d2d2d + 9 2d2d63696669746e + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 1195e178 + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D736369656E74696669632D2D2D2D2D2D2D2D2D2D7C0078E19511 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276531 + 6 207c202020202020 + 7 2765312e30332527 + 8 0000000000007c20 + 9 f800 + 10 3f + 11 33201ed1 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E31652720202020202020202020207C20272533302E316527207C00000000000000F83FD11E2033 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276532 + 6 207c202020202020 + 7 2765322e30332527 + 8 0000000000007c20 + 9 2500 + 10 40 + 11 79c4c438 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E32652720202020202020202020207C20272533302E326527207C00000000000000254038C4C479 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276533 + 6 207c202020202020 + 7 2765332e30332527 + 8 0000000000007c20 + 9 2500 + 10 40 + 11 0c05075d + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E33652720202020202020202020207C20272533302E336527207C0000000000000025405D07050C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276534 + 6 207c202020202020 + 7 2765342e30332527 + 8 0000000000007c20 + 9 5920 + 10 40 + 11 cd2fb460 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E34652720202020202020202020207C20272533302E346527207C00000000000020594060B42FCD + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276535 + 6 207c202020202020 + 7 2765352e30332527 + 8 0000000000007c20 + 9 8f44 + 10 40 + 11 52cf349c + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E35652720202020202020202020207C20272533302E356527207C000000000000448F409C34CF52 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276536 + 6 207c202020202020 + 7 2765362e30332527 + 8 4000000000007c20 + 9 c388 + 10 40 + 11 a16f27f1 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E36652720202020202020202020207C20272533302E366527207C00000000004088C340F1276FA1 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276537 + 6 207c202020202020 + 7 2765372e30332527 + 8 4000000000007c20 + 9 c388 + 10 40 + 11 d4aee494 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E37652720202020202020202020207C20272533302E376527207C00000000004088C34094E4AED4 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276538 + 6 207c202020202020 + 7 2765382e30332527 + 8 4000000000007c20 + 9 c388 + 10 40 + 11 383d5a65 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E38652720202020202020202020207C20272533302E386527207C00000000004088C340655A3D38 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202020276539 + 6 207c202020202020 + 7 2765392e30332527 + 8 0800000000007c20 + 9 f86a + 10 40 + 11 1bca8220 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E39652720202020202020202020207C20272533302E396527207C0000000000086AF8402082CA1B + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 2e3033252527207c + 5 2020202027653031 + 6 207c202020202020 + 7 6530312e30332527 + 8 00000000007c2027 + 9 412e8481 + 10 2dc3c0c4 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C2027252533302E31306527202020202020202020207C20272533302E31306527207C000000000081842E41C4C0C32D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 30332d252527207c + 5 202020202765312e + 6 207c202020202020 + 7 65312e30332d2527 + 8 00000000007c2027 + 9 3ff80000 + 10 c628684a + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C202725252D33302E316527202020202020202020207C2027252D33302E316527207C00000000000000F83F4A6828C6 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 30332d252527207c + 5 202020202765322e + 6 207c202020202020 + 7 65322e30332d2527 + 8 00000000007c2027 + 9 40250000 + 10 8cccb2a3 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C202725252D33302E326527202020202020202020207C2027252D33302E326527207C000000000000002540A3B2CC8C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 30332d252527207c + 5 202020202765332e + 6 207c202020202020 + 7 65332e30332d2527 + 8 00000000007c2027 + 9 40250000 + 10 f90d71c6 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C202725252D33302E336527202020202020202020207C2027252D33302E336527207C000000000000002540C6710DF9 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa009e + 4 30332d252527207c + 5 202020202765342e + 6 207c202020202020 + 7 65342e30332d2527 + 8 00000000007c2027 + 9 40592000 + 10 3827c2fb + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E49E00FA5D094C05007C202725252D33302E346527202020202020202020207C2027252D33302E346527207C000000000000205940FBC22738 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 30332d252527207c + 5 202020202765352e + 6 207c202020202020 + 7 65352e30332d2527 + 8 00000000007c2027 + 9 408f4400 + 10 f661183a + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725252D33302E356527202020202020202020207C2027252D33302E356527207C000000000000448F403A1861F6 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 30332d252527207c + 5 202020202765362e + 6 207c202020202020 + 7 65362e30332d2527 + 8 00000000007c2027 + 9 40c38840 + 10 05c10b57 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725252D33302E366527202020202020202020207C2027252D33302E366527207C00000000004088C340570BC105 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 30332d252527207c + 5 202020202765372e + 6 207c202020202020 + 7 65372e30332d2527 + 8 00000000007c2027 + 9 40c38840 + 10 7000c832 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725252D33302E376527202020202020202020207C2027252D33302E376527207C00000000004088C34032C80070 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 30332d252527207c + 5 202020202765382e + 6 207c202020202020 + 7 65382e30332d2527 + 8 00000000007c2027 + 9 40c38840 + 10 9c9376c3 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725252D33302E386527202020202020202020207C2027252D33302E386527207C00000000004088C340C376939C + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 30332d252527207c + 5 202020202765392e + 6 207c202020202020 + 7 65392e30332d2527 + 8 00000000007c2027 + 9 40f86a08 + 10 bf64ae86 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725252D33302E396527202020202020202020207C2027252D33302E396527207C0000000000086AF84086AE64BF + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 30332d252527207c + 5 202020276530312e + 6 207c202020202020 + 7 30312e30332d2527 + 8 000000007c202765 + 9 2e848100 + 10 41 + 11 a98d3ca6 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725252D33302E313065272020202020202020207C2027252D33302E31306527207C000000000081842E41A63C8DA9 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 746f78652d2d2d2d + 9 2d2d2d2d2d736369 + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 500b5c6f + 13 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D65786F746963732D2D2D2D2D2D2D2D2D2D2D2D2D7C006F5C0B50 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 303330252527207c + 5 2020202027756868 + 6 207c202020202020 + 7 7568683033302527 + 8 000000ff007c2027 + 9 5d597e88 + 10 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C2027252530333068687527202020202020202020207C20272530333068687527207C00FF000000887E595D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 303330252527207c + 5 2020202020277568 + 6 207c202020202020 + 7 2775683033302527 + 8 ff007c20 + 9 ffff + 10 ff + 11 013ac5e9 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C2027252530333068752720202020202020202020207C202725303330687527207C00FFFFFFFFE9C53A01 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 303330252527207c + 5 202020202027756c + 6 207c202020202020 + 7 27756c3033302527 + 8 ffffffffff007c20 + 9 ffff + 10 ff + 11 579f6cbf + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725253033306C752720202020202020202020207C2027253033306C7527207C00FFFFFFFFFFFFFFFFBF6C9F57 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 303330252527207c + 5 2020202027756c6c + 6 207c202020202020 + 7 756c6c3033302527 + 8 ffffffff007c2027 + 9 ffffffff + 10 aedd0b49 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C202725253033306C6C7527202020202020202020207C2027253033306C6C7527207C00FFFFFFFFFFFFFFFF490BDDAE + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 303330252527207c + 5 20202020276f6868 + 6 207c202020202020 + 7 6f68683033302527 + 8 000000ff007c2027 + 9 a544299a + 10 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C2027252530333068686F27202020202020202020207C20272530333068686F27207C00FF0000009A2944A5 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0488 + 4 303330252527207c + 5 2020202020276f68 + 6 207c202020202020 + 7 276f683033302527 + 8 ff007c20 + 9 ffff + 10 ff + 11 f92792fb + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E48804FA5D094C05007C20272525303330686F2720202020202020202020207C202725303330686F27207C00FFFFFFFFFB9227F9 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 303330252527207c + 5 2020202020276f6c + 6 207c202020202020 + 7 276f6c3033302527 + 8 ffffffffff007c20 + 9 ffff + 10 ff + 11 d2338c11 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C202725253033306C6F2720202020202020202020207C2027253033306C6F27207C00FFFFFFFFFFFFFFFF118C33D2 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 303330252527207c + 5 20202020276f6c6c + 6 207c202020202020 + 7 6f6c6c3033302527 + 8 ffffffff007c2027 + 9 ffffffff + 10 bd312af0 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C202725253033306C6C6F27202020202020202020207C2027253033306C6C6F27207C00FFFFFFFFFFFFFFFFF02A31BD + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 303330252527207c + 5 2020202027786868 + 6 207c202020202020 + 7 7868683033302527 + 8 000000ff007c2027 + 9 0d488240 + 10 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C2027252530333068687827202020202020202020207C20272530333068687827207C00FF0000004082480D + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 303330252527207c + 5 2020202020277868 + 6 207c202020202020 + 7 2778683033302527 + 8 ff007c20 + 9 ffff + 10 ff + 11 e73f9d0c + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C2027252530333068782720202020202020202020207C202725303330687827207C00FFFFFFFF0C9D3FE7 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 303330252527207c + 5 202020202027786c + 6 207c202020202020 + 7 27786c3033302527 + 8 ffffffffff007c20 + 9 ffff + 10 ff + 11 c8f40068 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C202725253033306C782720202020202020202020207C2027253033306C7827207C00FFFFFFFFFFFFFFFF6800F4C8 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 303330252527207c + 5 2020202027786c6c + 6 207c202020202020 + 7 786c6c3033302527 + 8 ffffffff007c2027 + 9 ffffffff + 10 a7f6a689 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C202725253033306C6C7827202020202020202020207C2027253033306C6C7827207C00FFFFFFFFFFFFFFFF89A6F6A7 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 30332d252527207c + 5 2020202027756868 + 6 207c202020202020 + 7 75686830332d2527 + 8 000000ff007c2027 + 9 33cf6775 + 10 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C202725252D333068687527202020202020202020207C2027252D333068687527207C00FF0000007567CF33 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 30332d252527207c + 5 2020202020277568 + 6 207c202020202020 + 7 27756830332d2527 + 8 ff007c20 + 9 ffff + 10 ff + 11 6756add6 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C202725252D333068752720202020202020202020207C2027252D3330687527207C00FFFFFFFFD6AD5667 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 2020202027756c30 + 6 207c202020202020 + 7 756c30332d232527 + 8 ffffffff007c2027 + 9 ffffffff + 10 a5c7c083 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D33306C7527202020202020202020207C202725232D33306C7527207C00FFFFFFFFFFFFFFFF83C0C7A5 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 20202027756c6c30 + 6 207c202020202020 + 7 6c6c30332d232527 + 8 ffffff007c202775 + 9 ffffffff + 10 ff + 11 d38fd584 + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D33306C6C75272020202020202020207C202725232D33306C6C7527207C00FFFFFFFFFFFFFFFF84D58FD3 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 202020276f686830 + 6 207c202020202020 + 7 686830332d232527 + 8 0000ff007c20276f + 9 00 + 10 6fa5b8ab + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D333068686F272020202020202020207C202725232D333068686F27207C00FF000000ABB8A56F + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 20202020276f6830 + 6 207c202020202020 + 7 6f6830332d232527 + 8 ffffffff007c2027 + 9 bf1fa642 + 10 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D3330686F27202020202020202020207C202725232D3330686F27207C00FFFFFFFF42A61FBF + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 20202020276f6c30 + 6 207c202020202020 + 7 6f6c30332d232527 + 8 ffffffff007c2027 + 9 ffffffff + 10 b6bd372d + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D33306C6F27202020202020202020207C202725232D33306C6F27207C00FFFFFFFFFFFFFFFF2D37BDB6 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 202020276f6c6c30 + 6 207c202020202020 + 7 6c6c30332d232527 + 8 ffffff007c20276f + 9 ffffffff + 10 ff + 11 c0f5222a + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D33306C6C6F272020202020202020207C202725232D33306C6C6F27207C00FFFFFFFFFFFFFFFF2A22F5C0 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 2020202778686830 + 6 207c202020202020 + 7 686830332d232527 + 8 0000ff007c202778 + 9 00 + 10 ebb64430 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D3330686878272020202020202020207C202725232D333068687827207C00FF0000003044B6EB + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0862 + 4 332d23252527207c + 5 2020202027786830 + 6 207c202020202020 + 7 786830332d232527 + 8 ffffffff007c2027 + 9 3b0c5ad9 + 10 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E46208FA5D094C05007C20272525232D3330687827202020202020202020207C202725232D3330687827207C00FFFFFFFFD95A0C3B + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 332d23252527207c + 5 2020202027786c30 + 6 207c202020202020 + 7 786c30332d232527 + 8 ffffffff007c2027 + 9 ffffffff + 10 19368c17 + 11 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C05007C20272525232D33306C7827202020202020202020207C202725232D33306C7827207C00FFFFFFFFFFFFFFFF178C3619 + +STP Protocol Output: + 0 0c801c42 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 332d23252527207c + 5 20202027786c6c30 + 6 207c202020202020 + 7 6c6c30332d232527 + 8 ffffff007c202778 + 9 ffffffff + 10 ff + 11 88ac0c2c + 12 +SYS-T RAW DATA: 421C800C494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C05007C20272525232D33306C6C78272020202020202020207C202725232D33306C6C7827207C00FFFFFFFFFFFFFFFF2C0CAC88 + +STP Protocol Output: + 0 0c801c72 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 2d2d2d2d2d2d2d2d + 9 2d2d2d2d2d2d2d2d + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 d78ed41c + 13 +SYS-T RAW DATA: 721C800C494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C001CD48ED7 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 0000000ed44fd581 + 5 00000e00 + 6 0000 + 7 cc5f9618 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD40E000000000E0000000018965FCC + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 0000000cd44fd581 + 5 00001000 + 6 0000 + 7 853d1c09 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD40C000000001000000000091C3D85 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000009d44fd581 + 5 00001300 + 6 0000 + 7 2535a2df + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD409000000001300000000DFA23525 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000006d44fd581 + 5 00001600 + 6 0000 + 7 c0c01754 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD4060000000016000000005417C0C0 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000004d44fd581 + 5 00001800 + 6 0000 + 7 0680fc96 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD40400000000180000000096FC8006 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000002d44fd581 + 5 00001a00 + 6 0000 + 7 c68fd7f2 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD402000000001A00000000F2D78FC6 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000001d44fd581 + 5 00001b00 + 6 0000 + 7 a6884240 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD401000000001B00000000404288A6 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000001d44fd581 + 5 00001b00 + 6 0000 + 7 a6884240 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD401000000001B00000000404288A6 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000001d44fd581 + 5 00001b00 + 6 0000 + 7 a6884240 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD401000000001B00000000404288A6 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000001d44fd581 + 5 00001b00 + 6 0000 + 7 a6884240 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD401000000001B00000000404288A6 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000002d44fd581 + 5 00001a00 + 6 0000 + 7 c68fd7f2 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD402000000001A00000000F2D78FC6 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000004d44fd581 + 5 00001800 + 6 0000 + 7 0680fc96 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD40400000000180000000096FC8006 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000006d44fd581 + 5 00001600 + 6 0000 + 7 c0c01754 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD4060000000016000000005417C0C0 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000009d44fd581 + 5 00001300 + 6 0000 + 7 2535a2df + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD409000000001300000000DFA23525 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 0000000cd44fd581 + 5 00001000 + 6 0000 + 7 853d1c09 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD40C000000001000000000091C3D85 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 0000000ed44fd581 + 5 00000e00 + 6 0000 + 7 cc5f9618 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD40E000000000E0000000018965FCC + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000010d44fd581 + 5 00000c00 + 6 0000 + 7 c73f806e + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD410000000000C000000006E803FC7 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000013d44fd581 + 5 00000900 + 6 0000 + 7 477dab6c + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD4130000000009000000006CAB7D47 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa0c4b + 4 00000016d44fd581 + 5 00000600 + 6 0000 + 7 c257a09b + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E44B0CFA5D094C050081D54FD4160000000006000000009BA057C2 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 00000018d44fd581 + 5 00000400 + 6 0000 + 7 807dffeb + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD418000000000400000000EBFF7D80 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0000001ad44fd581 + 5 00000200 + 6 0000 + 7 835a1fb8 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41A000000000200000000B81F5A83 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0000001bd44fd581 + 5 00000100 + 6 0000 + 7 003fd4e9 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41B000000000100000000E9D43F00 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0000001bd44fd581 + 5 00000100 + 6 0000 + 7 003fd4e9 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41B000000000100000000E9D43F00 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0000001bd44fd581 + 5 00000100 + 6 0000 + 7 003fd4e9 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41B000000000100000000E9D43F00 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0000001bd44fd581 + 5 00000100 + 6 0000 + 7 003fd4e9 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41B000000000100000000E9D43F00 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0000001ad44fd581 + 5 00000200 + 6 0000 + 7 835a1fb8 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41A000000000200000000B81F5A83 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 00000018d44fd581 + 5 00000400 + 6 0000 + 7 807dffeb + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD418000000000400000000EBFF7D80 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 00000016d44fd581 + 5 00000600 + 6 0000 + 7 06a83f81 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD416000000000600000000813FA806 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 00000013d44fd581 + 5 00000900 + 6 0000 + 7 83823476 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD41300000000090000000076348283 + +STP Protocol Output: + 0 05801c73 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 00000010d44fd581 + 5 00000c00 + 6 0000 + 7 03c01f74 + 8 +SYS-T RAW DATA: 731C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C050081D54FD410000000000C00000000741FC003 + +STP Protocol Output: + 0 0c801c72 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 2d2d2d2d2d2d2d7c + 5 2d2d2d2d2d2d2d2d + 6 2d2d2d2d2d2d2d2d + 7 2d2d2d2d2d2d2d2d + 8 2d2d2d2d2d2d2d2d + 9 2d2d2d2d2d2d2d2d + 10 2d2d2d2d2d2d2d2d + 11 007c + 12 cd9f6fb7 + 13 +SYS-T RAW DATA: 721C800C494E54438A9C4014A65A2F36A36D96E43410FA5D094C05007C2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D7C00B76F9FCD + +STP Protocol Output: + 0 01801c06 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 0706050403020100 + 5 0908 + 6 48bdde7c + 7 +SYS-T RAW DATA: 061C8001494E54438A9C4014A65A2F36A36D96E43410FA5D094C0500000102030405060708097CDEBD48 + +STP Protocol Output: + 0 12345671 +SYS-T RAW DATA: 71563412 + +STP Protocol Output: + 0 1122334455667787 +SYS-T RAW DATA: 8777665544332211 + +STP Protocol Output: + 0 e0000011 +SYS-T RAW DATA: 110000E0 + +STP Protocol Output: + 0 e0000021 +SYS-T RAW DATA: 210000E0 + +STP Protocol Output: + 0 f0000011 +SYS-T RAW DATA: 110000F0 + +STP Protocol Output: + 0 f0000021 +SYS-T RAW DATA: 210000F0 + +STP Protocol Output: + 0 06801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 1122334455667788 + 5 0c808862 + 6 +SYS-T RAW DATA: 431C8006494E54438A9C4014A65A2F36A36D96E43410FA5D094C050088776655443322116288800C + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 7461747300000002 + 5 000a0065 + 6 0000 + 7 0fa0f986 + 8 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C0500020000007374617465000A00000086F9A00F + +STP Protocol Output: + 0 05801c43 + 1 14409c8a43544e49 + 2 e4966da3362f5aa6 + 3 00054c095dfa1034 + 4 74617473e054cf5c + 5 000a0065 + 6 0000 + 7 d4e6c985 + 8 +SYS-T RAW DATA: 431C8005494E54438A9C4014A65A2F36A36D96E43410FA5D094C05005CCF54E07374617465000A00000085C9E6D4 + + in SyS-T platform handle release hook:systh = 000000E3C08BF840 \ No newline at end of file diff --git a/printer/test/output_client32.txt b/printer/test/output_client32.txt new file mode 100644 index 0000000..4da39e2 --- /dev/null +++ b/printer/test/output_client32.txt @@ -0,0 +1,284 @@ +Decode Status,Payload,Type,Severity,Origin,Unit,Message TimeStamp,Context TimeStamp,Location,Raw Length,Checksum,Collateral +OK,"0x0000000000010000 version banner string",BUILD:LONG,MAX,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,62,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"SyS-T Library version 1.0.0",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:64,48,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:40,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| ____ _____ _______ |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:41,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| / ___| / ____| |__ __| |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:42,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| | |___ __ _| |___ _____| | |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:43,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| \___ \| | | |\___ \_____| | |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:44,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| ____| | |_| |____| | | | |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:45,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| |_____/ \__| |_____/ |_| |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:46,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| _/ / |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:47,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| |__/ |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:48,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:49,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| catalog Format | Printed Result |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:254,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------strings---------------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:255,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30s' | ' right-justified' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:256,52,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30s' | 'left-justified ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:257,51,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------ASCII-----------------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:258,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '!""#$%&'()*+-./0123456789:;<=>' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:259,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:260,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '\]^_`qbcdefghijklmnopqrstuvwx' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:261,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | 'yz{|}~ ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:262,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------decimals--------------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:263,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:264,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:265,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:266,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1000' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:267,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10000' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:268,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100000' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:269,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:270,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:271,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:272,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1000 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:273,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10000 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:274,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100000 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:275,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|----------------------------------hexadecimals---------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:276,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' a' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:277,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' ab' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:278,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abc' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:279,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcd' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:280,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcde' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:281,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcdef' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:282,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'a ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:283,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'ab ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:284,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abc ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:285,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcd ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:286,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcde ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:287,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcdef ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:288,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' A' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:289,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' AB' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:290,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABC' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:291,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCD' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:292,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDE' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:293,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDEF' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:294,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'A ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:295,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'AB ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:296,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABC ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:297,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCD ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:298,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDE ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:299,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDEF ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:300,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------double--------------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:301,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1f' | ' 3.1' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:302,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2f' | ' 3.14' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:303,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3f' | ' 3.142' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:304,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4f' | ' 3.1416' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:305,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5f' | ' 3.14159' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:306,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6f' | ' 3.141593' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:307,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7f' | ' 3.1415927' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:308,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8f' | ' 3.14159265' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:309,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9f' | ' 3.141592654' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:310,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10f' | ' 3.1415926536' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:311,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1f' | '3.1 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:312,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2f' | '3.14 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:313,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3f' | '3.142 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:314,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4f' | '3.1416 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:315,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5f' | '3.14159 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:316,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6f' | '3.141593 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:317,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7f' | '3.1415927 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:318,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8f' | '3.14159265 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:319,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9f' | '3.141592654 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:320,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10f' | '3.1415926536 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:321,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------scientific----------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:322,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1e' | ' 1.5e+00' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:323,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2e' | ' 1.05e+01' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:324,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3e' | ' 1.050e+01' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:325,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4e' | ' 1.0050e+02' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:326,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5e' | ' 1.00050e+03' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:327,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6e' | ' 1.000050e+04' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:328,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7e' | ' 1.0000500e+04' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:329,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8e' | ' 1.00005000e+04' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:330,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9e' | ' 1.000005000e+05' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:331,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10e' | ' 1.0000005000e+06' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:332,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1e' | '1.5e+00 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:333,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2e' | '1.05e+01 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:334,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3e' | '1.050e+01 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:335,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4e' | '1.0050e+02 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:336,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5e' | '1.00050e+03 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:337,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6e' | '1.000050e+04 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:338,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7e' | '1.0000500e+04 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:339,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8e' | '1.00005000e+04 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:340,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9e' | '1.000005000e+05 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:341,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10e' | '1.0000005000e+06 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:342,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------exotics-------------|",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:343,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhu' | '000000000000000000000000000255' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:344,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hu' | '000000000000000000000000065535' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:345,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lu' | '000000000000000000004294967295' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:346,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llu' | '000000000018446744073709551615' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:347,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hho' | '000000000000000000000000000377' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:348,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030ho' | '000000000000000000000000177777' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:349,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lo' | '000000000000000000037777777777' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:350,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llo' | '000000001777777777777777777777' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:351,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhx' | '0000000000000000000000000000ff' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:352,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hx' | '00000000000000000000000000ffff' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:353,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lx' | '0000000000000000000000ffffffff' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:354,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llx' | '00000000000000ffffffffffffffff' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:355,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hhu' | '255 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:356,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hu' | '65535 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:357,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lu' | '65535 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:358,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llu' | '18446744073709551615 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:359,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hho' | '0377 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:360,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30ho' | '0177777 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:361,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lo' | '037777777777 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:362,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llo' | '01777777777777777777777 ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:363,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hhx' | '0xff ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:364,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hx' | '0xffff ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:365,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lx' | '0xffffffff ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:366,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llx' | '0xffffffffffffffff ' |",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:367,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-------------------------------------------------------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| printf Format | printf Result |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------strings---------------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30s' | ' right-justified' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,81,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30s' | 'left-justified ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,81,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------ASCII-----------------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '!""#$%&'()*+-./0123456789:;<=>' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '\]^_`qbcdefghijklmnopqrstuvwx' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | 'yz{|}~ ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------decimals--------------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1000' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10000' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100000' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1000 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10000 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100000 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|----------------------------------hexadecimals---------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' a' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' ab' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abc' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcd' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcde' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcdef' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'a ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'ab ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abc ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcd ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcde ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcdef ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' A' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' AB' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABC' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCD' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDE' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDEF' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'A ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'AB ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABC ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCD ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDE ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDEF ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------double--------------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1f' | ' 3.1' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2f' | ' 3.14' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3f' | ' 3.142' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4f' | ' 3.1416' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5f' | ' 3.14159' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6f' | ' 3.141593' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7f' | ' 3.1415927' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8f' | ' 3.14159265' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9f' | ' 3.141592654' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10f' | ' 3.1415926536' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1f' | '3.1 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2f' | '3.14 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3f' | '3.142 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4f' | '3.1416 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5f' | '3.14159 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6f' | '3.141593 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7f' | '3.1415927 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8f' | '3.14159265 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9f' | '3.141592654 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10f' | '3.1415926536 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------scientific----------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1e' | ' 1.5e+00' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2e' | ' 1.05e+01' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3e' | ' 1.050e+01' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4e' | ' 1.0050e+02' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5e' | ' 1.00050e+03' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6e' | ' 1.000050e+04' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7e' | ' 1.0000500e+04' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8e' | ' 1.00005000e+04' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9e' | ' 1.000005000e+05' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10e' | ' 1.0000005000e+06' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1e' | '1.5e+00 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2e' | '1.05e+01 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3e' | '1.050e+01 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4e' | '1.0050e+02 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5e' | '1.00050e+03 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6e' | '1.000050e+04 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7e' | '1.0000500e+04 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8e' | '1.00005000e+04 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9e' | '1.000005000e+05 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10e' | '1.0000005000e+06 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------exotics-------------|",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhu' | '000000000000000000000000000255' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hu' | '000000000000000000000000065535' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lu' | '000000000000000000004294967295' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llu' | '000000000018446744073709551615' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hho' | '000000000000000000000000000377' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030ho' | '000000000000000000000000177777' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lo' | '000000000000000000037777777777' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llo' | '000000001777777777777777777777' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhx' | '0000000000000000000000000000ff' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hx' | '00000000000000000000000000ffff' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lx' | '0000000000000000000000ffffffff' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llx' | '00000000000000ffffffffffffffff' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hhu' | '255 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hu' | '65535 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lu' | '4294967295 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llu' | '18446744073709551615 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hho' | '0377 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,73,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30ho' | '0177777 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lo' | '037777777777 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llo' | '01777777777777777777777 ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hhx' | '0xff ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,73,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hx' | '0xffff ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lx' | '0xffffffff ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llx' | '0xffffffffffffffff ' |",STRING:PRINTF32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-------------------------------------------------------|",STRING:PRINTF32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-------------------------------------------------------|",STRING:PRINTF32,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"00010203040506070809",RAW:Protocol1,MAX,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,42,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"Short 32-Bit value (0x01234567)",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"Short 64-Bit value (0x0112233445566778)]",SHORT64,MAX,,0,,<--UNITTEST-HIDE_TS-->,,8,,collateral.xml +OK,"error with code 1",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"error with code 2",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"warning with code 1",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"warning with code 2",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"Hello world ",CATALOG:ID64P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:77,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"state=10 ",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:78,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"state=10 ",CATALOG:ID32P32,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:82,46,<--UNITTEST-HIDE_CRC-->,collateral.xml diff --git a/printer/test/output_client64.txt b/printer/test/output_client64.txt new file mode 100644 index 0000000..ae0db21 --- /dev/null +++ b/printer/test/output_client64.txt @@ -0,0 +1,284 @@ +Decode Status,Payload,Type,Severity,Origin,Unit,Message TimeStamp,Context TimeStamp,Location,Raw Length,Checksum,Collateral +OK,"0x0000000000010000 version banner string",BUILD:LONG,MAX,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,62,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"SyS-T Library version 1.0.0",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:64,48,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:40,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| ____ _____ _______ |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:41,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| / ___| / ____| |__ __| |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:42,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| | |___ __ _| |___ _____| | |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:43,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| \___ \| | | |\___ \_____| | |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:44,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| ____| | |_| |____| | | | |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:45,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| |_____/ \__| |_____/ |_| |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:46,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| _/ / |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:47,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| |__/ |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:48,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"+-------------------------------------------------------+",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:49,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| catalog Format | Printed Result |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:254,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------strings---------------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:255,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30s' | ' right-justified' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:256,52,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30s' | 'left-justified ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:257,51,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------ASCII-----------------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:258,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '!""#$%&'()*+-./0123456789:;<=>' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:259,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:260,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '\]^_`qbcdefghijklmnopqrstuvwx' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:261,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | 'yz{|}~ ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:262,66,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------decimals--------------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:263,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:264,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:265,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:266,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1000' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:267,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10000' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:268,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100000' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:269,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:270,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:271,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:272,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1000 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:273,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10000 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:274,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100000 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:275,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|----------------------------------hexadecimals---------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:276,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' a' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:277,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' ab' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:278,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abc' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:279,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcd' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:280,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcde' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:281,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcdef' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:282,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'a ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:283,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'ab ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:284,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abc ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:285,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcd ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:286,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcde ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:287,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcdef ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:288,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' A' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:289,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' AB' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:290,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABC' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:291,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCD' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:292,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDE' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:293,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDEF' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:294,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'A ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:295,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'AB ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:296,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABC ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:297,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCD ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:298,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDE ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:299,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDEF ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:300,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------double--------------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:301,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1f' | ' 3.1' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:302,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2f' | ' 3.14' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:303,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3f' | ' 3.142' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:304,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4f' | ' 3.1416' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:305,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5f' | ' 3.14159' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:306,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6f' | ' 3.141593' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:307,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7f' | ' 3.1415927' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:308,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8f' | ' 3.14159265' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:309,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9f' | ' 3.141592654' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:310,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10f' | ' 3.1415926536' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:311,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1f' | '3.1 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:312,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2f' | '3.14 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:313,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3f' | '3.142 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:314,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4f' | '3.1416 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:315,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5f' | '3.14159 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:316,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6f' | '3.141593 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:317,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7f' | '3.1415927 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:318,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8f' | '3.14159265 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:319,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9f' | '3.141592654 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:320,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10f' | '3.1415926536 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:321,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------scientific----------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:322,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1e' | ' 1.5e+00' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:323,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2e' | ' 1.05e+01' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:324,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3e' | ' 1.050e+01' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:325,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4e' | ' 1.0050e+02' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:326,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5e' | ' 1.00050e+03' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:327,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6e' | ' 1.000050e+04' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:328,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7e' | ' 1.0000500e+04' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:329,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8e' | ' 1.00005000e+04' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:330,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9e' | ' 1.000005000e+05' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:331,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10e' | ' 1.0000005000e+06' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:332,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1e' | '1.5e+00 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:333,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2e' | '1.05e+01 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:334,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3e' | '1.050e+01 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:335,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4e' | '1.0050e+02 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:336,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5e' | '1.00050e+03 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:337,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6e' | '1.000050e+04 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:338,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7e' | '1.0000500e+04 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:339,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8e' | '1.00005000e+04 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:340,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9e' | '1.000005000e+05 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:341,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10e' | '1.0000005000e+06 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:342,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------exotics-------------|",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:343,36,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhu' | '000000000000000000000000000255' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:344,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hu' | '000000000000000000000000065535' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:345,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lu' | '000000000018446744073709551615' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:346,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llu' | '000000000018446744073709551615' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:347,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hho' | '000000000000000000000000000377' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:348,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030ho' | '000000000000000000000000177777' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:349,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lo' | '000000001777777777777777777777' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:350,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llo' | '000000001777777777777777777777' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:351,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhx' | '0000000000000000000000000000ff' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:352,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hx' | '00000000000000000000000000ffff' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:353,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lx' | '00000000000000ffffffffffffffff' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:354,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llx' | '00000000000000ffffffffffffffff' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:355,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hhu' | '255 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:356,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hu' | '65535 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:357,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lu' | '65535 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:358,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llu' | '18446744073709551615 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:359,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hho' | '0377 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:360,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30ho' | '0177777 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:361,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lo' | '01777777777777777777777 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:362,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llo' | '01777777777777777777777 ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:363,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hhx' | '0xff ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:364,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hx' | '0xffff ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:365,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lx' | '0xffffffffffffffff ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:366,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llx' | '0xffffffffffffffff ' |",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:367,44,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-------------------------------------------------------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| printf Format | printf Result |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------strings---------------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30s' | ' right-justified' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,81,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30s' | 'left-justified ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,81,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------ASCII-----------------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '!""#$%&'()*+-./0123456789:;<=>' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | '\]^_`qbcdefghijklmnopqrstuvwx' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%s' | 'yz{|}~ ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,94,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|---------------------------------decimals--------------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 1000' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 10000' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30d' | ' 100000' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '1000 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '10000 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30d' | '100000 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|----------------------------------hexadecimals---------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' a' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' ab' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abc' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcd' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcde' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30x' | ' abcdef' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'a ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'ab ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abc ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcd ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcde ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30x' | 'abcdef ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' A' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' AB' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABC' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCD' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDE' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30X' | ' ABCDEF' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,69,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'A ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'AB ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABC ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCD ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDE ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30X' | 'ABCDEF ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,70,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------double--------------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1f' | ' 3.1' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2f' | ' 3.14' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3f' | ' 3.142' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4f' | ' 3.1416' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5f' | ' 3.14159' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6f' | ' 3.141593' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7f' | ' 3.1415927' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8f' | ' 3.14159265' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9f' | ' 3.141592654' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10f' | ' 3.1415926536' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1f' | '3.1 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2f' | '3.14 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3f' | '3.142 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4f' | '3.1416 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5f' | '3.14159 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6f' | '3.141593 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7f' | '3.1415927 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8f' | '3.14159265 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9f' | '3.141592654 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10f' | '3.1415926536 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------scientific----------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.1e' | ' 1.5e+00' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.2e' | ' 1.05e+01' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.3e' | ' 1.050e+01' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.4e' | ' 1.0050e+02' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.5e' | ' 1.00050e+03' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.6e' | ' 1.000050e+04' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.7e' | ' 1.0000500e+04' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.8e' | ' 1.00005000e+04' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.9e' | ' 1.000005000e+05' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%30.10e' | ' 1.0000005000e+06' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.1e' | '1.5e+00 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.2e' | '1.05e+01 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.3e' | '1.050e+01 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.4e' | '1.0050e+02 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.5e' | '1.00050e+03 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.6e' | '1.000050e+04 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.7e' | '1.0000500e+04 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.8e' | '1.00005000e+04 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.9e' | '1.000005000e+05 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30.10e' | '1.0000005000e+06 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-----------------------------------exotics-------------|",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhu' | '000000000000000000000000000255' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hu' | '000000000000000000000000065535' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lu' | '000000000018446744073709551615' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llu' | '000000000018446744073709551615' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hho' | '000000000000000000000000000377' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030ho' | '000000000000000000000000177777' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lo' | '000000001777777777777777777777' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llo' | '000000001777777777777777777777' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hhx' | '0000000000000000000000000000ff' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030hx' | '00000000000000000000000000ffff' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030lx' | '00000000000000ffffffffffffffff' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,75,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%030llx' | '00000000000000ffffffffffffffff' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hhu' | '255 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%-30hu' | '65535 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,71,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lu' | '18446744073709551615 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llu' | '18446744073709551615 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hho' | '0377 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,73,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30ho' | '0177777 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lo' | '01777777777777777777777 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llo' | '01777777777777777777777 ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hhx' | '0xff ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,73,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30hx' | '0xffff ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,72,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30lx' | '0xffffffffffffffff ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,76,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%#-30llx' | '0xffffffffffffffff ' |",STRING:PRINTF64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,77,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-------------------------------------------------------|",STRING:PRINTF64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"| '%*so%*s | ' o ' |",CATALOG:ID32P64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./othersource.c:71,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"|-------------------------------------------------------|",STRING:PRINTF64,DEBUG,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,90,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"00010203040506070809",RAW:Protocol1,MAX,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,,42,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"Short 32-Bit value (0x01234567)",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"Short 64-Bit value (0x0112233445566778)]",SHORT64,MAX,,0,,<--UNITTEST-HIDE_TS-->,,8,,collateral.xml +OK,"error with code 1",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"error with code 2",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"warning with code 1",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"warning with code 2",SHORT32,MAX,,0,,<--UNITTEST-HIDE_TS-->,,4,,collateral.xml +OK,"Hello world ",CATALOG:ID64P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:77,40,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"state=10 ",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:78,46,<--UNITTEST-HIDE_CRC-->,collateral.xml +OK,"state=10 ",CATALOG:ID32P64,INFO,example,1,<--UNITTEST-HIDE_TS-->,<--UNITTEST-HIDE_TS-->,./systclient.c:82,46,<--UNITTEST-HIDE_CRC-->,collateral.xml diff --git a/trademarks.txt b/trademarks.txt new file mode 100644 index 0000000..d64c1fa --- /dev/null +++ b/trademarks.txt @@ -0,0 +1,5 @@ +MIPI(R), SyS-T(SM) and STP(SM) are trademarks of MIPI Alliance, Inc. +No licenses are granted by implication, estoppel or otherwise under +any trademarks of MIPI Alliance, Inc. Other trademarks, and company, +product, and service names may be the trademarks or service marks of +their respective owners.