diff --git a/.clang-format b/.clang-format index 6c936b8da..a512b81a7 100644 --- a/.clang-format +++ b/.clang-format @@ -24,7 +24,8 @@ BraceWrapping: # Misc other options AccessModifierOffset: -2 AlignAfterOpenBracket: Align -AlignConsecutiveDeclarations: false +AlignConsecutiveDeclarations: true +BinPackParameters: false AlignOperands: true AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false @@ -35,7 +36,7 @@ AllowShortLoopsOnASingleLine: false BreakConstructorInitializers: BeforeComma ColumnLimit: 120 DerivePointerAlignment: false -PointerAlignment: Right +PointerAlignment: Left SortIncludes: false # Leave Doxygen directives alone diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..58b8a6b44 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,24 @@ +# EditorConfig file for ETC R&D Network Products dept. +# +# To learn more about EditorConfig, go to https://editorconfig.org +# +# To enforce the settings in this file, you may need to download a plugin for +# your editor of choice: https://editorconfig.org/#download +# +# Currently covers C, C++ and Python +# Revision 1: 2019-07-01 + +# This is the top-level EditorConfig file for this project. +root = true + +# Settings to apply to every file affected by this EditorConfig +# Sections lower than this override this section. +[*.{c,cpp,cxx,c++,cc,h,hh,hpp,inl,ipp,py}] +indent_style = space # Indent using spaces +indent_size = 2 # Each indentation level is 2 spaces +trim_trailing_whitespace = true # Trim trailing whitespace from each line +insert_final_newline = true # Add a final newline to each file if missing + +# Specific overrides for Python only +[*.py] +indent_size = 4 # For Python, use 4 space indentation per PEP-8 diff --git a/.gitignore b/.gitignore index 1e71357b0..c4840b700 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,7 @@ lib/ ####################### # CMake -build/ +build*/ # MSVC2015 and Qt *.VC.db diff --git a/CHANGELOG.md b/CHANGELOG.md index 41b7002d1..2d069ee70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,55 @@ # Changelog -All notable changes to the lwpa library will be documented in this file. +All notable changes to the EtcPal library will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - 2020-08-18 + +Note: This is a pre-release version. This version changelog is not exhaustive. + +### Added +- New port: Linux +- New port: macOS +- New port: iOS +- New port: FreeRTOS +- New port: lwIP +- etcpal_init() in etcpal/common.h. etcpal_init() must be called before using + features defined by feature macros defined in etcpal/common.h. +- Extra documentation page for network interface indexes. +- Addition of a C++ wrapper layer over EtcPal. Added wrapper classes for error, + inet, lock, log, queue, thread, timer and uuid. +- New module etcpal/queue for RTOS queues. FreeRTOS only for now. +- etcpal/lock: A counting semaphore API. +- etcpal/lock: Functions for posting signals and semaphores from an interrupt + context. +- etcpal/uuid: Functions to generate version 3 and version 5 UUIDs. +- etcpal/log: Legacy syslog creation added. Interface changed slightly to + support this. + +### Changed +- Naming: Library name changed from lwpa to EtcPal. All API names updated + accordingly. +- Naming: Separated the platform-specific sources into 'os' and 'net' targets + to aid in targeting mix-and-match stack environments like FreeRTOS and lwIP. +- Allow EtcPal to be built with no networking support. +- Improvements in mnemonic consistency across the public APIs, including + addition of meaningful return information, better function naming, etc. +- Modified etcpal_netint and etcpal_inet to make more meaningful use of network + interface indexes, for portability and compatibility with IPv6. +- etcpal/pdu -> etcpal/acn_pdu, etcpal/root_layer_pdu -> etcpal/acn_rlp. API + constructs have prefixes changed from `etcpal_` to `acn_` for clarity. + +### Removed +- etcpal/bool module. This module is not necessary given our target platform + and toolchain requirements. +- etcpal/int module. This module is not necessary given our target platform and + toolchain requirements. + ## [0.2.0] - 2019-05-29 + +Note: This is a pre-release version. This version changelog is not exhaustive. + ### Added - This CHANGELOG file. - lwpa_mempool: LWPA_MEMPOOL_DEFINE_ARRAY(), which allows a memory pool of @@ -33,9 +78,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Visual Studio project files, as we now build with CMake. ## [0.1.0] - 2018-10-18 + +Note: This is a pre-release version. This version changelog is not exhaustive. + ### Added - Initial library modules, tests and documentation. -[Unreleased]: https://github.com/ETCLabs/lwpa/compare/master...develop -[0.2.0]: https://github.com/ETCLabs/lwpa/compare/v0.1.0...v0.2.0 -[0.1.0]: https://github.com/ETCLabs/lwpa/releases/tag/v0.1.0 +[Unreleased]: https://github.com/ETCLabs/EtcPal/compare/stable...develop +[0.3.0]: https://github.com/ETCLabs/EtcPal/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/ETCLabs/EtcPal/compare/v0.1.0...v0.2.0 +[0.1.0]: https://github.com/ETCLabs/EtcPal/releases/tag/v0.1.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 4d303b992..4b23f480e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,13 +2,26 @@ cmake_minimum_required(VERSION 3.3) ########################## Global Project Attributes ########################## -project(lwpa VERSION 0.2.0) +project(EtcPal VERSION 0.3.0) -if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) +# Sometimes the seems to be some weirdness with drive letter capitalization on Windows, so do a +# case-insensitive comparision +if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL Windows) + string(TOLOWER ${PROJECT_SOURCE_DIR} PROJECT_SOURCE_DIR_LC) + string(TOLOWER ${CMAKE_SOURCE_DIR} CMAKE_SOURCE_DIR_LC) +else() + set(PROJECT_SOURCE_DIR_LC ${PROJECT_SOURCE_DIR}) + set(CMAKE_SOURCE_DIR_LC ${CMAKE_SOURCE_DIR}) +endif() + +# Set options based on whether this project is being built on its own, or added as a dependency to +# another project via add_subdirectory(). In the latter case, we don't override any global compile +# options, or build tests or examples by default. +if(PROJECT_SOURCE_DIR_LC STREQUAL CMAKE_SOURCE_DIR_LC) if (MSVC) - add_compile_options(/W4) + add_compile_options(/W4 /permissive-) elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - add_compile_options(-Wall -Wconversion) + add_compile_options(-Wall) if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") add_compile_options(-Wno-sign-conversion) else() @@ -16,28 +29,59 @@ if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) endif() endif() - list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/tools/cmake) + # Allow folder grouping in generated IDE projects + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + + # Add a target to run Clang Format + file(GLOB_RECURSE FILES_TO_REFORMAT + examples/*.c + examples/*.cpp + examples/*.h + include/*.h + src/*.c + src/*.cpp + src/*.h + tests/*.c + tests/*.cpp + tests/*.h + ) + add_custom_target(reformat_all COMMAND clang-format -i ${FILES_TO_REFORMAT}) + set_target_properties(reformat_all PROPERTIES FOLDER tools) + + set(OPTION_DEFAULTS ON) +else() + set(OPTION_DEFAULTS OFF) endif() -option(LWPA_BUILD_MOCK_LIB "Build the lwpa_mock library" OFF) -if(LWPA_BUILD_MOCK_LIB) +set(ETCPAL_ROOT ${CMAKE_CURRENT_LIST_DIR}) + +option(ETCPAL_BUILD_MOCK_LIB "Build the EtcPalMock library" OFF) +option(ETCPAL_BUILD_TESTS "Build the EtcPal unit tests" OFF) +option(ETCPAL_BUILD_EXAMPLES "Build the EtcPal example apps" OFF) + +option(ETCPAL_EXPLICITLY_DISABLE_EXCEPTIONS "Disable throwing of exceptions throughout the EtcPal C++ headers" OFF) + +# Platform support +include(${PROJECT_SOURCE_DIR}/cmake/etcpal-os.cmake) + +if(ETCPAL_BUILD_MOCK_LIB OR ETCPAL_BUILD_TESTS) add_subdirectory(external/fff) endif() -# Main library +################################# Main library ################################ add_subdirectory(src) -if(PROJECT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(OPTION_DEFAULTS ON) -else() - set(OPTION_DEFAULTS OFF) -endif() - -# Tests +#################################### Tests #################################### -option(LWPA_BUILD_TESTS "Build the lwpa unit tests" ${OPTION_DEFAULTS}) -if(LWPA_BUILD_TESTS) +if(ETCPAL_BUILD_TESTS) + add_subdirectory(external/unity) enable_testing() add_subdirectory(tests) endif() + +################################## Examples ################################### + +if(ETCPAL_BUILD_EXAMPLES) + add_subdirectory(examples) +endif() diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b392d9167..92a7e5809 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,21 +1,52 @@ -# Contributing to lwpa +# Contributing to EtcPal -Thank you for your interest in contributing to the lwpa project! +Thank you for your interest in contributing to the EtcPal project! ## Pull requests -The lwpa library is currently in very early development. In order to keep -things as stable as possible, we are not accepting pull requests at this time. +Thanks for your interest in contributing code to the EtcPal library! + +### Building and Debugging the Library + +Check out the relevant [docs page](https://etclabs.github.io/EtcPal/docs/head/building_etcpal.html) +for how to build EtcPal. + +When configuring with CMake, you will want to define `ETCPAL_BUILD_TESTS=ON` so that you can check +that the unit tests pass as you modify the EtcPal library. This adds a few unit test executable +targets to the build; you can run them all at once using CTest by just typing `ctest` in the build +directory (or `ctest -C [configuration]` for a multi-config CMake generator). + +The EtcPal example applications can help provide immediate debugging feedback for changes made to +the library. Enable them by configuring with `ETCPAL_BUILD_EXAMPLES=ON`. + +### Adding New Features + +EtcPal has a strictly-controlled scope in order to keep it lightweight and prevent it from becoming +a monolithic catch-all. If your pull request adds a new feature or module to EtcPal, know that it +might not be accepted for this reason. + +If you are adding a platform-abstraction feature, it is unlikely to be accepted unless it is ported +for all platforms that EtcPal supports. For feature requests, it might be better to +[open an issue](https://github.com/ETCLabs/EtcPal/issues) so that the feature can be discussed by +EtcPal maintainers before developing it. + +### Before Opening a Pull Request + +* Make sure the unit tests pass +* If possible, test on multiple platforms +* Add unit tests if applicable for any regressions or new features you have added to the library + + (This is not necessary if just modifying the example apps as they do not have test coverage) +* Format the code you've touched using clang-format (CMake creates a convenient target `reformat_all` + which runs clang-format on all of the EtcPal sources if it is available on your PATH) ## Reporting issues ### Check to make sure your issue isn't already known -If you have identified a reproducible bug or missing feature, please do the -following before opening an issue: +If you have identified a reproducible bug or missing feature, please do the following before +opening an issue: -* Make sure the bug or feature is not covered as a known issue in the README or - documentation. +* Make sure the bug or feature is not covered as a known issue in the README or documentation. * Make sure the bug or feature is not covered in an existing open issue. ### Write a comprehensive bug report @@ -25,6 +56,6 @@ A good bug report includes the following: * Which library code module(s) you were using and the library's version * A set of steps to reproduce the issue, in order * What you expected to see, and what happened instead -* If the bug has occured in code you wrote that uses the lwpa library, please - provide code snippets and try to reduce to a minimal reproducible example. -* Any logging output that was produced when the issue occurred \ No newline at end of file +* If the bug has occured in code you wrote that uses the EtcPal library, please provide code + snippets and try to reduce to a minimal reproducible example. +* Any logging output that was produced when the issue occurred diff --git a/README.md b/README.md index 392f95b99..723b3ac29 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,69 @@ -# LightWeight Platform Abstraction +# EtcPal: ETC Platform Abstraction Layer -[![Build Status](https://dev.azure.com/ETCLabs/lwpa/_apis/build/status/ETCLabs.lwpa?branchName=develop)](https://dev.azure.com/ETCLabs/lwpa/_build/latest?definitionId=1&branchName=develop) +| Test Platform | Build & Test Status | +|---------------|:-------------------:| +| FreeRTOS+lwIP | [![Build & Test Status][freertos-lwip-build-badge]][azure-devops-link] | +| iOS | [![Build Status][ios-build-badge]][azure-devops-link] | +| Linux | [![Build & Test Status][linux-build-badge]][azure-devops-link] | +| macOS | [![Build & Test Status][macos-build-badge]][azure-devops-link] | +| MQX | [![Build & Test Status][mqx-build-badge]][azure-devops-link] | +| Windows | [![Build & Test Status][win-build-badge]][azure-devops-link] | -This repository contains the LightWeight Platform Abstraction (lwpa) library, -which supports other open-source libraries by [ETC](http://www.etcconnect.com). +[freertos-lwip-build-badge]: https://dev.azure.com/ETCLabs/EtcPal/_apis/build/status/ETCLabs.EtcPal?branchName=develop&stageName=Build%20and%20Test%20EtcPal&jobName=FreeRTOS%2FlwIP +[ios-build-badge]: https://dev.azure.com/ETCLabs/EtcPal/_apis/build/status/ETCLabs.EtcPal?branchName=develop&stageName=Build%20and%20Test%20EtcPal&jobName=iOS +[linux-build-badge]: https://dev.azure.com/ETCLabs/EtcPal/_apis/build/status/ETCLabs.EtcPal?branchName=develop&stageName=Build%20and%20Test%20EtcPal&jobName=Linux +[macos-build-badge]: https://dev.azure.com/ETCLabs/EtcPal/_apis/build/status/ETCLabs.EtcPal?branchName=develop&stageName=Build%20and%20Test%20EtcPal&jobName=macOS +[mqx-build-badge]: https://dev.azure.com/ETCLabs/EtcPal/_apis/build/status/ETCLabs.EtcPal?branchName=develop&stageName=Build%20and%20Test%20EtcPal&jobName=MQX +[win-build-badge]: https://dev.azure.com/ETCLabs/EtcPal/_apis/build/status/ETCLabs.EtcPal?branchName=develop&stageName=Build%20and%20Test%20EtcPal&jobName=Windows +[azure-devops-link]: https://dev.azure.com/ETCLabs/EtcPal/_build/latest?definitionId=4&branchName=develop -The lwpa library serves two main purposes: -* Provides a platform-neutral interface for common system calls, in order to - simplify the writing of platform-neutral software libraries. -* Provides a common location for utilities that are used by multiple other - software libraries. +This repository contains ETC's Platform Abstraction Layer (PAL), which supports other open-source +libraries by [ETC](http://www.etcconnect.com). + +ETC develops many software products which target a range of platforms from full desktop OS down to +32-bit microcontrollers. Because of this, there is a need for ETC's software libraries to be highly +portable. The EtcPal library serves this purpose in two main ways: + +* Provides a platform-neutral interface for common system calls, in order to simplify the writing + of platform-neutral software libraries. +* Provides a common location for utilities that are used by multiple other software libraries. + +## Docs + +EtcPal's API documentation is located [here](https://etclabs.github.io/EtcPal/docs/head). The +"modules" entry on the sidebar provides module-by-module documentation. ## Platform Ports -lwpa is currently ported for the following platforms: +EtcPal is currently ported for the following platforms: ++ FreeRTOS (OS abstraction only) ++ Linux ++ lwIP (Network abstraction only) ++ macOS + Microsoft Windows -+ MQX RTOS ++ MQX + +EtcPal is also buildable in no-OS (bare-metal) environments, with its platform-neutral utility +functionality still available. ## Building -lwpa is typically included as a dependency by other software libraries. -However, if you would like to build lwpa on its own as a static lib, there are -instructions in the [documentation](https://etclabs.github.io/lwpa). +EtcPal is typically included as a dependency by other software libraries. However, if you would +like to build EtcPal on its own, there are instructions in the +[documentation](https://etclabs.github.io/EtcPal). + +## License + +EtcPal is licensed under the Apache License 2.0. EtcPal also incorporates some third-party software +with different license terms, disclosed in ThirdPartySoftware.txt in the directory containing this +README file. ## About this ETCLabs Project -lwpa is official, open-source software developed by ETC employees and is -designed to interact with ETC products. For challenges using, integrating, -compiling, or modifying this software, we encourage posting on the -[issues page](https://github.com/ETCLabs/lwpa/issues) of this project. +EtcPal is official, open-source software developed by ETC employees and is designed to interact +with ETC products. For challenges using, integrating, compiling, or modifying this software, we +encourage posting on the [issues page](https://github.com/ETCLabs/EtcPal/issues) of this project. Before posting an issue or opening a pull request, please read the [contribution guidelines](./CONTRIBUTING.md). diff --git a/ThirdPartySoftware.txt b/ThirdPartySoftware.txt index db58f6a33..1af08fdb7 100644 --- a/ThirdPartySoftware.txt +++ b/ThirdPartySoftware.txt @@ -1,6 +1,6 @@ Third-Party Software -lwpa incorporates components of the following third-party software, under the +EtcPal incorporates components of the following third-party software, under the respective terms of the license of each third-party software component. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -11,8 +11,8 @@ Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. The following sources in this repository are derived from the RSA Data Security, Inc. MD5 Message-Digest algorithm: -src/md5.h -src/md5c.c +src/etcpal/md5.h +src/etcpal/md5.c See the license information at the top of those source files for more details. @@ -24,7 +24,28 @@ Public domain, under the Unlicense (http://unlicense.org) The following sources in this repository are based on sources obtained from mirek/rb_tree: -include/lwpa/rbtree.h -src/lwpa_rbtree.c +include/etcpal/rbtree.h +src/etcpal/rbtree.c -See the license information at the top of those source files for more details. \ No newline at end of file +See the license information at the top of those source files for more details. + +NOTE: This software uses the Unlicense - the author is credited here as a +courtesy, but software which includes EtcPal does not need to provide +attribution for mirek/rb_tree if not desired. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +clibs/sha1 (https://github.com/clibs/sha1) +By Steve Reid , released to the public domain +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The following sources in this repository are based on sources obtained from +clibs/sha1: + +src/etcpal/sha1.h +src/etcpal/sha1.c + +See the license information at the top of those source files for more details. + +NOTE: This software states that it is released to the public domain - the +author is credited here as a courtesy, but software which includes EtcPal does +not need to provide attribution for clibs/sha1 if not desired. diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bb4d7c265..d3e7a284c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -1,55 +1,305 @@ -# The lwpa build and test pipeline. +# The EtcPal build and test pipeline. trigger: -- develop -- master -- release/* + - develop + - stable + - release/* + - refs/tags/v*.*.*.* pr: -- develop - -jobs: -# Build and test lwpa on Windows using CMake and Visual Studio 2017. -- job: windows_build - displayName: 'Windows Build and Test' - pool: - vmImage: 'vs2017-win2016' - strategy: - matrix: - Debug: - LWPA_BUILD_CONFIG: 'Debug' - Release: - LWPA_BUILD_CONFIG: 'Release' - steps: - - script: | - mkdir build - cd build - cmake --version - cmake -G "Visual Studio 15 2017 Win64" -DLWPA_BUILD_MOCK_LIB=ON .. - cmake --build . --config %LWPA_BUILD_CONFIG% - displayName: 'lwpa Windows build' - - script: build\tests\%LWPA_BUILD_CONFIG%\test_lwpa.exe - displayName: 'lwpa Windows test' -# Generate documentation with doxygen. Documentation is generated from the -# develop branch and posted to the 'head' portion of the Github page -# (etclabs.github.io/lwpa) -- job: docs - displayName: 'Deploy documentation' - condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop')) - pool: - vmImage: 'ubuntu-16.04' - variables: - - group: github-push-access - steps: - - script: sudo apt-get install doxygen - displayName: 'Install dependencies' - - script: | - cd tools/ci - chmod +x publish_docs.sh - ./publish_docs.sh - displayName: 'Generate and deploy documentation' - env: - GH_REPO_NAME: lwpa - GH_REPO_REF: github.com/ETCLabs/lwpa.git - GH_REPO_TOKEN: $(GH_ACCESS_TOKEN) - \ No newline at end of file + - develop + - review-base/* + +variables: + cmake_definitions: -DETCPAL_BUILD_MOCK_LIB=ON -DETCPAL_BUILD_TESTS=ON -DETCPAL_BUILD_EXAMPLES=ON -DETCPAL_BUILDING_FOR_AZURE_PIPELINES_CI=1 + +stages: + - stage: build_and_test + displayName: "Build and Test EtcPal" + jobs: + # Build and test EtcPal on Windows using CMake and Visual Studio 2019. + - job: windows_build + displayName: "Windows" + pool: + vmImage: "windows-2019" + variables: + cmake_generator: "Visual Studio 16 2019" + steps: + - script: | + mkdir build + cd build + cmake --version + cmake -G "$(cmake_generator)" -A x64 $(cmake_definitions) .. + displayName: "Configure Project" + - task: VSBuild@1 + displayName: "Build Project" + inputs: + solution: $(Build.SourcesDirectory)\build\EtcPal.sln + configuration: Release + - task: UsePythonVersion@0 + displayName: "Select Python Version" + inputs: + versionSpec: "3.x" + addToPath: true + - script: | + python -m pip install unity-test-parser + python tools\ci\run_tests.py build --config Release + displayName: "Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)/build" + mergeTestResults: true + testRunTitle: "Windows x64" + + # Build and test EtcPal on native macOS using CMake and Xcode/clang + - job: macos_build + displayName: "macOS" + pool: + vmImage: "macos-latest" + steps: + - script: | + mkdir build + cd build + cmake --version + cmake $(cmake_definitions) .. + cmake --build . + displayName: "Configure and Build Project" + - task: UsePythonVersion@0 + displayName: "Select Python Version" + inputs: + versionSpec: "3.x" + addToPath: true + - script: | + python -m pip install unity-test-parser + python tools/ci/run_tests.py build + displayName: "Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)/build" + mergeTestResults: true + testRunTitle: "macOS" + + # Build and test EtcPal for iOS using CMake and Xcode/clang + - job: ios_build + displayName: "iOS" + pool: + vmImage: "macos-latest" + steps: + - script: | + mkdir build + cd build + cmake --version + cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/cross-toolchains/ios.toolchain.cmake $(cmake_definitions) .. + cmake --build . + displayName: "Configure and Build Project" + + # Build and test EtcPal on Linux using CMake and gcc + - job: linux_build + displayName: "Linux" + pool: + # TODO change to ubuntu-latest when this issue is fixed: + # https://github.com/microsoft/azure-pipelines-image-generation/issues/1379 + vmImage: "ubuntu-18.04" + variables: + cmake_definitions_linux: -DCMAKE_C_FLAGS="-fsanitize=address" -DCMAKE_CXX_FLAGS="-fsanitize=address" -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address" + steps: + - script: | + sudo apt-get update + sudo apt-get install uuid-dev + mkdir build + cd build + cmake --version + cmake -G "Unix Makefiles" $(cmake_definitions) $(cmake_definitions_linux) .. + cmake --build . + displayName: "Configure and Build Project" + - task: UsePythonVersion@0 + displayName: "Select Python Version" + inputs: + versionSpec: "3.x" + addToPath: true + - script: | + python -m pip install unity-test-parser + python tools/ci/run_tests.py build + displayName: "Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)/build" + mergeTestResults: true + testRunTitle: "Linux" + + # Build and test EtcPal on Linux with exceptions disabled + - job: linux_build_no_exceptions + displayName: "Linux (Exceptions Disabled)" + pool: + # TODO change to ubuntu-latest when this issue is fixed: + # https://github.com/microsoft/azure-pipelines-image-generation/issues/1379 + vmImage: "ubuntu-18.04" + variables: + cmake_definitions_linux: -DCMAKE_C_FLAGS="-fsanitize=address" -DCMAKE_CXX_FLAGS="-fno-exceptions -fsanitize=address" -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address" + steps: + - script: | + sudo apt-get update + sudo apt-get install uuid-dev + mkdir build + cd build + cmake --version + cmake -G "Unix Makefiles" $(cmake_definitions) $(cmake_definitions_linux) .. + cmake --build . + displayName: "Configure and Build Project" + - task: UsePythonVersion@0 + displayName: "Select Python Version" + inputs: + versionSpec: "3.x" + addToPath: true + - script: | + python -m pip install unity-test-parser + python tools/ci/run_tests.py build + displayName: "Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)/build" + mergeTestResults: true + testRunTitle: "Linux (Exceptions Disabled)" + + # Build and test EtcPal with OS and network support disabled + # This is currently done on Linux but with the OS and network targets set to none. + - job: bare_metal_build + displayName: "Bare Metal" + pool: + # TODO change to ubuntu-latest when this issue is fixed: + # https://github.com/microsoft/azure-pipelines-image-generation/issues/1379 + vmImage: "ubuntu-18.04" + variables: + cmake_definitions_bare_metal: -DETCPAL_BUILD_TESTS=ON -DCMAKE_C_FLAGS="-fsanitize=address" -DCMAKE_CXX_FLAGS="-fsanitize=address" -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address" -DETCPAL_OS_TARGET="none" -DETCPAL_NET_TARGET="none" + steps: + - script: | + mkdir build + cd build + cmake --version + cmake -G "Unix Makefiles" $(cmake_definitions_bare_metal) .. + cmake --build . + displayName: "Configure and Build Project" + - task: UsePythonVersion@0 + displayName: "Select Python Version" + inputs: + versionSpec: "3.x" + addToPath: true + - script: | + python -m pip install unity-test-parser + python tools/ci/run_tests.py build + displayName: "Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)/build" + mergeTestResults: true + testRunTitle: "Bare Metal" + + # Build and test EtcPal against FreeRTOS, lwIP for ARM Cortex-M4 using arm-gcc + - job: freertos_lwip_build + displayName: "FreeRTOS/lwIP" + pool: + name: OnTargetTesting + demands: freertos_lwip_k65 + steps: + - script: | + python $(Agent.HomeDirectory)\build_and_test_freertos_lwip_k65.py etcpal $(Build.SourcesDirectory) + displayName: "Build Project and Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)" + mergeTestResults: true + testRunTitle: "FreeRTOS_lwIP" + + # Build and test EtcPal against MQX for ARM Cortex-M4 using IAR + - job: mqx + displayName: "MQX" + pool: + name: OnTargetTesting + demands: mqx_k61 + steps: + - script: | + python $(Agent.HomeDirectory)\build_and_test_mqx_k61.py etcpal $(Build.SourcesDirectory) + displayName: "Build Project and Run Tests" + - task: PublishTestResults@2 + displayName: "Publish Test Results" + condition: always() + inputs: + testResultsFormat: "JUnit" + testResultsFiles: "test_results_*.xml" + searchFolder: "$(Build.SourcesDirectory)" + mergeTestResults: true + testRunTitle: "MQX" + + # Generate documentation with doxygen. Documentation is generated from the + # develop branch and posted to the 'head' portion of the Github page + # (etclabs.github.io/EtcPal) + - job: docs + displayName: "Deploy Documentation" + condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/develop'), startsWith(variables['Build.SourceBranch'], 'refs/pull')) + pool: + # TODO change to ubuntu-latest when this issue is fixed: + # https://github.com/microsoft/azure-pipelines-image-generation/issues/1379 + vmImage: "ubuntu-18.04" + steps: + - script: sudo apt-get install doxygen + displayName: "Install Doxygen" + - task: UsePythonVersion@0 + inputs: + versionSpec: "3.x" + addToPath: true + - task: ShellScript@2 + inputs: + scriptPath: "tools/ci/publish_docs.sh" + failOnStandardError: false + displayName: "Generate and Push Documentation" + env: + GH_REPO_NAME: EtcPal + GH_REPO_REF: github.com/ETCLabs/EtcPal.git + GH_REPO_TOKEN: svc-etclabs:$(svc_etclabs_password) + + - stage: deploy + displayName: "Deploy Build Artifacts" + condition: and(succeeded('build_and_test'), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + jobs: + - job: create_build_report + displayName: "Create Jira Build Report" + pool: + vmImage: "ubuntu-latest" + variables: + - group: etc_jira + steps: + - task: UsePythonVersion@0 + displayName: "Select Python Version" + inputs: + versionSpec: "3.x" + addToPath: true + - script: | + python -m pip install requests + python tools/ci/create_build_report.py + displayName: "Run Create Build Report Script" + env: + BUILDNETWORKING_PASSWORD: $(buildnetworking_password) diff --git a/cmake/EtcPal.pc.in b/cmake/EtcPal.pc.in new file mode 100644 index 000000000..ef6aef48e --- /dev/null +++ b/cmake/EtcPal.pc.in @@ -0,0 +1,11 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +includedir=${prefix}/include +libdir=${exec_prefix}/lib + +Name: @PROJECT_NAME@ +Description: ETC's Platform Abstraction Layer +Version: @PROJECT_VERSION@ +URL: https://github.com/ETCLabs/EtcPal +Cflags: -I${includedir} +Libs: -L${libdir} -l@ETCPAL_LIB_TARGET_NAME@ diff --git a/cmake/cross-toolchains/codewarrior-k61-mqx.cmake b/cmake/cross-toolchains/codewarrior-k61-mqx.cmake new file mode 100644 index 000000000..56b4aefb9 --- /dev/null +++ b/cmake/cross-toolchains/codewarrior-k61-mqx.cmake @@ -0,0 +1,46 @@ +# An example CMake toolchain file for cross-compiling using the CodeWarrior 10.6 gcc toolchain. +# +# You need to pick the type of build files that CMake generates (the Generator). CodeWarrior 10.6 +# comes with a GNU Make utility, so it's convenient to use the "Unix Makefiles" generator in most +# cases; a line below tells CMake where to find CodeWarrior's make utility. +# +# Usage: cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=[path/to/this/file] [path/to/sources] + +set(CMAKE_SYSTEM_NAME Generic) # This is CMake's name for 'bare-metal' or RTOS environments +set(CMAKE_SYSTEM_PROCESSOR arm) + +if(NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL Windows) + message(FATAL_ERROR "CodeWarrior is Windows-only.") +endif() + +# The CodeWarrior installation directory, highly likely to require customization +set(CODEWARRIOR_INSTALL_DIR "C:/Freescale/CW MCU v10.6" CACHE STRING "The CodeWarrior install directory") + +set(TOOLS_DIR ${CODEWARRIOR_INSTALL_DIR}/Cross_Tools/arm-none-eabi-gcc-4_7_3) +set(CMAKE_C_COMPILER ${TOOLS_DIR}/bin/arm-none-eabi-gcc.exe CACHE FILEPATH "CodeWarrior/gcc C Compiler") +set(CMAKE_CXX_COMPILER ${TOOLS_DIR}/bin/arm-none-eabi-g++.exe CACHE FILEPATH "CodeWarrior/gcc C++ Compiler") +set(CMAKE_MAKE_PROGRAM ${CODEWARRIOR_INSTALL_DIR}/gnu/bin CACHE FILEPATH "CodeWarrior Make utility") + +# This tells CMake to use a static library program to do its minimal compiler +# test instead of an executable - this translates well to embedded toolchains. +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +# If that doesn't work, you might need to comment the line above and uncomment +# this line to bypass the compiler checks. +# set(CMAKE_C_COMPILER_WORKS 1) +# set(CMAKE_CXX_COMPILER_WORKS 1) + +# These are global compile definitions and compile options that will be applied to every build step +# when building the libraries. It's highly recommended that you make these match your project's +# build settings as closely as possible. My preferred approach to this is to just grab a line of +# build output and add all the flags I see to these lines. Here are some examples from a project +# that builds for a NXP Kinetis K61 processor using MQX. +add_compile_definitions(_EWL_C99 _DEBUG) +add_compile_options( + -nostdinc + -ffunction-sections + -fdata-sections + -fno-strict-aliasing + -fmessage-length=0 + -specs=ewl_c9x.specs +) diff --git a/cmake/cross-toolchains/iar-k65-freertos-lwip.cmake b/cmake/cross-toolchains/iar-k65-freertos-lwip.cmake new file mode 100644 index 000000000..a7830efb3 --- /dev/null +++ b/cmake/cross-toolchains/iar-k65-freertos-lwip.cmake @@ -0,0 +1,51 @@ +# An example CMake toolchain file for cross-compiling using the IAR Embedded Workbench toolchain. +# +# You need to pick the type of build files that CMake generates (the Generator). Unfortunately, +# CMake does not know how to use IAR's build system, so you need an alternative. Some options are: +# +# - MinGW64 (must be available on PATH, use 'Unix Makefiles' generator) +# - Strawberry Perl (use 'Unix Makefiles' generator) +# - Ninja (must be available on PATH, use 'Ninja' generator) +# +# Usage: cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=path/to/this/file .. + +set(CMAKE_SYSTEM_NAME Generic) # This is CMake's name for 'bare-metal' or RTOS environments +set(CMAKE_SYSTEM_PROCESSOR arm) + +if(NOT ${CMAKE_HOST_SYSTEM_NAME} STREQUAL Windows) + message(FATAL_ERROR "IAR is Windows-only.") +endif() + +# The IAR installation directory, highly likely to require customization +set(IAR_INSTALL_DIR "C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0" CACHE STRING "The IAR install directory") + +set(CMAKE_C_COMPILER ${IAR_INSTALL_DIR}/arm/bin/iccarm.exe CACHE FILEPATH "IAR C Compiler") +set(CMAKE_CXX_COMPILER ${IAR_INSTALL_DIR}/arm/bin/iccarm.exe CACHE FILEPATH "IAR C++ Compiler") + +# This tells CMake to use a static library program to do its minimal compiler +# test instead of an executable - this translates well to embedded toolchains. +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +# If that doesn't work, you might need to comment the line above and uncomment +# this line to bypass the compiler checks. +# set(CMAKE_C_COMPILER_WORKS 1) +# set(CMAKE_CXX_COMPILER_WORKS 1) + +# These are global compile definitions and compile options that will be applied to every build step +# when building the libraries. It's highly recommended that you make these match your project's +# build settings as closely as possible. My preferred approach to this is to just grab a line of +# build output and add all the flags I see to these lines. Here are some examples from a project +# that builds for a NXP Kinetis K65 processor using FreeRTOS and lwIP. +add_compile_definitions( + CPU_MK65FN2M0VMI18 + CPU_MK65FN2M0VMI18_cm4 + SDK_DEBUGCONSOLE=1 + CR_INTEGER_PRINTF + PRINTF_FLOAT_ENABLE=0 + FSL_RTOS_FREE_RTOS + SDK_RTOS_FREE_RTOS + USE_RTOS +) +# IAR doesn't like the command-line format that CMake spits out for add_compile_options() so you +# must do it this way instead. +set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} "--endian=little --cpu=Cortex-M4 --fpu=VFPv4_sp --dlib_config normal") diff --git a/cmake/cross-toolchains/ios.toolchain.cmake b/cmake/cross-toolchains/ios.toolchain.cmake new file mode 100644 index 000000000..0e01fe1ee --- /dev/null +++ b/cmake/cross-toolchains/ios.toolchain.cmake @@ -0,0 +1,672 @@ +# This file is part of the ios-cmake project. It was retrieved from +# https://github.com/cristeab/ios-cmake.git, which is a fork of +# https://code.google.com/p/ios-cmake/. Which in turn is based off of +# the Platform/Darwin.cmake and Platform/UnixPaths.cmake files which +# are included with CMake 2.8.4 +# +# The ios-cmake project is licensed under the new BSD license. +# +# Copyright (c) 2014, Bogdan Cristea and LTE Engineering Software, +# Kitware, Inc., Insight Software Consortium. All rights reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. 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. +# +# 3. 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 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# This file is based off of the Platform/Darwin.cmake and +# Platform/UnixPaths.cmake files which are included with CMake 2.8.4 +# It has been altered for iOS development. +# +# Updated by Alex Stewart (alexs.mac@gmail.com) +# +# ***************************************************************************** +# Now maintained by Alexander Widerberg (widerbergaren [at] gmail.com) +# under the BSD-3-Clause license +# https://github.com/leetal/ios-cmake +# ***************************************************************************** +# +# INFORMATION / HELP +# +# The following arguments control the behaviour of this toolchain: +# +# PLATFORM: (default "OS") +# OS = Build for iPhoneOS. +# OS64 = Build for arm64 iphoneOS. +# OS64COMBINED = Build for arm64 x86_64 iphoneOS. Combined into FAT STATIC lib (supported on 3.14+ of CMakewith "-G Xcode" argument ONLY) +# SIMULATOR = Build for x86 i386 iphoneOS Simulator. +# SIMULATOR64 = Build for x86_64 iphoneOS Simulator. +# TVOS = Build for arm64 tvOS. +# TVOSCOMBINED = Build for arm64 x86_64 tvOS. Combined into FAT STATIC lib (supported on 3.14+ of CMake with "-G Xcode" argument ONLY) +# SIMULATOR_TVOS = Build for x86_64 tvOS Simulator. +# WATCHOS = Build for armv7k arm64_32 for watchOS. +# WATCHOSCOMBINED = Build for armv7k arm64_32 x86_64 watchOS. Combined into FAT STATIC lib (supported on 3.14+ of CMake with "-G Xcode" argument ONLY) +# SIMULATOR_WATCHOS = Build for x86_64 for watchOS Simulator. +# +# CMAKE_OSX_SYSROOT: Path to the SDK to use. By default this is +# automatically determined from PLATFORM and xcodebuild, but +# can also be manually specified (although this should not be required). +# +# CMAKE_DEVELOPER_ROOT: Path to the Developer directory for the platform +# being compiled for. By default this is automatically determined from +# CMAKE_OSX_SYSROOT, but can also be manually specified (although this should +# not be required). +# +# DEPLOYMENT_TARGET: Minimum SDK version to target. Default 2.0 on watchOS and 9.0 on tvOS+iOS +# +# ENABLE_BITCODE: (1|0) Enables or disables bitcode support. Default 1 (true) +# +# ENABLE_ARC: (1|0) Enables or disables ARC support. Default 1 (true, ARC enabled by default) +# +# ENABLE_VISIBILITY: (1|0) Enables or disables symbol visibility support. Default 0 (false, visibility hidden by default) +# +# ENABLE_STRICT_TRY_COMPILE: (1|0) Enables or disables strict try_compile() on all Check* directives (will run linker +# to actually check if linking is possible). Default 0 (false, will set CMAKE_TRY_COMPILE_TARGET_TYPE to STATIC_LIBRARY) +# +# ARCHS: (armv7 armv7s armv7k arm64 arm64_32 i386 x86_64) If specified, will override the default architectures for the given PLATFORM +# OS = armv7 armv7s arm64 (if applicable) +# OS64 = arm64 (if applicable) +# SIMULATOR = i386 +# SIMULATOR64 = x86_64 +# TVOS = arm64 +# SIMULATOR_TVOS = x86_64 (i386 has since long been deprecated) +# WATCHOS = armv7k arm64_32 (if applicable) +# SIMULATOR_WATCHOS = x86_64 (i386 has since long been deprecated) +# +# This toolchain defines the following variables for use externally: +# +# XCODE_VERSION: Version number (not including Build version) of Xcode detected. +# SDK_VERSION: Version of SDK being used. +# CMAKE_OSX_ARCHITECTURES: Architectures being compiled for (generated from PLATFORM). +# +# This toolchain defines the following macros for use externally: +# +# set_xcode_property (TARGET XCODE_PROPERTY XCODE_VALUE XCODE_VARIANT) +# A convenience macro for setting xcode specific properties on targets. +# Available variants are: All, Release, RelWithDebInfo, Debug, MinSizeRel +# example: set_xcode_property (myioslib IPHONEOS_DEPLOYMENT_TARGET "3.1" "all"). +# +# find_host_package (PROGRAM ARGS) +# A macro used to find executable programs on the host system, not within the +# environment. Thanks to the android-cmake project for providing the +# command. +# +# ******************************** DEPRECATIONS ******************************* +# +# IOS_DEPLOYMENT_TARGET: (Deprecated) Alias to DEPLOYMENT_TARGET +# CMAKE_IOS_DEVELOPER_ROOT: (Deprecated) Alias to CMAKE_DEVELOPER_ROOT +# IOS_PLATFORM: (Deprecated) Alias to PLATFORM +# IOS_ARCH: (Deprecated) Alias to ARCHS +# +# ***************************************************************************** +# + +# Fix for PThread library not in path +set(CMAKE_THREAD_LIBS_INIT "-lpthread") +set(CMAKE_HAVE_THREADS_LIBRARY 1) +set(CMAKE_USE_WIN32_THREADS_INIT 0) +set(CMAKE_USE_PTHREADS_INIT 1) + +# Cache what generator is used +set(USED_CMAKE_GENERATOR "${CMAKE_GENERATOR}" CACHE STRING "Expose CMAKE_GENERATOR" FORCE) + +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.14") + set(MODERN_CMAKE YES) + message(STATUS "Merging integrated CMake 3.14+ iOS,tvOS,watchOS,macOS toolchain(s) with this toolchain!") +endif() + +# Get the Xcode version being used. +execute_process(COMMAND xcodebuild -version + OUTPUT_VARIABLE XCODE_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +string(REGEX MATCH "Xcode [0-9\\.]+" XCODE_VERSION "${XCODE_VERSION}") +string(REGEX REPLACE "Xcode ([0-9\\.]+)" "\\1" XCODE_VERSION "${XCODE_VERSION}") +message(STATUS "Building with Xcode version: ${XCODE_VERSION}") + +######## ALIASES (DEPRECATION WARNINGS) + +if(DEFINED IOS_PLATFORM) + set(PLATFORM ${IOS_PLATFORM}) + message(DEPRECATION "IOS_PLATFORM argument is DEPRECATED. Consider using the new PLATFORM argument instead.") +endif() + +if(DEFINED IOS_DEPLOYMENT_TARGET) + set(DEPLOYMENT_TARGET ${IOS_DEPLOYMENT_TARGET}) + message(DEPRECATION "IOS_DEPLOYMENT_TARGET argument is DEPRECATED. Consider using the new DEPLOYMENT_TARGET argument instead.") +endif() + +if(DEFINED CMAKE_IOS_DEVELOPER_ROOT) + set(CMAKE_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT}) + message(DEPRECATION "CMAKE_IOS_DEVELOPER_ROOT argument is DEPRECATED. Consider using the new CMAKE_DEVELOPER_ROOT argument instead.") +endif() + +if(DEFINED IOS_ARCH) + set(ARCHS ${IOS_ARCH}) + message(DEPRECATION "IOS_ARCH argument is DEPRECATED. Consider using the new ARCHS argument instead.") +endif() + +######## END ALIASES + +# Unset the FORCE on cache variables if in try_compile() +set(FORCE_CACHE FORCE) +get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE) +if(_CMAKE_IN_TRY_COMPILE) + unset(FORCE_CACHE) +endif() + +# Default to building for iPhoneOS if not specified otherwise, and we cannot +# determine the platform from the CMAKE_OSX_ARCHITECTURES variable. The use +# of CMAKE_OSX_ARCHITECTURES is such that try_compile() projects can correctly +# determine the value of PLATFORM from the root project, as +# CMAKE_OSX_ARCHITECTURES is propagated to them by CMake. +if(NOT DEFINED PLATFORM) + if (CMAKE_OSX_ARCHITECTURES) + if(CMAKE_OSX_ARCHITECTURES MATCHES ".*arm.*" AND CMAKE_OSX_SYSROOT MATCHES ".*iphoneos.*") + set(PLATFORM "OS") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_SYSROOT MATCHES ".*iphonesimulator.*") + set(PLATFORM "SIMULATOR") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" AND CMAKE_OSX_SYSROOT MATCHES ".*iphonesimulator.*") + set(PLATFORM "SIMULATOR64") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "arm64" AND CMAKE_OSX_SYSROOT MATCHES ".*appletvos.*") + set(PLATFORM "TVOS") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" AND CMAKE_OSX_SYSROOT MATCHES ".*appletvsimulator.*") + set(PLATFORM "SIMULATOR_TVOS") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES ".*armv7k.*" AND CMAKE_OSX_SYSROOT MATCHES ".*watchos.*") + set(PLATFORM "WATCHOS") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_SYSROOT MATCHES ".*watchsimulator.*") + set(PLATFORM "SIMULATOR_WATCHOS") + endif() + endif() + if (NOT PLATFORM) + set(PLATFORM "OS") + endif() +endif() + +set(PLATFORM_INT "${PLATFORM}" CACHE STRING "Type of platform for which the build targets.") + +# Handle the case where we are targeting iOS and a version above 10.3.4 (32-bit support dropped officially) +if(PLATFORM_INT STREQUAL "OS" AND DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 10.3.4) + set(PLATFORM_INT "OS64") + message(STATUS "Targeting minimum SDK version ${DEPLOYMENT_TARGET}. Dropping 32-bit support.") +elseif(PLATFORM_INT STREQUAL "SIMULATOR" AND DEPLOYMENT_TARGET VERSION_GREATER_EQUAL 10.3.4) + set(PLATFORM_INT "SIMULATOR64") + message(STATUS "Targeting minimum SDK version ${DEPLOYMENT_TARGET}. Dropping 32-bit support.") +endif() + +# Determine the platform name and architectures for use in xcodebuild commands +# from the specified PLATFORM name. +if(PLATFORM_INT STREQUAL "OS") + set(SDK_NAME iphoneos) + if(NOT ARCHS) + set(ARCHS armv7 armv7s arm64) + endif() +elseif(PLATFORM_INT STREQUAL "OS64") + set(SDK_NAME iphoneos) + if(NOT ARCHS) + if (XCODE_VERSION VERSION_GREATER 10.0) + set(ARCHS arm64) # Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missung bitcode markers for example + else() + set(ARCHS arm64) + endif() + endif() +elseif(PLATFORM_INT STREQUAL "OS64COMBINED") + set(SDK_NAME iphoneos) + if(MODERN_CMAKE) + if(NOT ARCHS) + if (XCODE_VERSION VERSION_GREATER 10.0) + set(ARCHS arm64 x86_64) # Add arm64e when Apple have fixed the integration issues with it, libarclite_iphoneos.a is currently missung bitcode markers for example + else() + set(ARCHS arm64 x86_64) + endif() + endif() + else() + message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the OS64COMBINED setting work") + endif() +elseif(PLATFORM_INT STREQUAL "SIMULATOR") + set(SDK_NAME iphonesimulator) + if(NOT ARCHS) + set(ARCHS i386) + endif() + message(DEPRECATION "SIMULATOR IS DEPRECATED. Consider using SIMULATOR64 instead.") +elseif(PLATFORM_INT STREQUAL "SIMULATOR64") + set(SDK_NAME iphonesimulator) + if(NOT ARCHS) + set(ARCHS x86_64) + endif() +elseif(PLATFORM_INT STREQUAL "TVOS") + set(SDK_NAME appletvos) + if(NOT ARCHS) + set(ARCHS arm64) + endif() +elseif (PLATFORM_INT STREQUAL "TVOSCOMBINED") + set(SDK_NAME appletvos) + if(MODERN_CMAKE) + if(NOT ARCHS) + set(ARCHS arm64 x86_64) + endif() + else() + message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the TVOSCOMBINED setting work") + endif() +elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS") + set(SDK_NAME appletvsimulator) + if(NOT ARCHS) + set(ARCHS x86_64) + endif() +elseif(PLATFORM_INT STREQUAL "WATCHOS") + set(SDK_NAME watchos) + if(NOT ARCHS) + if (XCODE_VERSION VERSION_GREATER 10.0) + set(ARCHS armv7k arm64_32) + else() + set(ARCHS armv7k) + endif() + endif() +elseif(PLATFORM_INT STREQUAL "WATCHOSCOMBINED") + set(SDK_NAME watchos) + if(MODERN_CMAKE) + if(NOT ARCHS) + if (XCODE_VERSION VERSION_GREATER 10.0) + set(ARCHS armv7k arm64_32 i386) + else() + set(ARCHS armv7k i386) + endif() + endif() + else() + message(FATAL_ERROR "Please make sure that you are running CMake 3.14+ to make the WATCHOSCOMBINED setting work") + endif() +elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS") + set(SDK_NAME watchsimulator) + if(NOT ARCHS) + set(ARCHS i386) + endif() +else() + message(FATAL_ERROR "Invalid PLATFORM: ${PLATFORM_INT}") +endif() +message(STATUS "Configuring ${SDK_NAME} build for platform: ${PLATFORM_INT}, architecture(s): ${ARCHS}") + +if(MODERN_CMAKE AND PLATFORM_INT MATCHES ".*COMBINED" AND NOT USED_CMAKE_GENERATOR MATCHES "Xcode") + message(FATAL_ERROR "The COMBINED options only work with Xcode generator, -G Xcode") +endif() + +# If user did not specify the SDK root to use, then query xcodebuild for it. +execute_process(COMMAND xcodebuild -version -sdk ${SDK_NAME} Path + OUTPUT_VARIABLE CMAKE_OSX_SYSROOT_INT + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +if (NOT DEFINED CMAKE_OSX_SYSROOT_INT AND NOT DEFINED CMAKE_OSX_SYSROOT) + message(SEND_ERROR "Please make sure that Xcode is installed and that the toolchain" + "is pointing to the correct path. Please run:" + "sudo xcode-select -s /Applications/Xcode.app/Contents/Developer" + "and see if that fixes the problem for you.") + message(FATAL_ERROR "Invalid CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT} " + "does not exist.") +elseif(DEFINED CMAKE_OSX_SYSROOT) + message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT} for platform: ${PLATFORM_INT} when checking compatibility") +elseif(DEFINED CMAKE_OSX_SYSROOT_INT) + message(STATUS "Using SDK: ${CMAKE_OSX_SYSROOT_INT} for platform: ${PLATFORM_INT}") + set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "") +endif() + +# Set Xcode property for SDKROOT as well if Xcode generator is used +if(USED_CMAKE_GENERATOR MATCHES "Xcode") + set(CMAKE_OSX_SYSROOT "${SDK_NAME}" CACHE INTERNAL "") + if(NOT DEFINED CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM) + set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM 123456789A CACHE INTERNAL "") + endif() +endif() + +# Specify minimum version of deployment target. +if(NOT DEFINED DEPLOYMENT_TARGET) + if (PLATFORM_INT STREQUAL "WATCHOS" OR PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS") + # Unless specified, SDK version 2.0 is used by default as minimum target version (watchOS). + set(DEPLOYMENT_TARGET "2.0" + CACHE STRING "Minimum SDK version to build for." ) + else() + # Unless specified, SDK version 9.0 is used by default as minimum target version (iOS, tvOS). + set(DEPLOYMENT_TARGET "9.0" + CACHE STRING "Minimum SDK version to build for." ) + endif() + message(STATUS "Using the default min-version since DEPLOYMENT_TARGET not provided!") +endif() +# Use bitcode or not +if(NOT DEFINED ENABLE_BITCODE AND NOT ARCHS MATCHES "((^|;|, )(i386|x86_64))+") + # Unless specified, enable bitcode support by default + message(STATUS "Enabling bitcode support by default. ENABLE_BITCODE not provided!") + set(ENABLE_BITCODE TRUE) +elseif(NOT DEFINED ENABLE_BITCODE) + message(STATUS "Disabling bitcode support by default on simulators. ENABLE_BITCODE not provided for override!") + set(ENABLE_BITCODE FALSE) +endif() +set(ENABLE_BITCODE_INT ${ENABLE_BITCODE} CACHE BOOL "Whether or not to enable bitcode" ${FORCE_CACHE}) +# Use ARC or not +if(NOT DEFINED ENABLE_ARC) + # Unless specified, enable ARC support by default + set(ENABLE_ARC TRUE) + message(STATUS "Enabling ARC support by default. ENABLE_ARC not provided!") +endif() +set(ENABLE_ARC_INT ${ENABLE_ARC} CACHE BOOL "Whether or not to enable ARC" ${FORCE_CACHE}) +# Use hidden visibility or not +if(NOT DEFINED ENABLE_VISIBILITY) + # Unless specified, disable symbols visibility by default + set(ENABLE_VISIBILITY FALSE) + message(STATUS "Hiding symbols visibility by default. ENABLE_VISIBILITY not provided!") +endif() +set(ENABLE_VISIBILITY_INT ${ENABLE_VISIBILITY} CACHE BOOL "Whether or not to hide symbols (-fvisibility=hidden)" ${FORCE_CACHE}) +# Set strict compiler checks or not +if(NOT DEFINED ENABLE_STRICT_TRY_COMPILE) + # Unless specified, disable strict try_compile() + set(ENABLE_STRICT_TRY_COMPILE FALSE) + message(STATUS "Using NON-strict compiler checks by default. ENABLE_STRICT_TRY_COMPILE not provided!") +endif() +set(ENABLE_STRICT_TRY_COMPILE_INT ${ENABLE_STRICT_TRY_COMPILE} CACHE BOOL "Whether or not to use strict compiler checks" ${FORCE_CACHE}) +# Get the SDK version information. +execute_process(COMMAND xcodebuild -sdk ${CMAKE_OSX_SYSROOT} -version SDKVersion + OUTPUT_VARIABLE SDK_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + +# Find the Developer root for the specific iOS platform being compiled for +# from CMAKE_OSX_SYSROOT. Should be ../../ from SDK specified in +# CMAKE_OSX_SYSROOT. There does not appear to be a direct way to obtain +# this information from xcrun or xcodebuild. +if (NOT DEFINED CMAKE_DEVELOPER_ROOT AND NOT USED_CMAKE_GENERATOR MATCHES "Xcode") + get_filename_component(PLATFORM_SDK_DIR ${CMAKE_OSX_SYSROOT} PATH) + get_filename_component(CMAKE_DEVELOPER_ROOT ${PLATFORM_SDK_DIR} PATH) + + if (NOT DEFINED CMAKE_DEVELOPER_ROOT) + message(FATAL_ERROR "Invalid CMAKE_DEVELOPER_ROOT: " + "${CMAKE_DEVELOPER_ROOT} does not exist.") + endif() +endif() +# Find the C & C++ compilers for the specified SDK. +if(NOT CMAKE_C_COMPILER) + execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang + OUTPUT_VARIABLE CMAKE_C_COMPILER + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Using C compiler: ${CMAKE_C_COMPILER}") +endif() +if(NOT CMAKE_CXX_COMPILER) + execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find clang++ + OUTPUT_VARIABLE CMAKE_CXX_COMPILER + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + message(STATUS "Using CXX compiler: ${CMAKE_CXX_COMPILER}") +endif() +# Find (Apple's) libtool. +execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find libtool + OUTPUT_VARIABLE BUILD_LIBTOOL + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +message(STATUS "Using libtool: ${BUILD_LIBTOOL}") +# Configure libtool to be used instead of ar + ranlib to build static libraries. +# This is required on Xcode 7+, but should also work on previous versions of +# Xcode. +set(CMAKE_C_CREATE_STATIC_LIBRARY + "${BUILD_LIBTOOL} -static -o ") +set(CMAKE_CXX_CREATE_STATIC_LIBRARY + "${BUILD_LIBTOOL} -static -o ") +# Find the toolchain's provided install_name_tool if none is found on the host +if(NOT CMAKE_INSTALL_NAME_TOOL) + execute_process(COMMAND xcrun -sdk ${CMAKE_OSX_SYSROOT} -find install_name_tool + OUTPUT_VARIABLE CMAKE_INSTALL_NAME_TOOL_INT + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(CMAKE_INSTALL_NAME_TOOL ${CMAKE_INSTALL_NAME_TOOL_INT} CACHE STRING "" ${FORCE_CACHE}) + message(STATUS "Using install_name_tool: ${CMAKE_INSTALL_NAME_TOOL}") +endif() +# Get the version of Darwin (OS X) of the host. +execute_process(COMMAND uname -r + OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE) +# CMake 3.14+ support building for iOS, watchOS and tvOS out of the box. +if(MODERN_CMAKE) + if(SDK_NAME MATCHES "iphone") + set(CMAKE_SYSTEM_NAME iOS CACHE INTERNAL "" ${FORCE_CACHE}) + elseif(SDK_NAME MATCHES "appletv") + set(CMAKE_SYSTEM_NAME tvOS CACHE INTERNAL "" ${FORCE_CACHE}) + elseif(SDK_NAME MATCHES "watch") + set(CMAKE_SYSTEM_NAME watchOS CACHE INTERNAL "" ${FORCE_CACHE}) + endif() + + # Provide flags for a combined FAT library build on newer CMake versions + if(PLATFORM_INT MATCHES ".*COMBINED") + set(CMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO CACHE INTERNAL "" ${FORCE_CACHE}) + set(CMAKE_IOS_INSTALL_COMBINED YES CACHE INTERNAL "" ${FORCE_CACHE}) + message(STATUS "Will combine built (static) artifacts into FAT lib...") + endif() +else() + # Legacy code path prior to CMake 3.14 + set(CMAKE_SYSTEM_NAME Darwin CACHE INTERNAL "" ${FORCE_CACHE}) +endif() +# Standard settings. +set(CMAKE_SYSTEM_VERSION ${SDK_VERSION} CACHE INTERNAL "") +set(UNIX TRUE CACHE BOOL "") +set(APPLE TRUE CACHE BOOL "") +set(IOS TRUE CACHE BOOL "") +set(CMAKE_AR ar CACHE FILEPATH "" FORCE) +set(CMAKE_RANLIB ranlib CACHE FILEPATH "" FORCE) +set(CMAKE_STRIP strip CACHE FILEPATH "" FORCE) +# Set the architectures for which to build. +set(CMAKE_OSX_ARCHITECTURES ${ARCHS} CACHE STRING "Build architecture for iOS") +# Change the type of target generated for try_compile() so it'll work when cross-compiling, weak compiler checks +if(ENABLE_STRICT_TRY_COMPILE_INT) + message(STATUS "Using strict compiler checks (default in CMake).") +else() + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) +endif() +# All iOS/Darwin specific settings - some may be redundant. +set(CMAKE_SHARED_LIBRARY_PREFIX "lib") +set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib") +set(CMAKE_SHARED_MODULE_PREFIX "lib") +set(CMAKE_SHARED_MODULE_SUFFIX ".so") +set(CMAKE_C_COMPILER_ABI ELF) +set(CMAKE_CXX_COMPILER_ABI ELF) +set(CMAKE_C_HAS_ISYSROOT 1) +set(CMAKE_CXX_HAS_ISYSROOT 1) +set(CMAKE_MODULE_EXISTS 1) +set(CMAKE_DL_LIBS "") +set(CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ") +set(CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ") +set(CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}") +set(CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}") + +if(ARCHS MATCHES "((^|;|, )(arm64|arm64e|x86_64))+") + set(CMAKE_C_SIZEOF_DATA_PTR 8) + set(CMAKE_CXX_SIZEOF_DATA_PTR 8) + if(ARCHS MATCHES "((^|;|, )(arm64|arm64e))+") + set(CMAKE_SYSTEM_PROCESSOR "aarch64") + else() + set(CMAKE_SYSTEM_PROCESSOR "x86_64") + endif() + message(STATUS "Using a data_ptr size of 8") +else() + set(CMAKE_C_SIZEOF_DATA_PTR 4) + set(CMAKE_CXX_SIZEOF_DATA_PTR 4) + set(CMAKE_SYSTEM_PROCESSOR "arm") + message(STATUS "Using a data_ptr size of 4") +endif() + +message(STATUS "Building for minimum ${SDK_NAME} version: ${DEPLOYMENT_TARGET}" + " (SDK version: ${SDK_VERSION})") +# Note that only Xcode 7+ supports the newer more specific: +# -m${SDK_NAME}-version-min flags, older versions of Xcode use: +# -m(ios/ios-simulator)-version-min instead. +if(PLATFORM_INT STREQUAL "OS" OR PLATFORM_INT STREQUAL "OS64") + if(XCODE_VERSION VERSION_LESS 7.0) + set(SDK_NAME_VERSION_FLAGS + "-mios-version-min=${DEPLOYMENT_TARGET}") + else() + # Xcode 7.0+ uses flags we can build directly from SDK_NAME. + set(SDK_NAME_VERSION_FLAGS + "-m${SDK_NAME}-version-min=${DEPLOYMENT_TARGET}") + endif() +elseif(PLATFORM_INT STREQUAL "TVOS") + set(SDK_NAME_VERSION_FLAGS + "-mtvos-version-min=${DEPLOYMENT_TARGET}") +elseif(PLATFORM_INT STREQUAL "SIMULATOR_TVOS") + set(SDK_NAME_VERSION_FLAGS + "-mtvos-simulator-version-min=${DEPLOYMENT_TARGET}") +elseif(PLATFORM_INT STREQUAL "WATCHOS") + set(SDK_NAME_VERSION_FLAGS + "-mwatchos-version-min=${DEPLOYMENT_TARGET}") +elseif(PLATFORM_INT STREQUAL "SIMULATOR_WATCHOS") + set(SDK_NAME_VERSION_FLAGS + "-mwatchos-simulator-version-min=${DEPLOYMENT_TARGET}") +else() + # SIMULATOR or SIMULATOR64 both use -mios-simulator-version-min. + set(SDK_NAME_VERSION_FLAGS + "-mios-simulator-version-min=${DEPLOYMENT_TARGET}") +endif() +message(STATUS "Version flags set to: ${SDK_NAME_VERSION_FLAGS}") +set(CMAKE_OSX_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} CACHE STRING + "Set CMake deployment target" ${FORCE_CACHE}) + +if(ENABLE_BITCODE_INT) + set(BITCODE "-fembed-bitcode") + set(CMAKE_XCODE_ATTRIBUTE_BITCODE_GENERATION_MODE bitcode CACHE INTERNAL "") + message(STATUS "Enabling bitcode support.") +else() + set(BITCODE "") + set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO CACHE INTERNAL "") + message(STATUS "Disabling bitcode support.") +endif() + +if(ENABLE_ARC_INT) + set(FOBJC_ARC "-fobjc-arc") + set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES CACHE INTERNAL "") + message(STATUS "Enabling ARC support.") +else() + set(FOBJC_ARC "-fno-objc-arc") + set(CMAKE_XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO CACHE INTERNAL "") + message(STATUS "Disabling ARC support.") +endif() + +if(NOT ENABLE_VISIBILITY_INT) + set(VISIBILITY "-fvisibility=hidden") + set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN YES CACHE INTERNAL "") + message(STATUS "Hiding symbols (-fvisibility=hidden).") +else() + set(VISIBILITY "") + set(CMAKE_XCODE_ATTRIBUTE_GCC_SYMBOLS_PRIVATE_EXTERN NO CACHE INTERNAL "") +endif() + +#Check if Xcode generator is used, since that will handle these flags automagically +if(USED_CMAKE_GENERATOR MATCHES "Xcode") + message(STATUS "Not setting any manual command-line buildflags, since Xcode is selected as generator.") +else() + set(CMAKE_C_FLAGS + "${SDK_NAME_VERSION_FLAGS} ${BITCODE} -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_C_FLAGS}") + # Hidden visibilty is required for C++ on iOS. + set(CMAKE_CXX_FLAGS + "${SDK_NAME_VERSION_FLAGS} ${BITCODE} ${VISIBILITY} -fvisibility-inlines-hidden -fobjc-abi-version=2 ${FOBJC_ARC} ${CMAKE_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} -O0 -g ${CMAKE_CXX_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS} -DNDEBUG -Os -ffast-math ${CMAKE_CXX_FLAGS_MINSIZEREL}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS} -DNDEBUG -O2 -g -ffast-math ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} -DNDEBUG -O3 -ffast-math ${CMAKE_CXX_FLAGS_RELEASE}") + set(CMAKE_C_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}") + set(CMAKE_CXX_LINK_FLAGS "${SDK_NAME_VERSION_FLAGS} -Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}") + + # In order to ensure that the updated compiler flags are used in try_compile() + # tests, we have to forcibly set them in the CMake cache, not merely set them + # in the local scope. + list(APPEND VARS_TO_FORCE_IN_CACHE + CMAKE_C_FLAGS + CMAKE_CXX_FLAGS + CMAKE_CXX_FLAGS_DEBUG + CMAKE_CXX_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_MINSIZEREL + CMAKE_CXX_FLAGS_RELEASE + CMAKE_C_LINK_FLAGS + CMAKE_CXX_LINK_FLAGS) + foreach(VAR_TO_FORCE ${VARS_TO_FORCE_IN_CACHE}) + set(${VAR_TO_FORCE} "${${VAR_TO_FORCE}}" CACHE STRING "") + endforeach() +endif() + +set(CMAKE_PLATFORM_HAS_INSTALLNAME 1) +set(CMAKE_SHARED_LINKER_FLAGS "-rpath @executable_path/Frameworks -rpath @loader_path/Frameworks") +set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names") +set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -Wl,-headerpad_max_install_names") +set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,") +set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,") +set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a") +set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name") + +# Set the find root to the iOS developer roots and to user defined paths. +set(CMAKE_FIND_ROOT_PATH ${CMAKE_OSX_SYSROOT_INT} ${CMAKE_PREFIX_PATH} CACHE STRING "Root path that will be prepended + to all search paths") +# Default to searching for frameworks first. +set(CMAKE_FIND_FRAMEWORK FIRST) +# Set up the default search directories for frameworks. +set(CMAKE_FRAMEWORK_PATH + ${CMAKE_DEVELOPER_ROOT}/Library/PrivateFrameworks + ${CMAKE_OSX_SYSROOT_INT}/System/Library/Frameworks + ${CMAKE_FRAMEWORK_PATH} CACHE STRING "Frameworks search paths" ${FORCE_CACHE}) + +# By default, search both the specified iOS SDK and the remainder of the host filesystem. +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PROGRAM) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE STRING "" ${FORCE_CACHE}) +endif() +if(NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY CACHE STRING "" ${FORCE_CACHE}) +endif() +if(NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY CACHE STRING "" ${FORCE_CACHE}) +endif() +if(NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY CACHE STRING "" ${FORCE_CACHE}) +endif() + +# +# Some helper-macros below to simplify and beautify the CMakeFile +# + +# This little macro lets you set any Xcode specific property. +macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE XCODE_RELVERSION) + set(XCODE_RELVERSION_I "${XCODE_RELVERSION}") + if(XCODE_RELVERSION_I STREQUAL "All") + set_property(TARGET ${TARGET} PROPERTY + XCODE_ATTRIBUTE_${XCODE_PROPERTY} "${XCODE_VALUE}") + else() + set_property(TARGET ${TARGET} PROPERTY + XCODE_ATTRIBUTE_${XCODE_PROPERTY}[variant=${XCODE_RELVERSION_I}] "${XCODE_VALUE}") + endif() +endmacro(set_xcode_property) +# This macro lets you find executable programs on the host system. +macro(find_host_package) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER) + set(IOS FALSE) + find_package(${ARGN}) + set(IOS TRUE) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH) +endmacro(find_host_package) diff --git a/cmake/cross-toolchains/mcuxpresso-k65-freertos-lwip.cmake b/cmake/cross-toolchains/mcuxpresso-k65-freertos-lwip.cmake new file mode 100644 index 000000000..ba34ef646 --- /dev/null +++ b/cmake/cross-toolchains/mcuxpresso-k65-freertos-lwip.cmake @@ -0,0 +1,62 @@ +# An example CMake toolchain file for cross-compiling for NXP devices with NXP's MCUXpresso gcc +# toolchain. +# +# You need to pick the type of build files that CMake generates (the Generator). MCUXpresso comes +# with a GNU Make utility, so it's convenient to use the "Unix Makefiles" generator in most cases; +# a line below tells CMake where to find MCUXpresso's make utility. +# +# Usage: cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=[path/to/this/file] [path/to/sources] + +set(CMAKE_SYSTEM_NAME Generic) # This is CMake's name for 'bare-metal' or RTOS environments +set(CMAKE_SYSTEM_PROCESSOR arm) + +# The MCUXpresso installation directory, highly likely to require customization +if(WIN32) + set(MCUXPRESSO_DEFAULT_INSTALL_DIR "C:/nxp/MCUXpressoIDE_11.1.0_3209") +endif() +set(MCUXPRESSO_INSTALL_DIR "${MCUXPRESSO_DEFAULT_INSTALL_DIR}" CACHE STRING "The MCUXpresso install directory") + +set(CMAKE_C_COMPILER ${MCUXPRESSO_INSTALL_DIR}/ide/tools/bin/arm-none-eabi-gcc.exe CACHE FILEPATH "MCUXpresso ARM GCC Compiler") +set(CMAKE_MAKE_PROGRAM ${MCUXPRESSO_INSTALL_DIR}/ide/buildtools/bin/make.exe CACHE FILEPATH "MCUXpresso Make utility") + +# This tells CMake to use a static library program to do its minimal compiler +# test instead of an executable - this translates well to embedded toolchains. +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + +# If that doesn't work, you might need to comment the line above and uncomment +# this line to bypass the compiler checks. +# set(CMAKE_C_COMPILER_WORKS 1) +# set(CMAKE_CXX_COMPILER_WORKS 1) + +# These are global compile definitions and compile options that will be applied to every build step +# when building the libraries. It's highly recommended that you make these match your project's +# build settings as closely as possible. My preferred approach to this is to just grab a line of +# build output and add all the flags I see to these lines. Here are some examples from a project +# that builds for a NXP Kinetis K65 processor using FreeRTOS and lwIP. +add_compile_definitions( + __NEWLIB__ + __STRICT_ANSI__ + CPU_MK65FN2M0VMI18 + CPU_MK65FN2M0VMI18_cm4 + SDK_DEBUGCONSOLE=1 + CR_INTEGER_PRINTF + PRINTF_FLOAT_ENABLE=0 + FSL_RTOS_FREE_RTOS + SDK_RTOS_FREE_RTOS + __MCUXPRESSO + __USE_CMSIS + USE_RTOS + __LINUX_ERRNO_EXTENSIONS__ +) +add_compile_options( + -fno-common + -ffunction-sections + -fdata-sections + -ffreestanding + -fno-builtin + -mcpu=cortex-m4 + -mfpu=fpv4-sp-d16 + -mfloat-abi=hard + -mthumb + -fstack-usage +) diff --git a/cmake/etcpal-os.cmake b/cmake/etcpal-os.cmake new file mode 100644 index 000000000..f04a47ad1 --- /dev/null +++ b/cmake/etcpal-os.cmake @@ -0,0 +1,99 @@ + +# The set of supported target OS +set(VALID_ETCPAL_OS_TARGETS + freertos + ios + linux + macos + mqx + windows +) +set(VALID_ETCPAL_NET_TARGETS + ios + linux + lwip + macos + mqx + windows +) + +set(ETCPAL_OS_TARGET "" CACHE STRING "OS provider for EtcPal. See tools/cmake/etcpal-os.cmake for valid values.") +set(ETCPAL_NET_TARGET "" CACHE STRING "Network stack provider for EtcPal. Often (but not always) the same as ETCPAL_OS_TARGET. See src/CMakeLists.txt for valid values.") + +# Assume defaults for ETCPAL_OS_TARGET +if(NOT ETCPAL_OS_TARGET) + message(STATUS "ETCPAL_OS_TARGET not supplied.") + if(WIN32) + set(ETCPAL_OS_TARGET windows) + elseif(APPLE) + if(IOS) + set(ETCPAL_OS_TARGET ios) + else() + set(ETCPAL_OS_TARGET macos) + endif() + elseif(UNIX) + set(ETCPAL_OS_TARGET linux) + endif() + + if(ETCPAL_OS_TARGET) + message(STATUS "Assuming OS target '${ETCPAL_OS_TARGET}' based on current CMake configuration...") + else() + message(STATUS "Assuming no OS support based on current CMake configuration...") + endif() +endif() + +# Assume defaults for ETCPAL_NET_TARGET +if(NOT ETCPAL_NET_TARGET) + message(STATUS "ETCPAL_NET_TARGET not supplied.") + if(WIN32) + set(ETCPAL_NET_TARGET windows) + elseif(APPLE) + if(IOS) + set(ETCPAL_NET_TARGET ios) + else() + set(ETCPAL_NET_TARGET macos) + endif() + elseif(UNIX) + set(ETCPAL_NET_TARGET linux) + endif() + + if(ETCPAL_NET_TARGET) + message(STATUS "Assuming network target '${ETCPAL_NET_TARGET}' based on current CMake configuration...") + else() + message(STATUS "Assuming no networking support based on current CMake configuration...") + endif() +endif() + +# Check ETCPAL_OS_TARGET and include its configuration. +if(ETCPAL_OS_TARGET AND NOT ETCPAL_OS_TARGET STREQUAL "none") + if(NOT ${ETCPAL_OS_TARGET} IN_LIST VALID_ETCPAL_OS_TARGETS) + message(FATAL_ERROR "${ETCPAL_OS_TARGET} is not a valid target OS. " + "Specify ETCPAL_OS_TARGET from these options: ${VALID_ETCPAL_OS_TARGETS}" + "Or leave it empty to build without OS abstraction support." + ) + endif() + + set(ETCPAL_HAVE_OS_SUPPORT TRUE) + + if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/os/${ETCPAL_OS_TARGET}.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/os/${ETCPAL_OS_TARGET}.cmake) + endif() +else() + set(ETCPAL_OS_ADDITIONAL_DEFINES ETCPAL_NO_OS_SUPPORT) +endif() + +# Check ETCPAL_NET_TARGET and include its configuration. +if(ETCPAL_NET_TARGET AND NOT ETCPAL_NET_TARGET STREQUAL "none") + if(NOT ${ETCPAL_NET_TARGET} IN_LIST VALID_ETCPAL_NET_TARGETS) + message(FATAL_ERROR "\"${ETCPAL_NET_TARGET}\" is not a valid target network stack. " + "Specify ETCPAL_NET_TARGET from these options: ${VALID_ETCPAL_NET_TARGETS}") + endif() + + set(ETCPAL_HAVE_NETWORKING_SUPPORT TRUE) + + if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/net/${ETCPAL_NET_TARGET}.cmake) + include(${CMAKE_CURRENT_LIST_DIR}/net/${ETCPAL_NET_TARGET}.cmake) + endif() +else() + set(ETCPAL_NET_ADDITIONAL_DEFINES ETCPAL_NO_NETWORKING_SUPPORT) +endif() diff --git a/cmake/net/ios.cmake b/cmake/net/ios.cmake new file mode 100644 index 000000000..467b67b41 --- /dev/null +++ b/cmake/net/ios.cmake @@ -0,0 +1,15 @@ +# iOS networking compilation support for EtcPal + +# For now, we are mostly using the macOS sources. This may change in the future. + +set(ETCPAL_NET_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_inet.h + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_socket.h + + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_inet.c + ${ETCPAL_ROOT}/src/os/ios/etcpal/os_netint.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_socket.c +) +set(ETCPAL_NET_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/macos) diff --git a/cmake/net/linux.cmake b/cmake/net/linux.cmake new file mode 100644 index 000000000..9f1efcca7 --- /dev/null +++ b/cmake/net/linux.cmake @@ -0,0 +1,13 @@ +# Linux networking compilation support for EtcPal + +set(ETCPAL_NET_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/linux/etcpal/os_inet.h + ${ETCPAL_ROOT}/include/os/linux/etcpal/os_socket.h + + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_inet.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_netint.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_socket.c +) +set(ETCPAL_NET_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/linux) diff --git a/cmake/net/lwip.cmake b/cmake/net/lwip.cmake new file mode 100644 index 000000000..1796bdc4d --- /dev/null +++ b/cmake/net/lwip.cmake @@ -0,0 +1,36 @@ +# lwIP compilation support for EtcPal + +# Since lwIP is set up as a traditional library rather than a full-featured OS network stack, its +# include paths must be added as those of a traditional library rather than being available +# automatically as default settings of the compiler toolchain. +# +# The way this is implemented in EtcPal is by looking for a CMake target called lwIP which has the +# header paths for lwIP and the project's lwipopts.h as PUBLIC or INTERFACE include directories. +# +# If your project does not use CMake natively, this can just be an interface library target, added +# like so: +# +# add_library(lwIP INTERFACE) +# target_include_directories(lwIP INTERFACE [lwip/include/paths/...]) +# +# If you are consuming this library from a CMake project, the lwIP target can be what actually +# builds the lwIP sources as well. In either case, the target must be created before adding +# EtcPal's subdirectory. + +if(NOT TARGET lwIP) + message(FATAL_ERROR "You must provide a target called lwIP to allow EtcPal to find the lwIP headers." + "See the comment in this file for more information.") +endif() + +set(ETCPAL_NET_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/lwip/etcpal/os_socket.h + ${ETCPAL_ROOT}/include/os/lwip/etcpal/os_inet.h + + ${ETCPAL_ROOT}/src/os/lwip/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/lwip/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/lwip/etcpal/os_inet.c + ${ETCPAL_ROOT}/src/os/lwip/etcpal/os_netint.c + ${ETCPAL_ROOT}/src/os/lwip/etcpal/os_socket.c +) +set(ETCPAL_NET_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/lwip) +set(ETCPAL_NET_ADDITIONAL_LIBS lwIP) diff --git a/cmake/net/macos.cmake b/cmake/net/macos.cmake new file mode 100644 index 000000000..a04b69563 --- /dev/null +++ b/cmake/net/macos.cmake @@ -0,0 +1,13 @@ +# macOS networking compilation support for EtcPal + +set(ETCPAL_NET_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_inet.h + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_socket.h + + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_inet.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_netint.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_socket.c +) +set(ETCPAL_NET_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/macos) diff --git a/cmake/net/mqx.cmake b/cmake/net/mqx.cmake new file mode 100644 index 000000000..333e6351e --- /dev/null +++ b/cmake/net/mqx.cmake @@ -0,0 +1,35 @@ +# MQX OS compilation support for EtcPal + +# MQX's include paths must be added as those of a traditional library rather than being available +# automatically as default settings of the compiler toolchain. +# +# The way this is implemented in EtcPal is by looking for a CMake target called MQX which has the +# header paths for MQX as PUBLIC or INTERFACE include directories. +# +# If your project does not use CMake natively, this can just be an interface library target, added +# like so: +# +# add_library(MQX INTERFACE) +# target_include_directories(MQX INTERFACE [mqx/include/paths/...]) +# +# If you are consuming this library from a CMake project, the MQX target can be what actually +# builds the MQX sources as well. In either case, the target must be created before adding EtcPal's +# subdirectory. + +if(NOT TARGET MQX) + message(FATAL_ERROR "You must provide a target called MQX to allow EtcPal to find the MQX headers." + "See the comment in this file for more information.") +endif() + +set(ETCPAL_NET_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/mqx/etcpal/os_inet.h + ${ETCPAL_ROOT}/include/os/mqx/etcpal/os_socket.h + + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_inet.c + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_netint.c + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_socket.c +) +set(ETCPAL_NET_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/mqx) +set(ETCPAL_NET_ADDITIONAL_LIBS MQX) + + diff --git a/cmake/net/windows.cmake b/cmake/net/windows.cmake new file mode 100644 index 000000000..40cb753c4 --- /dev/null +++ b/cmake/net/windows.cmake @@ -0,0 +1,14 @@ +# Windows networking compilation support for EtcPal + +set(ETCPAL_NET_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/windows/etcpal/os_inet.h + ${ETCPAL_ROOT}/include/os/windows/etcpal/os_socket.h + + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_inet.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_netint.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_socket.c +) +set(ETCPAL_NET_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/windows) +set(ETCPAL_NET_ADDITIONAL_LIBS ws2_32 Iphlpapi) diff --git a/cmake/os/freertos.cmake b/cmake/os/freertos.cmake new file mode 100644 index 000000000..48d1dcde5 --- /dev/null +++ b/cmake/os/freertos.cmake @@ -0,0 +1,37 @@ +# FreeRTOS compilation support for EtcPal + +# Since FreeRTOS is an OS microkernel rather than a full-featured OS, its include paths must be +# added as those of a traditional library rather than being available automatically as default +# settings of the compiler toolchain. +# +# The way this is implemented in EtcPal is by looking for a CMake target called FreeRTOS which has +# the header paths for FreeRTOS and the project's FreeRTOSConfig.h as PUBLIC or INTERFACE include +# directories. +# +# If your project does not use CMake natively, this can just be an interface library target, added +# like so: +# +# add_library(FreeRTOS INTERFACE) +# target_include_directories(FreeRTOS INTERFACE [freertos/include/paths/...]) +# +# If you are consuming this library from a CMake project, the FreeRTOS target can be what actually +# builds the FreeRTOS sources as well. In either case, the target must be created before adding +# EtcPal's subdirectory. + +if(NOT TARGET FreeRTOS) + message(FATAL_ERROR "You must provide a target called FreeRTOS to allow EtcPal to find the FreeRTOS headers." + "See the comment in this file for more information.") +endif() + +set(ETCPAL_OS_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/freertos/etcpal/os_lock.h + ${ETCPAL_ROOT}/include/os/freertos/etcpal/os_thread.h + + ${ETCPAL_ROOT}/src/os/freertos/etcpal/os_lock.c + ${ETCPAL_ROOT}/src/os/freertos/etcpal/os_queue.c + ${ETCPAL_ROOT}/src/os/freertos/etcpal/os_thread.c + ${ETCPAL_ROOT}/src/os/freertos/etcpal/os_timer.c + ${ETCPAL_ROOT}/src/os/freertos/etcpal/os_uuid.c +) +set(ETCPAL_OS_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/freertos) +set(ETCPAL_OS_ADDITIONAL_LIBS FreeRTOS) diff --git a/cmake/os/ios.cmake b/cmake/os/ios.cmake new file mode 100644 index 000000000..b11164e4a --- /dev/null +++ b/cmake/os/ios.cmake @@ -0,0 +1,16 @@ +# iOS OS compilation support for EtcPal + +# For now, we are mostly using the macOS sources. This may change in the future. + +set(ETCPAL_OS_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_lock.h + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_thread.h + + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_lock.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_thread.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_timer.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_uuid.c +) +set(ETCPAL_OS_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/macos) diff --git a/cmake/os/linux.cmake b/cmake/os/linux.cmake new file mode 100644 index 000000000..374e1f5f7 --- /dev/null +++ b/cmake/os/linux.cmake @@ -0,0 +1,15 @@ +# Linux OS compilation support for EtcPal + +set(ETCPAL_OS_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/linux/etcpal/os_lock.h + ${ETCPAL_ROOT}/include/os/linux/etcpal/os_thread.h + + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_lock.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_thread.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_timer.c + ${ETCPAL_ROOT}/src/os/linux/etcpal/os_uuid.c +) +set(ETCPAL_OS_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/linux) +set(ETCPAL_OS_ADDITIONAL_LIBS uuid pthread) diff --git a/cmake/os/macos.cmake b/cmake/os/macos.cmake new file mode 100644 index 000000000..860a73a25 --- /dev/null +++ b/cmake/os/macos.cmake @@ -0,0 +1,14 @@ +# macOS OS compilation support for EtcPal + +set(ETCPAL_OS_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_lock.h + ${ETCPAL_ROOT}/include/os/macos/etcpal/os_thread.h + + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_lock.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_thread.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_timer.c + ${ETCPAL_ROOT}/src/os/macos/etcpal/os_uuid.c +) +set(ETCPAL_OS_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/macos) diff --git a/cmake/os/mqx.cmake b/cmake/os/mqx.cmake new file mode 100644 index 000000000..541f65e8e --- /dev/null +++ b/cmake/os/mqx.cmake @@ -0,0 +1,34 @@ +# MQX OS compilation support for EtcPal + +# MQX's include paths must be added as those of a traditional library rather than being available +# automatically as default settings of the compiler toolchain. +# +# The way this is implemented in EtcPal is by looking for a CMake target called MQX which has the +# header paths for MQX as PUBLIC or INTERFACE include directories. +# +# If your project does not use CMake natively, this can just be an interface library target, added +# like so: +# +# add_library(MQX INTERFACE) +# target_include_directories(MQX INTERFACE [mqx/include/paths/...]) +# +# If you are consuming this library from a CMake project, the MQX target can be what actually +# builds the MQX sources as well. In either case, the target must be created before adding EtcPal's +# subdirectory. + +if(NOT TARGET MQX) + message(FATAL_ERROR "You must provide a target called MQX to allow EtcPal to find the MQX headers." + "See the comment in this file for more information.") +endif() + +set(ETCPAL_OS_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/mqx/etcpal/os_lock.h + ${ETCPAL_ROOT}/include/os/mqx/etcpal/os_thread.h + + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_lock.c + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_thread.c + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_timer.c + ${ETCPAL_ROOT}/src/os/mqx/etcpal/os_uuid.c +) +set(ETCPAL_OS_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/mqx) +set(ETCPAL_OS_ADDITIONAL_LIBS MQX) diff --git a/cmake/os/windows.cmake b/cmake/os/windows.cmake new file mode 100644 index 000000000..a594a3d41 --- /dev/null +++ b/cmake/os/windows.cmake @@ -0,0 +1,15 @@ +# Windows OS compilation support for EtcPal + +set(ETCPAL_OS_ADDITIONAL_SOURCES + ${ETCPAL_ROOT}/include/os/windows/etcpal/os_lock.h + ${ETCPAL_ROOT}/include/os/windows/etcpal/os_thread.h + + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_error.h + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_error.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_lock.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_thread.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_timer.c + ${ETCPAL_ROOT}/src/os/windows/etcpal/os_uuid.c +) +set(ETCPAL_OS_INCLUDE_DIR ${ETCPAL_ROOT}/include/os/windows) +set(ETCPAL_OS_ADDITIONAL_LIBS winmm Rpcrt4) diff --git a/docs/Doxyfile b/docs/Doxyfile index 29848626a..3646ee5c5 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.14 +# Doxyfile 1.8.13 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -20,8 +20,8 @@ # 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 -# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 @@ -32,19 +32,19 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = lwpa +PROJECT_NAME = EtcPal # 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 = 0.2.0 +PROJECT_NUMBER = 0.3.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 = "LightWeight Platform Abstraction (lwpa)" +PROJECT_BRIEF = "ETC Platform Abstraction Layer (EtcPal)" # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 @@ -187,7 +187,7 @@ SHORT_NAMES = NO # description.) # The default value is: NO. -JAVADOC_AUTOBRIEF = NO +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 @@ -337,7 +337,7 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# http://www.riverbankcomputing.co.uk/software/sip/intro) 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. # The default value is: NO. @@ -461,7 +461,7 @@ EXTRACT_STATIC = NO # for Java sources. # The default value is: YES. -EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are @@ -703,12 +703,12 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = DoxygenLayout.xml # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# 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. See also \cite for info how to create references. @@ -740,7 +740,7 @@ WARNINGS = YES # will automatically be disabled. # The default value is: YES. -WARN_IF_UNDOCUMENTED = NO +WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters @@ -790,14 +790,16 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = ../src/lwpa \ - ../include/lwpa \ - mainpage.md +INPUT = ./pages \ + ../include/etcpal \ + ../include/etcpal/cpp \ + ../src/etcpal \ + ../src/etcpal/private/opts.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of +# documentation (see: http://www.gnu.org/software/libiconv) for the list of # possible encodings. # The default value is: UTF-8. @@ -866,7 +868,7 @@ FILE_PATTERNS = *.c \ # be searched for input files as well. # The default value is: NO. -RECURSIVE = YES +RECURSIVE = NO # 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 @@ -891,7 +893,8 @@ EXCLUDE_SYMLINKS = NO # 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 = +EXCLUDE_PATTERNS = */md5.h \ + */sha1.h # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -928,7 +931,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = ./pages # 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 @@ -1045,7 +1048,7 @@ SOURCE_TOOLTIPS = 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 https://www.gnu.org/software/global/global.html). You will need version +# (see http://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: @@ -1091,17 +1094,6 @@ CLANG_ASSISTED_PARSING = NO CLANG_OPTIONS = -# If clang assisted parsing is enabled you can provide the clang parser with the -# path to the compilation database (see: -# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files -# were built. This is equivalent to specifying the "-p" option to a clang tool, -# such as clang-check. These options will then be pased to the parser. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: 0. - -CLANG_COMPILATION_DATABASE_PATH= 0 - #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- @@ -1111,7 +1103,7 @@ CLANG_COMPILATION_DATABASE_PATH= 0 # classes, structs, unions or interfaces. # The default value is: YES. -ALPHABETICAL_INDEX = YES +ALPHABETICAL_INDEX = NO # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. @@ -1205,7 +1197,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = dox_styles.css # 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 @@ -1220,13 +1212,13 @@ HTML_EXTRA_FILES = # 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 -# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 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. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_HUE = 115 +HTML_COLORSTYLE_HUE = 37 # 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 @@ -1234,7 +1226,7 @@ HTML_COLORSTYLE_HUE = 115 # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_SAT = 76 +HTML_COLORSTYLE_SAT = 85 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 @@ -1256,17 +1248,6 @@ HTML_COLORSTYLE_GAMMA = 191 HTML_TIMESTAMP = NO -# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML -# documentation will contain a main index with vertical navigation menus that -# are dynamically created via Javascript. If disabled, the navigation index will -# consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have Javascript, -# like the Qt help browser. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_MENUS = 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. @@ -1290,12 +1271,12 @@ 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 (see: https://developer.apple.com/tools/xcode/), introduced with +# environment (see: http://developer.apple.com/tools/xcode/), 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 https://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1411,7 +1392,7 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace). +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1419,7 +1400,8 @@ 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 Qt Help Project / Virtual -# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders). +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1427,21 +1409,23 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). # This tag requires that the tag GENERATE_QHP is set to YES. 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 (see: -# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes). +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = @@ -1534,7 +1518,7 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# 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. # @@ -1546,7 +1530,7 @@ FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering +# http://www.mathjax.org) which uses client side Javascript for the rendering # instead of using pre-rendered 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 @@ -1573,7 +1557,7 @@ MATHJAX_FORMAT = HTML-CSS # 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 https://www.mathjax.org before deployment. +# MathJax from http://www.mathjax.org before deployment. # The default value is: http://cdn.mathjax.org/mathjax/latest. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1635,7 +1619,7 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: http://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1648,7 +1632,7 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and +# Xapian (see: http://xapian.org/). See the section "External Indexing and # Searching" for details. # This tag requires that the tag SEARCHENGINE is set to YES. @@ -1835,7 +1819,7 @@ 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. See -# https://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2018,9 +2002,9 @@ DOCBOOK_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures -# the structure of the code including all documentation. Note that this feature -# is still experimental and incomplete at the moment. +# AutoGen Definitions (see http://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. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO @@ -2164,7 +2148,7 @@ TAGFILES = # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = lwpa.tag +GENERATE_TAGFILE = etcpal.tag # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be diff --git a/docs/DoxygenLayout.xml b/docs/DoxygenLayout.xml new file mode 100644 index 000000000..d1d9d34e8 --- /dev/null +++ b/docs/DoxygenLayout.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/dox_styles.css b/docs/dox_styles.css new file mode 100644 index 000000000..4b47427d8 --- /dev/null +++ b/docs/dox_styles.css @@ -0,0 +1,1601 @@ +/* The standard CSS for doxygen 1.8.13 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #806740; + color: #1B160D; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EAE1D5; + border: 1px solid #A78753; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #251E12; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #342A1A; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9C7E4E; + color: #ffffff; + border: 1px double #7E663F; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0px; + margin: 4px 8px 4px 2px; + background-color: #FBF9F7; + border: 1px solid #C4AD89; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EAE1D5; + font-weight: bold; + border: 1px solid #C4AD89; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EAE1D5; + border: 1px solid #C4AD89; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #ECE5D9; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F6F2ED; + border-left: 2px solid #9C7E4E; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A78753; +} + +th.dirtab { + background: #EAE1D5; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #3B2F1D; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F8F6F2; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight { + width: 100%; +} + +.memTemplParams { + color: #342A1A; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #AC8C59; + border-left: 1px solid #AC8C59; + border-right: 1px solid #AC8C59; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E0D4C2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #342A1A; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EAE1D5; + border: 1px solid #A78753; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #AC8C59; + border-left: 1px solid #AC8C59; + border-right: 1px solid #AC8C59; + padding: 6px 0px 6px 0px; + color: #0B0905; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DDD0BB; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #AC8C59; + border-left: 1px solid #AC8C59; + border-right: 1px solid #AC8C59; + padding: 6px 10px 2px 10px; + background-color: #FBF9F7; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #665233; + border-top:1px solid #463923; + border-left:1px solid #463923; + border-right:1px solid #C4AD89; + border-bottom:1px solid #C4AD89; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9C7E4E; + border-bottom: 1px solid #9C7E4E; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F6F2ED; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #251E12; +} + +.arrow { + color: #9C7E4E; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #665233; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #0F0C07; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #120E09; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #1D170E; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +/* Keep links white inside table headers for contrast */ +table.doxtable th a, table.doxtable th a:visited { + color: #FFFFFF; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #AC8C59; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #AC8C59; + border-bottom: 1px solid #AC8C59; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #AC8C59; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E0D4C2; + font-size: 90%; + color: #0B0905; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #AC8C59; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#836A41; + border:solid 1px #C1AA84; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#1C160E; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #0E0B07; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#5B492D; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#1C160E; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F8F6F2; + margin: 0px; + border-bottom: 1px solid #C4AD89; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ +dl.section +{ + margin-left: 0px; + padding-left: 0px; +} + +dl.note +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00D000; +} + +dl.deprecated +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #505050; +} + +dl.todo +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #00C0E0; +} + +dl.test +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #3030E0; +} + +dl.bug +{ + margin-left:-7px; + padding-left: 3px; + border-left:4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #463923; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #8B7045; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#18130C; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F3EFE8; + border: 1px solid #D6C6AD; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #342A1A; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #ffffff; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #ffffff; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #120E09; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #120E09; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #1D170E; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #120E09; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + + +/* @end */ diff --git a/docs/etcpal.tag b/docs/etcpal.tag new file mode 100644 index 000000000..30cc82d31 --- /dev/null +++ b/docs/etcpal.tag @@ -0,0 +1,6347 @@ + + + + common.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2common_8h + + #define + ETCPAL_CONSTEXPR_14 + group__etcpal__cpp.html + ga27619ac477b23790da36baecb4389ee1 + + + + #define + ETCPAL_CONSTEXPR_14_OR_INLINE + group__etcpal__cpp.html + ga598701b6928c77a8c086183a0a1cb9cc + + + + #define + ETCPAL_NO_EXCEPTIONS + group__etcpal__cpp.html + gaaecae23a851a2e3b6d126547fbefbae3 + + + + + error.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2error_8h + etcpal/cpp/common.h + etcpal::Error + etcpal::BadExpectedAccess + etcpal::Expected + + + inet.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2inet_8h + etcpal/cpp/common.h + etcpal::IpAddr + etcpal::SockAddr + etcpal::MacAddr + + + IpAddrType + group__etcpal__cpp__inet.html + gaf149bcc08653396944a3699b8c5a57c5 + + Invalid + V4 + V6 + + + + lock.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2lock_8h + etcpal/cpp/common.h + etcpal::Mutex + etcpal::Signal + etcpal::RwLock + etcpal::Semaphore + etcpal::MutexGuard + etcpal::ReadGuard + etcpal::WriteGuard + + + log.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2log_8h + etcpal/cpp/common.h + etcpal/cpp/lock.h + etcpal/cpp/thread.h + etcpal::LogTimestamp + etcpal::LogMessageHandler + etcpal::Logger + + + LogDispatchPolicy + group__etcpal__cpp__log.html + ga886bd6be55942894f6ddb878d1cfc662 + + Direct + Queued + + + + queue.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2queue_8h + etcpal/cpp/common.h + etcpal::Queue + + + thread.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2thread_8h + etcpal/cpp/common.h + etcpal/cpp/error.h + etcpal::Thread + + + timer.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2timer_8h + etcpal/cpp/common.h + etcpal::TimePoint + etcpal::Timer + + + uuid.h + E:/git/ETCLabs/EtcPal/include/etcpal/cpp/ + cpp_2uuid_8h + etcpal::Uuid + + + UuidVersion + cpp_2uuid_8h.html + ac6e0bea8f4b482fd8ab17250626a3cf4 + + V1 + V2 + V3 + V4 + V5 + Unknown + + + + version.h + E:/git/ETCLabs/EtcPal/include/etcpal/ + version_8h + + + AcnPdu + struct_acn_pdu.html + + const uint8_t * + pvector + struct_acn_pdu.html + a106ad8e138ad9d47e5ed03680c6ac6ff + + + + const uint8_t * + pheader + struct_acn_pdu.html + a89e577801ef19d4cdca129391395ad8d + + + + const uint8_t * + pdata + struct_acn_pdu.html + a2f9eb29aa10e0d64f27f69db1e90bd07 + + + + size_t + data_len + struct_acn_pdu.html + ace1c2e33b74df8973a7d9a19c935af80 + + + + const uint8_t * + pnextpdu + struct_acn_pdu.html + a5af45b626c13232f152d7548f29f9f58 + + + + + AcnPduConstraints + struct_acn_pdu_constraints.html + + size_t + vector_size + struct_acn_pdu_constraints.html + a28e18243c88fd99888246e855cc116fd + + + + size_t + header_size + struct_acn_pdu_constraints.html + a64f1d0c53909f30b0aac882348cd32f2 + + + + + AcnRootLayerPdu + struct_acn_root_layer_pdu.html + + EtcPalUuid + sender_cid + struct_acn_root_layer_pdu.html + a341064da4798492e212c14a9aeede58d + + + + uint32_t + vector + struct_acn_root_layer_pdu.html + a513d751c7097b43b3968ac81f3a5715b + + + + const uint8_t * + pdata + struct_acn_root_layer_pdu.html + a2f9eb29aa10e0d64f27f69db1e90bd07 + + + + size_t + data_len + struct_acn_root_layer_pdu.html + ace1c2e33b74df8973a7d9a19c935af80 + + + + + AcnTcpPreamble + struct_acn_tcp_preamble.html + + const uint8_t * + rlp_block + struct_acn_tcp_preamble.html + a6df9d0f27538da177c52996a97e0a1d8 + + + + size_t + rlp_block_len + struct_acn_tcp_preamble.html + ab27f79ca664937f91e64f868ad233935 + + + + + AcnUdpPreamble + struct_acn_udp_preamble.html + + const uint8_t * + rlp_block + struct_acn_udp_preamble.html + a6df9d0f27538da177c52996a97e0a1d8 + + + + size_t + rlp_block_len + struct_acn_udp_preamble.html + ab27f79ca664937f91e64f868ad233935 + + + + + etcpal::BadExpectedAccess + classetcpal_1_1_bad_expected_access.html + + + BadExpectedAccess + classetcpal_1_1_bad_expected_access.html + a408f3d0470d7f1a3330830eb96db77d9 + (Error res) + + + Error + error + classetcpal_1_1_bad_expected_access.html + aa64e8d28a7a913372edd18c2d6a15ab7 + () const noexcept + + + + etcpal::Error + classetcpal_1_1_error.html + + constexpr + Error + classetcpal_1_1_error.html + acde5c53cc825c9794ffa980ea163a39a + (etcpal_error_t code) noexcept + + + Error & + operator= + classetcpal_1_1_error.html + a3c9c46279e5c973e70c51c57cfcaede9 + (etcpal_error_t code) noexcept + + + constexpr bool + IsOk + classetcpal_1_1_error.html + a030d244ccd9a40a9f9ac813ea912a639 + () const noexcept + + + constexpr etcpal_error_t + code + classetcpal_1_1_error.html + a65e890bf700cdd8262c552690a03baad + () const noexcept + + + std::string + ToString + classetcpal_1_1_error.html + a19c380b03cea21d7ac7325136a131ff0 + () const + + + const char * + ToCString + classetcpal_1_1_error.html + aa4d860f883bc4c6bc997eb61f218a27e + () const noexcept + + + constexpr + operator bool + classetcpal_1_1_error.html + a7990d8e87d9eab2383f94c88c23a6488 + () const noexcept + + + static constexpr Error + Ok + classetcpal_1_1_error.html + acbb5c12c9926c6fc2722da18881b8a49 + () noexcept + + + + EtcPalAddrinfo + struct_etc_pal_addrinfo.html + + int + ai_flags + struct_etc_pal_addrinfo.html + a92528a848ebf34ab99687dd06a09cc93 + + + + int + ai_family + struct_etc_pal_addrinfo.html + a4dc44d22f13bc5c59bff73e549e96a5c + + + + int + ai_socktype + struct_etc_pal_addrinfo.html + a2109130e73586150c41fed16311e1af6 + + + + int + ai_protocol + struct_etc_pal_addrinfo.html + a6ade486587feaa03d492eb84cfc83451 + + + + char * + ai_canonname + struct_etc_pal_addrinfo.html + a9fcbdd64fcb9adcf195a78b10f1fe8f6 + + + + EtcPalSockAddr + ai_addr + struct_etc_pal_addrinfo.html + a2000f4ebfae33b230309b0344354031d + + + + void * + pd + struct_etc_pal_addrinfo.html + aecf048e565653706ca7120829d06e047 + [2] + + + + EtcPalGroupReq + struct_etc_pal_group_req.html + + unsigned int + ifindex + struct_etc_pal_group_req.html + a452f46bf9904a02408a12d9e406b4de7 + + + + EtcPalIpAddr + group + struct_etc_pal_group_req.html + ab8ed4113f331d191260b09e960e94254 + + + + + EtcPalIpAddr + struct_etc_pal_ip_addr.html + + etcpal_iptype_t + type + struct_etc_pal_ip_addr.html + a89368dca599010efedd3d8ca663d5953 + + + + uint32_t + v4 + struct_etc_pal_ip_addr.html + a654069046d83e652d54cae5e353051c5 + + + + uint8_t + addr_buf + struct_etc_pal_ip_addr.html + a53d9f270f12d57a90a97d60b5e612237 + [ETCPAL_IPV6_BYTES] + + + unsigned long + scope_id + struct_etc_pal_ip_addr.html + a77c3e8275263425c8924ad010b38fae7 + + + + union EtcPalIpAddr::@0 + addr + struct_etc_pal_ip_addr.html + a3423eb761e78396c67ba1345c0438871 + + + + + EtcPalLinger + struct_etc_pal_linger.html + + int + onoff + struct_etc_pal_linger.html + a7730494d5c90b034d5937c758f354997 + + + + int + linger + struct_etc_pal_linger.html + a21667e862207c7c116b20764fcb8f931 + + + + + EtcPalLogParams + struct_etc_pal_log_params.html + + int + action + struct_etc_pal_log_params.html + a9ba0f2f280a2a2e49c17508af48aad91 + + + + EtcPalLogCallback + log_fn + struct_etc_pal_log_params.html + a9a6659e83ffc5e4e7ab3c5ba5009f4e7 + + + + EtcPalSyslogParams + syslog_params + struct_etc_pal_log_params.html + a6b5edefad9cb5463180d2f3cc9537c44 + + + + int + log_mask + struct_etc_pal_log_params.html + ac695d621aaa836a9d13d65a912be9518 + + + + EtcPalLogTimeFn + time_fn + struct_etc_pal_log_params.html + aceff50b76400c01d88b158c0a68f32d8 + + + + void * + context + struct_etc_pal_log_params.html + ae376f130b17d169ee51be68077a89ed0 + + + + + EtcPalLogStrings + struct_etc_pal_log_strings.html + + const char * + syslog + struct_etc_pal_log_strings.html + a5911dbe6a47cb2b9cfbab87a8881b5b6 + + + + const char * + legacy_syslog + struct_etc_pal_log_strings.html + a7c969c4f61944571b31c58080a53f968 + + + + const char * + human_readable + struct_etc_pal_log_strings.html + a4ac8b9667178849660fd3b1f99e93366 + + + + const char * + raw + struct_etc_pal_log_strings.html + a8129637af8920bc9328bbce2a00bfeb4 + + + + int + priority + struct_etc_pal_log_strings.html + acec9ce2df15222151ad66fcb1d74eb9f + + + + + EtcPalLogTimestamp + struct_etc_pal_log_timestamp.html + + unsigned int + year + struct_etc_pal_log_timestamp.html + a9c83bbc97dcf2390b043382b4dfe3c98 + + + + unsigned int + month + struct_etc_pal_log_timestamp.html + a8c07e017c7b80f536d05c6134cae89ef + + + + unsigned int + day + struct_etc_pal_log_timestamp.html + a2398ea43f7d25f677616371d3b545f59 + + + + unsigned int + hour + struct_etc_pal_log_timestamp.html + aa64c18c25aeef9a0d7c92d89fa24a636 + + + + unsigned int + minute + struct_etc_pal_log_timestamp.html + a7ff63df03ff6549639b712d24a94adef + + + + unsigned int + second + struct_etc_pal_log_timestamp.html + a7ab95bf164c7490d2855a7efcea6784a + + + + unsigned int + msec + struct_etc_pal_log_timestamp.html + ab7174bcdc6006eb03894beaa8664521c + + + + int + utc_offset + struct_etc_pal_log_timestamp.html + a0d5ceb6295477b5931bf54c002e36fe9 + + + + + EtcPalMacAddr + struct_etc_pal_mac_addr.html + + uint8_t + data + struct_etc_pal_mac_addr.html + a251236fb1e367947c8f6f5498a86896b + [ETCPAL_MAC_BYTES] + + + + EtcPalMreq + struct_etc_pal_mreq.html + + EtcPalIpAddr + netint + struct_etc_pal_mreq.html + af4d9906a2a7fca6dfe6daf61b1ac55d2 + + + + EtcPalIpAddr + group + struct_etc_pal_mreq.html + ab8ed4113f331d191260b09e960e94254 + + + + + EtcPalNetintInfo + struct_etc_pal_netint_info.html + + unsigned int + index + struct_etc_pal_netint_info.html + a589d64202487f78e3cc30dd2e04c5201 + + + + EtcPalIpAddr + addr + struct_etc_pal_netint_info.html + ac10a4235b585003054f76871bad3fd85 + + + + EtcPalIpAddr + mask + struct_etc_pal_netint_info.html + a155577b467420f0877aa19b7265565f3 + + + + EtcPalMacAddr + mac + struct_etc_pal_netint_info.html + a166afed9bf79aa905a870e4a130923ef + + + + char + id + struct_etc_pal_netint_info.html + a3548252138686cd633b4730070e2311f + [ETCPAL_NETINTINFO_ID_LEN] + + + char + friendly_name + struct_etc_pal_netint_info.html + a3fa69022d71df27910811117d3e232fd + [ETCPAL_NETINTINFO_FRIENDLY_NAME_LEN] + + + bool + is_default + struct_etc_pal_netint_info.html + a0c9f19a7b68ad0dad836ee153d3a230a + + + + + EtcPalPollEvent + struct_etc_pal_poll_event.html + + etcpal_socket_t + socket + struct_etc_pal_poll_event.html + ad32899ff82c07979513229c6f83c5f05 + + + + etcpal_poll_events_t + events + struct_etc_pal_poll_event.html + a8c1a86a9a616989de3fcced4b0c0e1f7 + + + + etcpal_error_t + err + struct_etc_pal_poll_event.html + a13b5fda068afcd9c79a54263a9fe7b07 + + + + void * + user_data + struct_etc_pal_poll_event.html + a0f53d287ac7c064d1a49d4bd93ca1cb9 + + + + + EtcPalRbIter + struct_etc_pal_rb_iter.html + + EtcPalRbTree * + tree + struct_etc_pal_rb_iter.html + a3dc7beb088200d742f70c0c895b376c4 + + + + EtcPalRbNode * + node + struct_etc_pal_rb_iter.html + a46745baa1082347489f1dd6dd68c7afa + + + + EtcPalRbNode * + path + struct_etc_pal_rb_iter.html + a6d248403d379988dac19bf98cfeb84b9 + [ETCPAL_RB_ITER_MAX_HEIGHT] + + + size_t + top + struct_etc_pal_rb_iter.html + ab9332a87d0af5aa12cac847eff68b7af + + + + void * + info + struct_etc_pal_rb_iter.html + acb1df3a0f703b05bc4971f79cabe2597 + + + + + EtcPalRbNode + struct_etc_pal_rb_node.html + + int + red + struct_etc_pal_rb_node.html + a6761340706096510fd89edca40a63b9b + + + + EtcPalRbNode * + link + struct_etc_pal_rb_node.html + a629e7a1728cfe5d93fe2381d793ef93f + [2] + + + void * + value + struct_etc_pal_rb_node.html + a0f61d63b009d0880a89c843bd50d8d76 + + + + + EtcPalRbTree + struct_etc_pal_rb_tree.html + + EtcPalRbNode * + root + struct_etc_pal_rb_tree.html + ae96f5aa846cba3ae538255b01f066bea + + + + EtcPalRbTreeNodeCmpFunc + cmp + struct_etc_pal_rb_tree.html + a7b29df8f3907a7cb322be7a1cb130670 + + + + size_t + size + struct_etc_pal_rb_tree.html + a854352f53b148adc24983a58a1866d66 + + + + EtcPalRbNodeAllocFunc + alloc_f + struct_etc_pal_rb_tree.html + a2969aaea1ac7bf7f69dba4965e8b8d5b + + + + EtcPalRbNodeDeallocFunc + dealloc_f + struct_etc_pal_rb_tree.html + a29c69388460d3c40b35a388dcbea6b58 + + + + void * + info + struct_etc_pal_rb_tree.html + acb1df3a0f703b05bc4971f79cabe2597 + + + + + EtcPalSockAddr + struct_etc_pal_sock_addr.html + + uint16_t + port + struct_etc_pal_sock_addr.html + a8e0798404bf2cf5dabb84c5ba9a4f236 + + + + EtcPalIpAddr + ip + struct_etc_pal_sock_addr.html + a19cc8016f534a565f984438cfe911a9e + + + + + EtcPalSyslogParams + struct_etc_pal_syslog_params.html + + int + facility + struct_etc_pal_syslog_params.html + a213afa2e73e0c2102f43d4067e41b90f + + + + char + hostname + struct_etc_pal_syslog_params.html + acf45ed2a37e15e83167bd1edcd9fbbbe + [ETCPAL_LOG_HOSTNAME_MAX_LEN] + + + char + app_name + struct_etc_pal_syslog_params.html + a6d20b2dcf8c2bc4f864b3d719ad00ad0 + [ETCPAL_LOG_APP_NAME_MAX_LEN] + + + char + procid + struct_etc_pal_syslog_params.html + aa3d06040894562832d2218511875b444 + [ETCPAL_LOG_PROCID_MAX_LEN] + + + + EtcPalThreadParams + struct_etc_pal_thread_params.html + + unsigned int + priority + struct_etc_pal_thread_params.html + a1e440af9e86f7a3c2784c3e2bd687d25 + + + + unsigned int + stack_size + struct_etc_pal_thread_params.html + adde5266300e9cdd7ca1134daba9adf24 + + + + const char * + thread_name + struct_etc_pal_thread_params.html + af081a07b0c5074db7c1896da8fb72e81 + + + + void * + platform_data + struct_etc_pal_thread_params.html + ac7426f48be885f66ad98c90f342f653b + + + + + EtcPalTimer + struct_etc_pal_timer.html + + uint32_t + reset_time + struct_etc_pal_timer.html + a8fb66f63094794fbbdacc69af5cc55fa + + + + uint32_t + interval + struct_etc_pal_timer.html + acd9ed1ccc44de55e1d3eff5569663695 + + + + + EtcPalUuid + struct_etc_pal_uuid.html + + uint8_t + data + struct_etc_pal_uuid.html + a814a9e92ac05977a8fce43ba49425d14 + [ETCPAL_UUID_BYTES] + + + + etcpal::Expected + classetcpal_1_1_expected.html + T + + T + ValueType + classetcpal_1_1_expected.html + aecaeabaa9da616ae42bb20787878260d + + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + a9e2d2226ed3d9558528f40d1e8cdb90a + () + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + af47fca6f0a4334c9331b742efa869cb5 + (const Expected &other)=default + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + abf3e9a1d1447150ab2f8d6dcdd3e8781 + (Expected &&other)=default + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + a76e78926d166ad8e9d61586963fc078f + (const Expected< U > &other, ETCPAL_ENABLE_IF_ARG(std::is_constructible< T, const U &>::value &&!std::is_constructible< T, Expected< U > &>::value &&!std::is_constructible< T, Expected< U > &&>::value &&!std::is_constructible< T, Expected< U > const &>::value &&!std::is_constructible< T, Expected< U > const &&>::value &&!std::is_convertible< Expected< U > &, T >::value &&!std::is_convertible< Expected< U > &&, T >::value &&!std::is_convertible< Expected< U > const &, T >::value &&!std::is_convertible< Expected< U > const &&, T >::value &&!std::is_convertible< const U &, T >::value)) + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + ae4842b36d4f8813847dfc700633b08f0 + (const Expected< U > &other, ETCPAL_ENABLE_IF_ARG(std::is_constructible< T, const U &>::value &&!std::is_constructible< T, Expected< U > &>::value &&!std::is_constructible< T, Expected< U > &&>::value &&!std::is_constructible< T, Expected< U > const &>::value &&!std::is_constructible< T, Expected< U > const &&>::value &&!std::is_convertible< Expected< U > &, T >::value &&!std::is_convertible< Expected< U > &&, T >::value &&!std::is_convertible< Expected< U > const &, T >::value &&!std::is_convertible< Expected< U > const &&, T >::value &&std::is_convertible< const U &, T >::value)) + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + ac20996a0e3daf91215530876a7300f19 + (Expected< U > &&other, ETCPAL_ENABLE_IF_ARG(std::is_constructible< T, U >::value &&!std::is_constructible< T, Expected< U > &>::value &&!std::is_constructible< T, Expected< U > &&>::value &&!std::is_constructible< T, Expected< U > const &>::value &&!std::is_constructible< T, Expected< U > const &&>::value &&!std::is_convertible< Expected< U > &, T >::value &&!std::is_convertible< Expected< U > &&, T >::value &&!std::is_convertible< Expected< U > const &, T >::value &&!std::is_convertible< Expected< U > const &&, T >::value &&!std::is_convertible< U, T >::value)) + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + ab6d89b907f9b5b8773739bb7a1eab687 + (Expected< U > &&other, ETCPAL_ENABLE_IF_ARG(std::is_constructible< T, U >::value &&!std::is_constructible< T, Expected< U > &>::value &&!std::is_constructible< T, Expected< U > &&>::value &&!std::is_constructible< T, Expected< U > const &>::value &&!std::is_constructible< T, Expected< U > const &&>::value &&!std::is_convertible< Expected< U > &, T >::value &&!std::is_convertible< Expected< U > &&, T >::value &&!std::is_convertible< Expected< U > const &, T >::value &&!std::is_convertible< Expected< U > const &&, T >::value &&std::is_convertible< U, T >::value)) + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + a545cdd9fdc844d352d39aeb345774069 + (U &&value, ETCPAL_ENABLE_IF_ARG(std::is_constructible< T, U &&>::value &&!std::is_convertible< U &&, T >::value)) noexcept(std::is_nothrow_move_constructible< U >::value) + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + ac7a8678f6251b90111837a493eef9abe + (U &&value, ETCPAL_ENABLE_IF_ARG(std::is_constructible< T, U &&>::value &&std::is_convertible< U &&, T >::value)) noexcept(std::is_nothrow_move_constructible< U >::value) + + + ETCPAL_CONSTEXPR_14 + Expected + classetcpal_1_1_expected.html + ab223fb4af6a34c52a294fb48e37c92c6 + (etcpal_error_t error) + + + + ~Expected + classetcpal_1_1_expected.html + a8da4910031b4040699233168372b0102 + () + + + constexpr const T * + operator-> + classetcpal_1_1_expected.html + a59a8d66ef67871af2a14f8cc08dc1d2e + () const + + + T * + operator-> + classetcpal_1_1_expected.html + a4442b1b9eab40e7939e1e01cdedcb7ae + () + + + constexpr const T & + operator* + classetcpal_1_1_expected.html + a6573281a3d9396dfc8c2c5f1cca82247 + () const & + + + T & + operator* + classetcpal_1_1_expected.html + aef577cb229ef2a9d16ea231ab32bb90d + () & + + + constexpr const T && + operator* + classetcpal_1_1_expected.html + a9fde1d75aef70226df99291f44c4c7d5 + () const && + + + ETCPAL_CONSTEXPR_14 T && + operator* + classetcpal_1_1_expected.html + aec2b0f86ca602b33ae1bbe4e72cd571e + () && + + + constexpr + operator bool + classetcpal_1_1_expected.html + a7990d8e87d9eab2383f94c88c23a6488 + () const noexcept + + + constexpr bool + has_value + classetcpal_1_1_expected.html + a6988ba57722f67cbb444b0931468282e + () const noexcept + + + ETCPAL_CONSTEXPR_14 const T & + value + classetcpal_1_1_expected.html + a35aa923de0534bc610141949cd6fdf89 + () const & + + + T & + value + classetcpal_1_1_expected.html + a316aefaaaa5e04f8843b07749e04d759 + () & + + + ETCPAL_CONSTEXPR_14 const T && + value + classetcpal_1_1_expected.html + ad75797dec2450b8f01fee82544b9526b + () const && + + + ETCPAL_CONSTEXPR_14 T && + value + classetcpal_1_1_expected.html + abdfb1ce4b51972bd578d02bd8d1daa0c + () && + + + constexpr etcpal_error_t + error_code + classetcpal_1_1_expected.html + ad74bb8607bbb3705c22342bd852e16b8 + () const noexcept + + + constexpr Error + error + classetcpal_1_1_expected.html + a60850b440a4ff7f769627b46d79043f6 + () const noexcept + + + constexpr T + value_or + classetcpal_1_1_expected.html + a6d0e422ee375e26a6b855848674309d5 + (U &&def_val) const & + + + T + value_or + classetcpal_1_1_expected.html + aa673d764741af614d297d71e984e592f + (U &&def_val) && + + + + etcpal::IpAddr + classetcpal_1_1_ip_addr.html + + ETCPAL_CONSTEXPR_14 + IpAddr + classetcpal_1_1_ip_addr.html + a523a252e7d40b2a5b8583f5f221adb1d + () noexcept + + + constexpr + IpAddr + classetcpal_1_1_ip_addr.html + a28a58c127368fb46de6446c3b17a4efe + (const EtcPalIpAddr &c_ip) noexcept + + + IpAddr & + operator= + classetcpal_1_1_ip_addr.html + af68058aa8f42f5ce7aa01eb92b583bd1 + (const EtcPalIpAddr &c_ip) noexcept + + + ETCPAL_CONSTEXPR_14 + IpAddr + classetcpal_1_1_ip_addr.html + af9b84482c3f11b17d4824c7214773c75 + (uint32_t v4_data) noexcept + + + + IpAddr + classetcpal_1_1_ip_addr.html + a10a0e9f0e89374ef5543a40bb6e9aafb + (const uint8_t *v6_data) noexcept + + + + IpAddr + classetcpal_1_1_ip_addr.html + abd1c05fc9b5b627f239972390c0bfeab + (const uint8_t *v6_data, unsigned long scope_id) noexcept + + + constexpr const EtcPalIpAddr & + get + classetcpal_1_1_ip_addr.html + a3e6b24d4d6021ab1a11314af504e91cb + () const noexcept + + + ETCPAL_CONSTEXPR_14 EtcPalIpAddr & + get + classetcpal_1_1_ip_addr.html + a75b91a1739e1ee6a888b8f518288e51d + () noexcept + + + std::string + ToString + classetcpal_1_1_ip_addr.html + a19c380b03cea21d7ac7325136a131ff0 + () const + + + constexpr uint32_t + v4_data + classetcpal_1_1_ip_addr.html + acde4ca75e6e22c1a6899c84d923273db + () const noexcept + + + constexpr const uint8_t * + v6_data + classetcpal_1_1_ip_addr.html + af7af815dfdf62cfaa17f98743a769028 + () const noexcept + + + std::array< uint8_t, ETCPAL_IPV6_BYTES > + ToV6Array + classetcpal_1_1_ip_addr.html + a9d6d96f2d5b5fb9fd6a16bcceb8dea59 + () const + + + constexpr unsigned long + scope_id + classetcpal_1_1_ip_addr.html + a14185dd1b4566147495318504a551034 + () const noexcept + + + constexpr bool + IsValid + classetcpal_1_1_ip_addr.html + a6d02bb05c3ab899ab6752bbab4e3dbcf + () const noexcept + + + constexpr IpAddrType + type + classetcpal_1_1_ip_addr.html + a6408a893e29a2fcb75d7c6c842db5902 + () const noexcept + + + constexpr bool + IsV4 + classetcpal_1_1_ip_addr.html + a3c808bdaebc8f534c871ac28bf379a7a + () const noexcept + + + constexpr bool + IsV6 + classetcpal_1_1_ip_addr.html + a08a35ea1e7f3f0a6047fbf28810d53e9 + () const noexcept + + + bool + IsLinkLocal + classetcpal_1_1_ip_addr.html + a211a72caa8aba79efd967fa3114e8c95 + () const noexcept + + + bool + IsLoopback + classetcpal_1_1_ip_addr.html + a4833f2d2e3f0434978f59f5020a7f84b + () const noexcept + + + bool + IsMulticast + classetcpal_1_1_ip_addr.html + a2f371a6bc900dd3ddcf0f7f16c5db00a + () const noexcept + + + bool + IsWildcard + classetcpal_1_1_ip_addr.html + ac384adc1cbf470fe6672659bdef8358c + () const noexcept + + + unsigned int + MaskLength + classetcpal_1_1_ip_addr.html + a0613200b3e9958598089ca48824732be + () const noexcept + + + void + SetAddress + classetcpal_1_1_ip_addr.html + a289b584a63be9da802a0692f16a9a7fc + (uint32_t v4_data) noexcept + + + void + SetAddress + classetcpal_1_1_ip_addr.html + a5b87e44914b8e5d6acc662c0e7ada452 + (const uint8_t *v6_data) noexcept + + + void + SetAddress + classetcpal_1_1_ip_addr.html + a5e188695085f61a2fd9c0ba28a6e0893 + (const uint8_t *v6_data, unsigned long scope_id) noexcept + + + static IpAddr + FromString + classetcpal_1_1_ip_addr.html + a431892e2354d1b617e2dd0278b8a9f30 + (const char *ip_str) noexcept + + + static IpAddr + FromString + classetcpal_1_1_ip_addr.html + a5c2b23004b9bdca3df3142b5f4fbd8ac + (const std::string &ip_str) noexcept + + + static IpAddr + WildcardV4 + classetcpal_1_1_ip_addr.html + a8ddb6547f191f5d3f3b24f3f02727095 + () noexcept + + + static IpAddr + WildcardV6 + classetcpal_1_1_ip_addr.html + a24fd3077450fceffa3e02fb4c76be7df + () noexcept + + + static IpAddr + Wildcard + classetcpal_1_1_ip_addr.html + a6dd5f9ef79404118ec2427c68eedad86 + (IpAddrType type) noexcept + + + static IpAddr + NetmaskV4 + classetcpal_1_1_ip_addr.html + a0dc66641cafbf7a9f76d26c494bfe189 + (unsigned int mask_length) noexcept + + + static IpAddr + NetmaskV6 + classetcpal_1_1_ip_addr.html + a69e83da0c99b42fe1be96dede839304d + (unsigned int mask_length) noexcept + + + static IpAddr + Netmask + classetcpal_1_1_ip_addr.html + a517378a65c041aa6ee09fc02765a5a97 + (IpAddrType type, unsigned int mask_length) noexcept + + + + etcpal::Logger + classetcpal_1_1_logger.html + + bool + Startup + classetcpal_1_1_logger.html + a84e487b1e20733405bd8b870e59f670c + (LogMessageHandler &message_handler) + + + void + Shutdown + classetcpal_1_1_logger.html + ac5f038c2b480cf9ef5e19e3eba8dbaf9 + () + + + bool + CanLog + classetcpal_1_1_logger.html + a446621c38cfc4ef6c119c8a26551ccc6 + (int pri) const noexcept + + + void + Log + classetcpal_1_1_logger.html + aa613ebedf6ebc98cccf35990217e2eab + (int pri, const char *format,...) + + + void + Debug + classetcpal_1_1_logger.html + ae78231bc988b651151e0f7099a873daa + (const char *format,...) + + + void + Info + classetcpal_1_1_logger.html + a221110f73de7530eee4f76769cabaf2b + (const char *format,...) + + + void + Notice + classetcpal_1_1_logger.html + af0b5bc31187a46a0e5913c493677ba5d + (const char *format,...) + + + void + Warning + classetcpal_1_1_logger.html + a97d41b6faaf421937e6b82bd1c3067db + (const char *format,...) + + + void + Error + classetcpal_1_1_logger.html + a4f9ab08aae7973ca510b477041857595 + (const char *format,...) + + + void + Critical + classetcpal_1_1_logger.html + a1c8920f98f8e58c892f8db1b07309c34 + (const char *format,...) + + + void + Alert + classetcpal_1_1_logger.html + a830c42c8d3d96a385510ae78142831e8 + (const char *format,...) + + + void + Emergency + classetcpal_1_1_logger.html + a5a0fec997bc336f87f4897c5a09b5ab1 + (const char *format,...) + + + LogDispatchPolicy + dispatch_policy + classetcpal_1_1_logger.html + a49d1636c7a4675c4bfc73cf52edacbc2 + () const noexcept + + + int + log_mask + classetcpal_1_1_logger.html + ad0d3bf4ed833ebbaa8529a171d788f20 + () const noexcept + + + int + log_action + classetcpal_1_1_logger.html + a5763d3286470e0ddf797daac285d7e40 + () const noexcept + + + int + syslog_facility + classetcpal_1_1_logger.html + a86ddfb490c635f56281f619b19123eea + () const noexcept + + + const char * + syslog_hostname + classetcpal_1_1_logger.html + aa4d690218c280782b01aff765846c818 + () const noexcept + + + const char * + syslog_app_name + classetcpal_1_1_logger.html + acb8556114216b68d3e01d9475f5a589b + () const noexcept + + + const char * + syslog_procid + classetcpal_1_1_logger.html + ab671d23235980e85a8c2b952f49aec24 + () const noexcept + + + const EtcPalLogParams & + log_params + classetcpal_1_1_logger.html + a986c589bfc9aa466a31a84a9b8575546 + () const noexcept + + + Logger & + SetDispatchPolicy + classetcpal_1_1_logger.html + aeec917862cd49bfea9ea69f0839e78d3 + (LogDispatchPolicy new_policy) noexcept + + + Logger & + SetLogMask + classetcpal_1_1_logger.html + adf3a549fed7e9cf73833af591af43071 + (int log_mask) noexcept + + + Logger & + SetLogAction + classetcpal_1_1_logger.html + a4ef737dccf9de6bcbeaa668726a4f146 + (int log_action) noexcept + + + Logger & + SetSyslogFacility + classetcpal_1_1_logger.html + a17b3a97c6ab3a6682d84b873edc89b66 + (int facility) noexcept + + + Logger & + SetSyslogHostname + classetcpal_1_1_logger.html + a96af94f561c632cd17da53244ddd5d8e + (const char *hostname) noexcept + + + Logger & + SetSyslogHostname + classetcpal_1_1_logger.html + a59327a03202053f8dd158fb6c2559c26 + (const std::string &hostname) noexcept + + + Logger & + SetSyslogAppName + classetcpal_1_1_logger.html + a97e218391233bbc428c3e5c2ab5a90bd + (const char *app_name) noexcept + + + Logger & + SetSyslogAppName + classetcpal_1_1_logger.html + a6a76c7662c48f17ae4bab5cdee6c867a + (const std::string &app_name) noexcept + + + Logger & + SetSyslogProcId + classetcpal_1_1_logger.html + adf81d73315c517070a3421a23cbf4c42 + (const char *proc_id) noexcept + + + Logger & + SetSyslogProcId + classetcpal_1_1_logger.html + ac450da9c26fe790b5e0464b93a2812a8 + (const std::string &proc_id) noexcept + + + Logger & + SetSyslogProcId + classetcpal_1_1_logger.html + af8cef80d64e0ac5719b61e726a63a977 + (int proc_id) noexcept + + + void + Debug + classetcpal_1_1_logger.html + ae78231bc988b651151e0f7099a873daa + (const char *format,...) + + + void + Info + classetcpal_1_1_logger.html + a221110f73de7530eee4f76769cabaf2b + (const char *format,...) + + + void + Notice + classetcpal_1_1_logger.html + af0b5bc31187a46a0e5913c493677ba5d + (const char *format,...) + + + void + Warning + classetcpal_1_1_logger.html + a97d41b6faaf421937e6b82bd1c3067db + (const char *format,...) + + + void + Error + classetcpal_1_1_logger.html + a4f9ab08aae7973ca510b477041857595 + (const char *format,...) + + + void + Critical + classetcpal_1_1_logger.html + a1c8920f98f8e58c892f8db1b07309c34 + (const char *format,...) + + + void + Alert + classetcpal_1_1_logger.html + a830c42c8d3d96a385510ae78142831e8 + (const char *format,...) + + + void + Emergency + classetcpal_1_1_logger.html + a5a0fec997bc336f87f4897c5a09b5ab1 + (const char *format,...) + + + LogDispatchPolicy + dispatch_policy + classetcpal_1_1_logger.html + a49d1636c7a4675c4bfc73cf52edacbc2 + () const noexcept + + + int + log_mask + classetcpal_1_1_logger.html + ad0d3bf4ed833ebbaa8529a171d788f20 + () const noexcept + + + int + log_action + classetcpal_1_1_logger.html + a5763d3286470e0ddf797daac285d7e40 + () const noexcept + + + int + syslog_facility + classetcpal_1_1_logger.html + a86ddfb490c635f56281f619b19123eea + () const noexcept + + + const char * + syslog_hostname + classetcpal_1_1_logger.html + aa4d690218c280782b01aff765846c818 + () const noexcept + + + const char * + syslog_app_name + classetcpal_1_1_logger.html + acb8556114216b68d3e01d9475f5a589b + () const noexcept + + + const char * + syslog_procid + classetcpal_1_1_logger.html + ab671d23235980e85a8c2b952f49aec24 + () const noexcept + + + const EtcPalLogParams & + log_params + classetcpal_1_1_logger.html + a986c589bfc9aa466a31a84a9b8575546 + () const noexcept + + + Logger & + SetDispatchPolicy + classetcpal_1_1_logger.html + aeec917862cd49bfea9ea69f0839e78d3 + (LogDispatchPolicy new_policy) noexcept + + + Logger & + SetLogMask + classetcpal_1_1_logger.html + adf3a549fed7e9cf73833af591af43071 + (int log_mask) noexcept + + + Logger & + SetLogAction + classetcpal_1_1_logger.html + a4ef737dccf9de6bcbeaa668726a4f146 + (int log_action) noexcept + + + Logger & + SetSyslogFacility + classetcpal_1_1_logger.html + a17b3a97c6ab3a6682d84b873edc89b66 + (int facility) noexcept + + + Logger & + SetSyslogHostname + classetcpal_1_1_logger.html + a96af94f561c632cd17da53244ddd5d8e + (const char *hostname) noexcept + + + Logger & + SetSyslogHostname + classetcpal_1_1_logger.html + a59327a03202053f8dd158fb6c2559c26 + (const std::string &hostname) noexcept + + + Logger & + SetSyslogAppName + classetcpal_1_1_logger.html + a97e218391233bbc428c3e5c2ab5a90bd + (const char *app_name) noexcept + + + Logger & + SetSyslogAppName + classetcpal_1_1_logger.html + a6a76c7662c48f17ae4bab5cdee6c867a + (const std::string &app_name) noexcept + + + Logger & + SetSyslogProcId + classetcpal_1_1_logger.html + adf81d73315c517070a3421a23cbf4c42 + (const char *proc_id) noexcept + + + Logger & + SetSyslogProcId + classetcpal_1_1_logger.html + ac450da9c26fe790b5e0464b93a2812a8 + (const std::string &proc_id) noexcept + + + Logger & + SetSyslogProcId + classetcpal_1_1_logger.html + af8cef80d64e0ac5719b61e726a63a977 + (int proc_id) noexcept + + + + etcpal::LogMessageHandler + classetcpal_1_1_log_message_handler.html + + virtual LogTimestamp + GetLogTimestamp + classetcpal_1_1_log_message_handler.html + aecfa86ca440c2005c89f7181678eac94 + () + + + virtual void + HandleLogMessage + classetcpal_1_1_log_message_handler.html + a9d89d39c4e9149f340fe950da112ec6c + (const EtcPalLogStrings &strings)=0 + + + + etcpal::LogTimestamp + classetcpal_1_1_log_timestamp.html + + + LogTimestamp + classetcpal_1_1_log_timestamp.html + aafc4ef91f7842e34f28549c8b9191376 + ()=default + + + constexpr + LogTimestamp + classetcpal_1_1_log_timestamp.html + a92d160221d22c19ccf9e027ad770a563 + (unsigned int year, unsigned int month, unsigned int day, unsigned int hour, unsigned int minute, unsigned int second, unsigned int msec=0, int utc_offset=0) + + + bool + IsValid + classetcpal_1_1_log_timestamp.html + a472f705194218179e9cf26ffb288da6c + () const noexcept + + + constexpr const EtcPalLogTimestamp & + get + classetcpal_1_1_log_timestamp.html + a45b0c3e59f7392736d9a1f7a91ab6e7e + () const noexcept + + + ETCPAL_CONSTEXPR_14 EtcPalLogTimestamp & + get + classetcpal_1_1_log_timestamp.html + a64e9febebf141fb0bc4184c13959ce80 + () noexcept + + + static LogTimestamp + Invalid + classetcpal_1_1_log_timestamp.html + ad9fe329da06c0386ffc6fd84b840dcc9 + () + + + + etcpal::MacAddr + classetcpal_1_1_mac_addr.html + + + MacAddr + classetcpal_1_1_mac_addr.html + ae745add18e97ed3960a513f993c4fd39 + ()=default + + + constexpr + MacAddr + classetcpal_1_1_mac_addr.html + a786b90567f5a0f50072a11180bed1e63 + (const EtcPalMacAddr &c_mac) noexcept + + + MacAddr & + operator= + classetcpal_1_1_mac_addr.html + abf74026b5f8428336b974584cbd534df + (const EtcPalMacAddr &c_mac) noexcept + + + + MacAddr + classetcpal_1_1_mac_addr.html + aff3e9838bb257f6f5c09396be07fa4f3 + (const uint8_t *mac_data) noexcept + + + constexpr const EtcPalMacAddr & + get + classetcpal_1_1_mac_addr.html + ab9705cc97de2a4013b231b7bde2ad82b + () const noexcept + + + ETCPAL_CONSTEXPR_14 EtcPalMacAddr & + get + classetcpal_1_1_mac_addr.html + a770c9d747f6e9be2eef81c41e926d660 + () noexcept + + + std::string + ToString + classetcpal_1_1_mac_addr.html + a19c380b03cea21d7ac7325136a131ff0 + () const + + + constexpr const uint8_t * + data + classetcpal_1_1_mac_addr.html + a3f4c46c5e6a3a561bad84c6a91ecc8f0 + () const noexcept + + + std::array< uint8_t, ETCPAL_MAC_BYTES > + ToArray + classetcpal_1_1_mac_addr.html + a9ef1e40476be6ec748b2cb8d1e7235ce + () const noexcept + + + bool + IsNull + classetcpal_1_1_mac_addr.html + a27909eb1d61b8b261d259be7c70c58dd + () const noexcept + + + static MacAddr + FromString + classetcpal_1_1_mac_addr.html + a32186693c8d1faea349dc007768684b4 + (const char *mac_str) noexcept + + + static MacAddr + FromString + classetcpal_1_1_mac_addr.html + a4ddd74c443669ab0d7c1aefac0e13fd7 + (const std::string &mac_str) noexcept + + + + etcpal::Mutex + classetcpal_1_1_mutex.html + + + Mutex + classetcpal_1_1_mutex.html + a4b5dfbd24f5bc4c03b24b2da362f66d5 + () + + + + ~Mutex + classetcpal_1_1_mutex.html + a205e2c334b25cb96e4f1303a4fde6b0c + () + + + bool + Lock + classetcpal_1_1_mutex.html + a747fd95916e116a6ed37cc641e394c69 + () + + + bool + TryLock + classetcpal_1_1_mutex.html + a8ad93c25cdc665654314bba0797d37ef + (int timeout_ms=0) + + + void + Unlock + classetcpal_1_1_mutex.html + a91b88a5d5517cb042431c4ea24d8ecb7 + () + + + etcpal_mutex_t & + get + classetcpal_1_1_mutex.html + a969165b5fad27bd7ae7a693703124645 + () + + + + etcpal::MutexGuard + classetcpal_1_1_mutex_guard.html + + + MutexGuard + classetcpal_1_1_mutex_guard.html + a72577d0ea01f7607a671de23cc54eb06 + (Mutex &mutex) + + + + MutexGuard + classetcpal_1_1_mutex_guard.html + a057d36a0206d67c6b8b9c5d8186c2e9e + (etcpal_mutex_t &mutex) + + + + ~MutexGuard + classetcpal_1_1_mutex_guard.html + a310e9063e3e9794762a2cf28c6148334 + () + + + + etcpal::Queue + classetcpal_1_1_queue.html + T + + + Queue + classetcpal_1_1_queue.html + ae729f6dede41f22b98b861eac4ac1895 + (size_t size) + + + + ~Queue + classetcpal_1_1_queue.html + a240bdcfcc136e53aeaac3aa454cc26bf + () + + + bool + Send + classetcpal_1_1_queue.html + ad23735bc801c21635a277a31ac31b267 + (const T &data, int timeout_ms=ETCPAL_WAIT_FOREVER) + + + bool + SendFromIsr + classetcpal_1_1_queue.html + a4a645b7a56c142bd9b04f703893a5879 + (const T &data) + + + bool + Receive + classetcpal_1_1_queue.html + ae2bd22bccd067e5b8558810eb878f7bf + (T &data, int timeout_ms=ETCPAL_WAIT_FOREVER) + + + bool + Receive + classetcpal_1_1_queue.html + a2e1a4a59421e30ad677c4aab766a6683 + (T &data, const std::chrono::duration< Rep, Period > &timeout) + + + bool + IsEmpty + classetcpal_1_1_queue.html + a8e12342fc420701fbffd97025421575a + () const + + + bool + IsEmptyFromIsr + classetcpal_1_1_queue.html + a9cc49246382de0eeb66f493207fb4dbc + () const + + + + etcpal::ReadGuard + classetcpal_1_1_read_guard.html + + + ReadGuard + classetcpal_1_1_read_guard.html + a4bbe0587143829b91a5169449360eaa4 + (RwLock &rwlock) + + + + ReadGuard + classetcpal_1_1_read_guard.html + a972ca1d800d0b9f661de63a8764b74ae + (etcpal_rwlock_t &rwlock) + + + + ~ReadGuard + classetcpal_1_1_read_guard.html + af40fbc4ea83eb91ffa11e2e0a17e5e22 + () + + + + etcpal::RwLock + classetcpal_1_1_rw_lock.html + + + RwLock + classetcpal_1_1_rw_lock.html + ad5ce7091375083d76ae798cabac53a21 + () + + + + ~RwLock + classetcpal_1_1_rw_lock.html + a31fcfa6d9b8bcf5a64823de7c0b1313a + () + + + bool + ReadLock + classetcpal_1_1_rw_lock.html + af760aebc292f4430c5d554b1fb239284 + () + + + bool + TryReadLock + classetcpal_1_1_rw_lock.html + ac46abb95ae4ab3f37da632ea31f01535 + (int timeout_ms=0) + + + void + ReadUnlock + classetcpal_1_1_rw_lock.html + a1860d89c46fea6b62da4c7c39756fc4e + () + + + bool + WriteLock + classetcpal_1_1_rw_lock.html + a062052c7ab44662cc7d5a2bf81f4a87c + () + + + bool + TryWriteLock + classetcpal_1_1_rw_lock.html + adfd977b8c35b753a7341a6e64864fa6f + (int timeout_ms=0) + + + void + WriteUnlock + classetcpal_1_1_rw_lock.html + abfc3bd44b6252464c577c5ed8389dbd4 + () + + + etcpal_rwlock_t & + get + classetcpal_1_1_rw_lock.html + a16634332a0b44a7bedfcc491383c4fe5 + () + + + + etcpal::Semaphore + classetcpal_1_1_semaphore.html + + + Semaphore + classetcpal_1_1_semaphore.html + a7afb6e444c74ed583a47dc7bc8bd45e3 + (unsigned int initial_count=0, unsigned int max_count=kDefaultMaxCount) + + + + ~Semaphore + classetcpal_1_1_semaphore.html + a5e0394d4ca6109ccb52b3c1e5cf6c9b5 + () + + + bool + Wait + classetcpal_1_1_semaphore.html + ae5ccc0d2886026ce37e12604173a131d + () + + + bool + TryWait + classetcpal_1_1_semaphore.html + aa5139da6cf3fc487370524d466cdadd7 + (int timeout_ms=0) + + + bool + Post + classetcpal_1_1_semaphore.html + a75b89ae344bccade98754cd1fedb13ac + () + + + bool + PostFromIsr + classetcpal_1_1_semaphore.html + a4e8596ce5216d9d86625212982825670 + () + + + etcpal_sem_t & + get + classetcpal_1_1_semaphore.html + a35238d018ce1903b9713675b075f2e38 + () + + + static constexpr unsigned int + kDefaultMaxCount + classetcpal_1_1_semaphore.html + a3486903fdf2712a41832d21fdfd5bc0b + + + + + etcpal::Signal + classetcpal_1_1_signal.html + + + Signal + classetcpal_1_1_signal.html + a44146dfdbec17a8ab7207e52ffae152c + () + + + + ~Signal + classetcpal_1_1_signal.html + a20038cb30942f02ef70185cdaed0227a + () + + + bool + Wait + classetcpal_1_1_signal.html + ae5ccc0d2886026ce37e12604173a131d + () + + + bool + TryWait + classetcpal_1_1_signal.html + aa5139da6cf3fc487370524d466cdadd7 + (int timeout_ms=0) + + + void + Notify + classetcpal_1_1_signal.html + a6b945888ffd146338605d77f0366141b + () + + + void + NotifyFromIsr + classetcpal_1_1_signal.html + ad8b69b07e8a31350db1cd221db678cb3 + () + + + etcpal_signal_t & + get + classetcpal_1_1_signal.html + a57e433d2fa16d80ff2f02992c74d480c + () + + + + etcpal::SockAddr + classetcpal_1_1_sock_addr.html + + ETCPAL_CONSTEXPR_14 + SockAddr + classetcpal_1_1_sock_addr.html + acde4b684334acb25ea606acc6a032f09 + () noexcept + + + constexpr + SockAddr + classetcpal_1_1_sock_addr.html + a9556543d23d3536e03f7319b50599ddf + (const EtcPalSockAddr &c_sa) noexcept + + + SockAddr & + operator= + classetcpal_1_1_sock_addr.html + aa75677e1db37e94003d6f82a25934b0f + (const EtcPalSockAddr &c_sa) noexcept + + + ETCPAL_CONSTEXPR_14 + SockAddr + classetcpal_1_1_sock_addr.html + a469f8a5f9d3f701c84668336a47151c2 + (uint32_t v4_data, uint16_t port) noexcept + + + + SockAddr + classetcpal_1_1_sock_addr.html + a47df50740970dda850f7f8d748381dd4 + (const uint8_t *v6_data, uint16_t port) noexcept + + + + SockAddr + classetcpal_1_1_sock_addr.html + afc7a705bc0a693bf397d9862d9cd8b0a + (const uint8_t *v6_data, unsigned long scope_id, uint16_t port) noexcept + + + ETCPAL_CONSTEXPR_14 + SockAddr + classetcpal_1_1_sock_addr.html + a5522a6d8c6699b7bee4b26cb1cfb7266 + (IpAddr ip, uint16_t port) noexcept + + + constexpr const EtcPalSockAddr & + get + classetcpal_1_1_sock_addr.html + a59860773d22c6c62384a1fe03e774630 + () const noexcept + + + ETCPAL_CONSTEXPR_14 EtcPalSockAddr & + get + classetcpal_1_1_sock_addr.html + adc9363fc5e38a1d24c5f6c2c41873c8d + () noexcept + + + std::string + ToString + classetcpal_1_1_sock_addr.html + a19c380b03cea21d7ac7325136a131ff0 + () const + + + constexpr IpAddr + ip + classetcpal_1_1_sock_addr.html + a3ab600814133b2eb30bfc9d2816d6acd + () const noexcept + + + constexpr uint16_t + port + classetcpal_1_1_sock_addr.html + abab82fa2b4ca400b38cb9691a2c3fb8a + () const noexcept + + + constexpr uint32_t + v4_data + classetcpal_1_1_sock_addr.html + acde4ca75e6e22c1a6899c84d923273db + () const noexcept + + + constexpr const uint8_t * + v6_data + classetcpal_1_1_sock_addr.html + af7af815dfdf62cfaa17f98743a769028 + () const noexcept + + + std::array< uint8_t, ETCPAL_IPV6_BYTES > + ToV6Array + classetcpal_1_1_sock_addr.html + a9d6d96f2d5b5fb9fd6a16bcceb8dea59 + () const + + + constexpr unsigned long + scope_id + classetcpal_1_1_sock_addr.html + a14185dd1b4566147495318504a551034 + () const noexcept + + + constexpr bool + IsValid + classetcpal_1_1_sock_addr.html + a6d02bb05c3ab899ab6752bbab4e3dbcf + () const noexcept + + + constexpr IpAddrType + type + classetcpal_1_1_sock_addr.html + a6408a893e29a2fcb75d7c6c842db5902 + () const noexcept + + + constexpr bool + IsV4 + classetcpal_1_1_sock_addr.html + a3c808bdaebc8f534c871ac28bf379a7a + () const noexcept + + + constexpr bool + IsV6 + classetcpal_1_1_sock_addr.html + a08a35ea1e7f3f0a6047fbf28810d53e9 + () const noexcept + + + bool + IsLinkLocal + classetcpal_1_1_sock_addr.html + a211a72caa8aba79efd967fa3114e8c95 + () const noexcept + + + bool + IsLoopback + classetcpal_1_1_sock_addr.html + a4833f2d2e3f0434978f59f5020a7f84b + () const noexcept + + + bool + IsMulticast + classetcpal_1_1_sock_addr.html + a2f371a6bc900dd3ddcf0f7f16c5db00a + () const noexcept + + + bool + IsWildcard + classetcpal_1_1_sock_addr.html + ac384adc1cbf470fe6672659bdef8358c + () const noexcept + + + void + SetAddress + classetcpal_1_1_sock_addr.html + a289b584a63be9da802a0692f16a9a7fc + (uint32_t v4_data) noexcept + + + void + SetAddress + classetcpal_1_1_sock_addr.html + a5b87e44914b8e5d6acc662c0e7ada452 + (const uint8_t *v6_data) noexcept + + + void + SetAddress + classetcpal_1_1_sock_addr.html + a5e188695085f61a2fd9c0ba28a6e0893 + (const uint8_t *v6_data, unsigned long scope_id) noexcept + + + void + SetAddress + classetcpal_1_1_sock_addr.html + a297607ac00a2f71ea955edfbaa43875f + (const IpAddr &ip) noexcept + + + void + SetPort + classetcpal_1_1_sock_addr.html + a8f2a678aed9c3bdd389633dea859b5d2 + (uint16_t port) noexcept + + + + etcpal::Thread + classetcpal_1_1_thread.html + + + Thread + classetcpal_1_1_thread.html + acf0ebde1823ff6854a4add729b40a0c4 + ()=default + + + + Thread + classetcpal_1_1_thread.html + a7d7f5dbaad78386dbac48435086454ca + (Function &&func, Args &&... args) + + + virtual + ~Thread + classetcpal_1_1_thread.html + a87a9c69a69ee4b13cb1ec5772f6d32ad + () + + + + Thread + classetcpal_1_1_thread.html + a6fb67adc8253034f42e5a43df0df0662 + (Thread &&other) noexcept + + + Thread & + operator= + classetcpal_1_1_thread.html + a74ee56b6a23061aaff2a2e34b6035f32 + (Thread &&other) noexcept + + + + Thread + classetcpal_1_1_thread.html + a856d2ee521709c03d8499d926783117b + (const Thread &other)=delete + + + Thread & + operator= + classetcpal_1_1_thread.html + abd79ef28387daa09c6c37909bdff5c69 + (const Thread &other)=delete + + + bool + joinable + classetcpal_1_1_thread.html + a2761ee590c5de6d2d9d0045c5d6d9cb7 + () const noexcept + + + Error + Start + classetcpal_1_1_thread.html + a63e85f031a9b180d9e932df21f7a2e64 + (Function &&func, Args &&... args) + + + Error + Join + classetcpal_1_1_thread.html + aea418c2372922b6b295e06814c4fe988 + (int timeout_ms=ETCPAL_WAIT_FOREVER) noexcept + + + Error + Terminate + classetcpal_1_1_thread.html + a07e5d2b8f7fce024200c4ec8a41c6570 + () noexcept + + + unsigned int + priority + classetcpal_1_1_thread.html + a22b3fcc6a92ed687e662730c073d9f7d + () const noexcept + + + unsigned int + stack_size + classetcpal_1_1_thread.html + a1e4efbd2bc46e7d5a1b2077ff2038ad8 + () const noexcept + + + const char * + name + classetcpal_1_1_thread.html + a33256784969e3347f423f72af1727cbd + () const noexcept + + + void * + platform_data + classetcpal_1_1_thread.html + ac0e98e4ce31becd580ed2ea39cd926b3 + () const noexcept + + + const EtcPalThreadParams & + params + classetcpal_1_1_thread.html + aa66aa5c50746cd41312f22bebbf0d4e0 + () const noexcept + + + Thread & + SetPriority + classetcpal_1_1_thread.html + ac83a10f16662668e1d8a494ddb6e1234 + (unsigned int priority) noexcept + + + Thread & + SetStackSize + classetcpal_1_1_thread.html + a3cb4d6197b72897c0ceba341f7beff4b + (unsigned int stack_size) noexcept + + + Thread & + SetName + classetcpal_1_1_thread.html + ae6cedd23a7b2b24f90059df894846864 + (const char *name) noexcept + + + Thread & + SetName + classetcpal_1_1_thread.html + afe34480dc3ef0d8b9f74e389ec1ca647 + (const std::string &name) noexcept + + + Thread & + SetPlatformData + classetcpal_1_1_thread.html + a23a3a84c2368bdf07cf64e1b49df5364 + (void *platform_data) noexcept + + + static void + Sleep + classetcpal_1_1_thread.html + abc8bb8ec9948b769e1189506ed635c9d + (unsigned int ms) noexcept + + + static void + Sleep + classetcpal_1_1_thread.html + a0e7e603ebed62b739065a10cd090213b + (const std::chrono::duration< Rep, Period > &sleep_duration) noexcept + + + unsigned int + priority + classetcpal_1_1_thread.html + a22b3fcc6a92ed687e662730c073d9f7d + () const noexcept + + + unsigned int + stack_size + classetcpal_1_1_thread.html + a1e4efbd2bc46e7d5a1b2077ff2038ad8 + () const noexcept + + + const char * + name + classetcpal_1_1_thread.html + a33256784969e3347f423f72af1727cbd + () const noexcept + + + void * + platform_data + classetcpal_1_1_thread.html + ac0e98e4ce31becd580ed2ea39cd926b3 + () const noexcept + + + const EtcPalThreadParams & + params + classetcpal_1_1_thread.html + aa66aa5c50746cd41312f22bebbf0d4e0 + () const noexcept + + + Thread & + SetPriority + classetcpal_1_1_thread.html + ac83a10f16662668e1d8a494ddb6e1234 + (unsigned int priority) noexcept + + + Thread & + SetStackSize + classetcpal_1_1_thread.html + a3cb4d6197b72897c0ceba341f7beff4b + (unsigned int stack_size) noexcept + + + Thread & + SetName + classetcpal_1_1_thread.html + ae6cedd23a7b2b24f90059df894846864 + (const char *name) noexcept + + + Thread & + SetName + classetcpal_1_1_thread.html + afe34480dc3ef0d8b9f74e389ec1ca647 + (const std::string &name) noexcept + + + Thread & + SetPlatformData + classetcpal_1_1_thread.html + a23a3a84c2368bdf07cf64e1b49df5364 + (void *platform_data) noexcept + + + + etcpal::TimePoint + classetcpal_1_1_time_point.html + + + TimePoint + classetcpal_1_1_time_point.html + a93ecbb20d00c0710c4f157e7742284ec + ()=default + + + constexpr + TimePoint + classetcpal_1_1_time_point.html + a9e33e8be45ccfa82649b1bf83c58dbf1 + (uint32_t ms) + + + constexpr uint32_t + value + classetcpal_1_1_time_point.html + a5d63d7a2a8500832a76b5f290855db7a + () const noexcept + + + ETCPAL_CONSTEXPR_14 TimePoint & + operator+= + classetcpal_1_1_time_point.html + a6a14c3d43be754d39a7d9c2d99f1474b + (uint32_t duration) noexcept + + + ETCPAL_CONSTEXPR_14 TimePoint & + operator-= + classetcpal_1_1_time_point.html + a549bf3fd540fc1941bc8a1444f2aa674 + (uint32_t duration) noexcept + + + static TimePoint + Now + classetcpal_1_1_time_point.html + ac59e08d917c73620c51f17923428da50 + () noexcept + + + + etcpal::Timer + classetcpal_1_1_timer.html + + + Timer + classetcpal_1_1_timer.html + a17896e888578cea83217f4bbef07559a + ()=default + + + constexpr + Timer + classetcpal_1_1_timer.html + a5928d7d2dc01f531f03c5fcabfeade24 + (const EtcPalTimer &c_timer) noexcept + + + Timer & + operator= + classetcpal_1_1_timer.html + a61c351ff21dcef79e989311e2e2057b2 + (const EtcPalTimer &c_timer) noexcept + + + + Timer + classetcpal_1_1_timer.html + a3fc5db10dfce0bef1c0eabfd21228c16 + (uint32_t interval) noexcept + + + + Timer + classetcpal_1_1_timer.html + a300613c1ac94259feced37fe034e1430 + (const std::chrono::duration< Rep, Period > &interval) noexcept + + + constexpr const EtcPalTimer & + get + classetcpal_1_1_timer.html + a78a1cc79e6d7f30343b81d73de6d0c58 + () const noexcept + + + ETCPAL_CONSTEXPR_14 EtcPalTimer & + get + classetcpal_1_1_timer.html + a66d897467a3ccc1cc83249c5111aeaf3 + () noexcept + + + TimePoint + GetStartTime + classetcpal_1_1_timer.html + a2e4c4be67a346b64e3e24b2f6bad80f4 + () const noexcept + + + uint32_t + GetInterval + classetcpal_1_1_timer.html + aa2140520712ad09c27123971fe4bc218 + () const noexcept + + + uint32_t + GetElapsed + classetcpal_1_1_timer.html + a8a45a2a5280e8f83c08f6a289b78d482 + () const noexcept + + + uint32_t + GetRemaining + classetcpal_1_1_timer.html + ae12c1dee0d60a4db943b872af5879f76 + () const noexcept + + + bool + IsExpired + classetcpal_1_1_timer.html + a3a79feefa8df553fd15b9997d0c3a719 + () const noexcept + + + void + Start + classetcpal_1_1_timer.html + ac3e8095b413fff42c74287c5b8fcf17d + (uint32_t interval) noexcept + + + void + Start + classetcpal_1_1_timer.html + a5128bf0001713abf0599593ac6eba81d + (const std::chrono::duration< Rep, Period > &interval) noexcept + + + void + Reset + classetcpal_1_1_timer.html + a77ebf418c2f554f19db18aa5adcd0366 + () noexcept + + + + etcpal::Uuid + classetcpal_1_1_uuid.html + + + Uuid + classetcpal_1_1_uuid.html + abc4f198636744d10b7c5e28a1ddde4b8 + ()=default + + + + Uuid + classetcpal_1_1_uuid.html + aa2f1033714bf728e62eafbc880d502b6 + (const uint8_t *data) noexcept + + + + Uuid + classetcpal_1_1_uuid.html + a65228b364866048f39a365f5aaabcccb + (uint32_t time_low, uint16_t time_mid, uint16_t time_hi_and_version, const uint8_t clock_seq_and_node[8]) + + + + Uuid + classetcpal_1_1_uuid.html + a3682e9b132ceba22426927fefdafdeb3 + (uint32_t time_low, uint16_t time_mid, uint16_t time_hi_and_version, const std::array< uint8_t, 8 > &clock_seq_and_node) + + + constexpr + Uuid + classetcpal_1_1_uuid.html + a5827f94a1dd0941f5b5842de4034d02b + (const EtcPalUuid &c_uuid) noexcept + + + Uuid & + operator= + classetcpal_1_1_uuid.html + ada902407e6c698801978a038afb1b4b5 + (const EtcPalUuid &c_uuid) noexcept + + + constexpr const EtcPalUuid & + get + classetcpal_1_1_uuid.html + a9df1babf3f2f1a535c4de0c397f92636 + () const noexcept + + + const uint8_t * + data + classetcpal_1_1_uuid.html + a21b8e060baa6eeed3e5e45e6d760b54c + () const noexcept + + + std::string + ToString + classetcpal_1_1_uuid.html + a19c380b03cea21d7ac7325136a131ff0 + () const + + + bool + IsNull + classetcpal_1_1_uuid.html + a27909eb1d61b8b261d259be7c70c58dd + () const noexcept + + + UuidVersion + version + classetcpal_1_1_uuid.html + ad844a4829fe094c9603211c8d13c37bb + () const noexcept + + + uint32_t + time_low + classetcpal_1_1_uuid.html + a197e772363eb4fb42ca981f6690cc6eb + () const noexcept + + + uint16_t + time_mid + classetcpal_1_1_uuid.html + a5a3534e539c75eb5add173f7f660d45a + () const noexcept + + + uint16_t + time_hi_and_version + classetcpal_1_1_uuid.html + a0fd84d72db93c35ce9d86a1fff1b1067 + () const noexcept + + + std::array< uint8_t, 8 > + clock_seq_and_node + classetcpal_1_1_uuid.html + ad1c7dfeea57e4e696bca56b1cb172292 + () const noexcept + + + static Uuid + FromString + classetcpal_1_1_uuid.html + ab017791f5f66829527591d8bd6bd840f + (const char *uuid_str) noexcept + + + static Uuid + FromString + classetcpal_1_1_uuid.html + a824ab92916f13aacf1899f5019093470 + (const std::string &uuid_str) noexcept + + + static Uuid + V1 + classetcpal_1_1_uuid.html + a05ce6a071ffc17d19fbc7818614af8d0 + () noexcept + + + static Uuid + V3 + classetcpal_1_1_uuid.html + acf48b871ad6aa14afc1a80cf688ae6f8 + (const Uuid &ns, const void *name, size_t name_len) noexcept + + + static Uuid + V3 + classetcpal_1_1_uuid.html + a654bace3b7b14715143dd4a955f477c5 + (const Uuid &ns, const char *name) noexcept + + + static Uuid + V3 + classetcpal_1_1_uuid.html + a637aba4ac439b6c6845f6ff8e3411186 + (const Uuid &ns, const std::string &name) noexcept + + + static Uuid + V4 + classetcpal_1_1_uuid.html + a3bcee74617519b972666b57ff986bf43 + () noexcept + + + static Uuid + V5 + classetcpal_1_1_uuid.html + ae4e59b0f73518f92ed7c3c6d1b65bd3c + (const Uuid &ns, const void *name, size_t name_len) noexcept + + + static Uuid + V5 + classetcpal_1_1_uuid.html + a729621c06a6d1bd895a9c82b30141c9a + (const Uuid &ns, const char *name) noexcept + + + static Uuid + V5 + classetcpal_1_1_uuid.html + acaa3b4ab280e85d5c18c2749018c6153 + (const Uuid &ns, const std::string &name) noexcept + + + static Uuid + OsPreferred + classetcpal_1_1_uuid.html + ae1ccf480526751a937afb32a2db7346a + () noexcept + + + static Uuid + Device + classetcpal_1_1_uuid.html + a30a2f58b68d4d0e7d2ae6a63213a388a + (const std::string &device_str, const uint8_t *mac_addr, uint32_t uuid_num) noexcept + + + static Uuid + Device + classetcpal_1_1_uuid.html + a2d8ba319ae1c2e12b6ed12742562d038 + (const std::string &device_str, const std::array< uint8_t, 6 > &mac_addr, uint32_t uuid_num) noexcept + + + uint32_t + time_low + classetcpal_1_1_uuid.html + a197e772363eb4fb42ca981f6690cc6eb + () const noexcept + + + uint16_t + time_mid + classetcpal_1_1_uuid.html + a5a3534e539c75eb5add173f7f660d45a + () const noexcept + + + uint16_t + time_hi_and_version + classetcpal_1_1_uuid.html + a0fd84d72db93c35ce9d86a1fff1b1067 + () const noexcept + + + std::array< uint8_t, 8 > + clock_seq_and_node + classetcpal_1_1_uuid.html + ad1c7dfeea57e4e696bca56b1cb172292 + () const noexcept + + + + etcpal::WriteGuard + classetcpal_1_1_write_guard.html + + + WriteGuard + classetcpal_1_1_write_guard.html + a0c3e55817a2955c086af3a033db5105a + (RwLock &rwlock) + + + + WriteGuard + classetcpal_1_1_write_guard.html + a94731b7b53c630d8781f78807ca35dd2 + (etcpal_rwlock_t &rwlock) + + + + ~WriteGuard + classetcpal_1_1_write_guard.html + afa219384bacf93a154fdb6bf71941d57 + () + + + + etcpal_acn_pdu + acn_pdu (ACN Protocol Family PDUs) + group__etcpal__acn__pdu.html + AcnPdu + AcnPduConstraints + + #define + ACN_PDU_LENGTH + group__etcpal__acn__pdu.html + gae56bb8381a08d26f7a124eb82a65ce70 + (pdu_buf) + + + #define + ACN_PDU_PACK_NORMAL_LEN + group__etcpal__acn__pdu.html + ga0c52657116f8cbc6376e4185aa10ed4e + (pdu_buf, length) + + + #define + ACN_PDU_PACK_EXT_LEN + group__etcpal__acn__pdu.html + gaf63c612f16b76b5d1f56d569aa06de39 + (pdu_buf, length) + + + #define + ACN_PDU_INIT + group__etcpal__acn__pdu.html + ga408e2eafbb588ee9138013a62c412e4c + + + + #define + ACN_INIT_PDU + group__etcpal__acn__pdu.html + ga9c8ce768d1162956568cf55f2c42d6bb + (pduptr) + + + struct AcnPdu + AcnPdu + group__etcpal__acn__pdu.html + ga3628638e45db8db2868d39815491d690 + + + + struct AcnPduConstraints + AcnPduConstraints + group__etcpal__acn__pdu.html + ga30e387a60bcb97095e371f5fca5b5962 + + + + bool + acn_parse_pdu + group__etcpal__acn__pdu.html + gab277ac11752967a19ded43f02e8bf0d4 + (const uint8_t *buf, size_t buflen, const AcnPduConstraints *constraints, AcnPdu *pdu) + + + #define + ACN_PDU_L_FLAG_SET + group__etcpal__acn__pdu.html + gaff1b6f9a3c23b53b3dc32b8fba814e84 + (flags_byte) + + + #define + ACN_PDU_V_FLAG_SET + group__etcpal__acn__pdu.html + gabee5ccd32aebcd51a251a606c1059e6a + (flags_byte) + + + #define + ACN_PDU_H_FLAG_SET + group__etcpal__acn__pdu.html + ga4e16a5ba393080866e3bf05184bdd8cc + (flags_byte) + + + #define + ACN_PDU_D_FLAG_SET + group__etcpal__acn__pdu.html + gabfbc18cb41624f62faf120c756e15a93 + (flags_byte) + + + #define + ACN_PDU_SET_L_FLAG + group__etcpal__acn__pdu.html + gadb9812c9527ce0e9990ef2f4a7ba7384 + (flags_byte) + + + #define + ACN_PDU_SET_V_FLAG + group__etcpal__acn__pdu.html + gaf4b41a1aef5cd04be19b8dcb747445f5 + (flags_byte) + + + #define + ACN_PDU_SET_H_FLAG + group__etcpal__acn__pdu.html + ga242de4c8a855bf849a2571f4f959f39c + (flags_byte) + + + #define + ACN_PDU_SET_D_FLAG + group__etcpal__acn__pdu.html + ga81c687ecab08faeb07309f0a105427fd + (flags_byte) + + + + etcpal_acn_rlp + acn_rlp (ACN Root Layer Protocol) + group__etcpal__acn__rlp.html + AcnTcpPreamble + AcnUdpPreamble + AcnRootLayerPdu + + #define + ACN_TCP_PREAMBLE_SIZE + group__etcpal__acn__rlp.html + gab879b13847509e3bbd4b12a5e2cda0e7 + + + + #define + ACN_UDP_PREAMBLE_SIZE + group__etcpal__acn__rlp.html + ga86207e41512354a1a6e321d95afe8ab0 + + + + #define + ACN_RLP_HEADER_SIZE_NORMAL_LEN + group__etcpal__acn__rlp.html + ga29ae7e116cd77cc00366461415bf54a7 + + + + #define + ACN_RLP_HEADER_SIZE_EXT_LEN + group__etcpal__acn__rlp.html + ga9d9a7bd4498a28d5b0de8ed598141c66 + + + + struct AcnTcpPreamble + AcnTcpPreamble + group__etcpal__acn__rlp.html + ga548213c8a55f62ef6d1aaebebf5d9d92 + + + + struct AcnUdpPreamble + AcnUdpPreamble + group__etcpal__acn__rlp.html + gac581ac5bbc25e6c544f10a718bb6a6d2 + + + + struct AcnRootLayerPdu + AcnRootLayerPdu + group__etcpal__acn__rlp.html + ga1f5c4d94231529fba7aa1c852cde9665 + + + + bool + acn_parse_tcp_preamble + group__etcpal__acn__rlp.html + gab2edaace9af15cb4dd54bfb8ad36fe88 + (const uint8_t *buf, size_t buflen, AcnTcpPreamble *preamble) + + + bool + acn_parse_udp_preamble + group__etcpal__acn__rlp.html + ga14db47bbc1098cb4dfa4826f7a121d92 + (const uint8_t *buf, size_t buflen, AcnUdpPreamble *preamble) + + + bool + acn_parse_root_layer_header + group__etcpal__acn__rlp.html + ga0174e7b359b079e56c0ac114f43d4161 + (const uint8_t *buf, size_t buflen, AcnRootLayerPdu *pdu, AcnRootLayerPdu *last_pdu) + + + bool + acn_parse_root_layer_pdu + group__etcpal__acn__rlp.html + gabf21b75d1b5bfe26178b328c3cd2fa8d + (const uint8_t *buf, size_t buflen, AcnRootLayerPdu *pdu, AcnPdu *last_pdu) + + + size_t + acn_pack_tcp_preamble + group__etcpal__acn__rlp.html + ga615060ff8e3ed0811418b60498872177 + (uint8_t *buf, size_t buflen, size_t rlp_block_len) + + + size_t + acn_pack_udp_preamble + group__etcpal__acn__rlp.html + gad1ebc44ac8675cea86bd5fa4a2f5a530 + (uint8_t *buf, size_t buflen) + + + size_t + acn_root_layer_buf_size + group__etcpal__acn__rlp.html + ga76d83773df9894ecbaf8b505647c32e5 + (const AcnRootLayerPdu *pdu_block, size_t num_pdus) + + + size_t + acn_pack_root_layer_header + group__etcpal__acn__rlp.html + gaf4281e58f075ee0e14f2e6fa50f059b9 + (uint8_t *buf, size_t buflen, const AcnRootLayerPdu *pdu) + + + size_t + acn_pack_root_layer_block + group__etcpal__acn__rlp.html + ga3b7afd5a73e12e1acd650455c7e22997 + (uint8_t *buf, size_t buflen, const AcnRootLayerPdu *pdu_block, size_t num_pdus) + + + + etcpal + EtcPal + group__etcpal.html + etcpal_core + etcpal_os + etcpal_net + etcpal_cpp + etcpal_opts + + #define + ETCPAL_WAIT_FOREVER + group__etcpal.html + ga1cfb33811295439bc08ce2e8b74c1d13 + + + + uint32_t + etcpal_features_t + group__etcpal.html + gae77772998c26f45618c26de1e1fc8305 + + + + etcpal_error_t + etcpal_init + group__etcpal.html + ga163b95dfe5ef6c68f2fb4d5b58a63843 + (etcpal_features_t features) + + + void + etcpal_deinit + group__etcpal.html + ga0792bdcd2f824009584744db01d7a352 + (etcpal_features_t features) + + + #define + ETCPAL_FEATURE_SOCKETS + group__etcpal.html + ga09f99422deaa7bb5d2625c317d1a66a6 + + + + #define + ETCPAL_FEATURE_NETINTS + group__etcpal.html + gaf5b3a81b975bbae1f6f54f43bfc0c6a7 + + + + #define + ETCPAL_FEATURE_TIMERS + group__etcpal.html + gaffb285a8108a672c01c33d921ee8be83 + + + + #define + ETCPAL_FEATURE_LOGGING + group__etcpal.html + ga8c7c1f9430362540e56af3a2742a25d4 + + + + #define + ETCPAL_FEATURES_ALL + group__etcpal.html + ga740dd7c89f16ff20992cf21970d1c521 + + + + #define + ETCPAL_FEATURES_ALL_BUT + group__etcpal.html + ga15560671c4e732ed46dc03a0e522d160 + (mask) + + + + etcpal_core + Core Modules + group__etcpal__core.html + etcpal_acn_pdu + etcpal_acn_rlp + etcpal_error + etcpal_log + etcpal_mempool + etcpal_pack + etcpal_rbtree + etcpal_uuid + + + etcpal_os + OS Abstraction Modules + group__etcpal__os.html + etcpal_thread + etcpal_timer + etcpal_lock + etcpal_queue + + + etcpal_net + Network Abstraction Modules + group__etcpal__net.html + etcpal_inet + etcpal_netint + etcpal_socket + + + etcpal_error + error (Error Handling) + group__etcpal__error.html + + #define + ETCPAL_NUM_ERROR_CODES + group__etcpal__error.html + gae0de193fbaf16861756958bd3f21e07f + + + + + etcpal_error_t + group__etcpal__error.html + ga743b0648f0ca798ef29c9f69c6e255af + + + + kEtcPalErrOk + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afae403d046b4ba4e81dce121266c2cca8d + + + + kEtcPalErrNotFound + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa62c704cfc2d72f1fa91c04efe508c60f + + + + kEtcPalErrNoMem + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afad16b0fe51e8664f8b30b740ea1e51599 + + + + kEtcPalErrBusy + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa47b93a8acf0aad836afc5dda44551acc + + + + kEtcPalErrExists + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afaeab0ae4d277d52dc56a1d78f81868c2d + + + + kEtcPalErrInvalid + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afadb17bb2ec24e7755170e8afbd5b10bc2 + + + + kEtcPalErrWouldBlock + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa735dc55ef30ad08cca792cb41a1dfeb1 + + + + kEtcPalErrNoData + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa77e50551fc1c569578f0f9dd4d4a5712 + + + + kEtcPalErrProtocol + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa8396c97054393b3faf3849541fc99c43 + + + + kEtcPalErrMsgSize + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afaa980a5e26cf5086f916d12a485572f12 + + + + kEtcPalErrAddrInUse + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afae27e1c52937b3d1c1993f78160a0a778 + + + + kEtcPalErrAddrNotAvail + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa44ede5b2503ce2b1bb4ccd285d676b50 + + + + kEtcPalErrNetwork + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa4c458cd2885e27a726a1d9dedf4b4bec + + + + kEtcPalErrConnReset + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa15cf4f4905d98d94910c6cc76ae1218f + + + + kEtcPalErrConnClosed + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afafb8046b7504e0e9908654f939e74ee60 + + + + kEtcPalErrIsConn + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa9603628c356775915b437e3c15bdef53 + + + + kEtcPalErrNotConn + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa2eb8abeafb170747d185803ad0a2d527 + + + + kEtcPalErrShutdown + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa28e1dbbb288f3248d64378d83920259a + + + + kEtcPalErrTimedOut + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afac1a55c311993d815ab367c339f550956 + + + + kEtcPalErrHostUnreach + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa9c5af0e9de48f403358d6b9e2ef819b7 + + + + kEtcPalErrConnAborted + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa39f50bbaad22488dba1944f129d1ecde + + + + kEtcPalErrConnRefused + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa4b119ec2231eb8bf73535b1375f5f232 + + + + kEtcPalErrAlready + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afaa9c6c39f7303953a99c50a981f36dff0 + + + + kEtcPalErrInProgress + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa99aabe562db1ed9acab67c6a2bc777a1 + + + + kEtcPalErrBufSize + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afaefe61c95876a3a7faba0f5da4ec03f37 + + + + kEtcPalErrNotInit + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afadfb4ade13d03ed30f6309d2f130f05f7 + + + + kEtcPalErrNoNetints + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa730afdd022ada726bdf8d940eda9759b + + + + kEtcPalErrNoSockets + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afaa45464bce734de8eca7f5a768386423b + + + + kEtcPalErrNotImpl + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afad0b98165ec7fb9169790675a67850d52 + + + + kEtcPalErrPerm + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa9fb1e2b91f204d8a01377796bddd867d + + + + kEtcPalErrSys + group__etcpal__error.html + gga743b0648f0ca798ef29c9f69c6e255afa38404e113508a0e291dbcc6c73743ae8 + + + + const char * + etcpal_strerror + group__etcpal__error.html + ga4902a840d9801e02baebd4c70924c4b0 + (etcpal_error_t code) + + + + etcpal_inet + inet (Internet Addressing) + group__etcpal__inet.html + EtcPalIpAddr + EtcPalSockAddr + EtcPalMacAddr + EtcPalNetintInfo + + #define + ETCPAL_IPV6_BYTES + group__etcpal__inet.html + gad5f18940857b50304b956505fb77df20 + + + + #define + ETCPAL_MAC_BYTES + group__etcpal__inet.html + ga2222b6d9e40f95ec1d74e1865537863f + + + + #define + ETCPAL_MAC_CMP + group__etcpal__inet.html + ga4aadcedf06a097132f1eef8176b83419 + (mac1ptr, mac2ptr) + + + #define + ETCPAL_MAC_IS_NULL + group__etcpal__inet.html + ga84ac8ff7c11b7b3d05e66192205ae0cb + (macptr) + + + #define + ETCPAL_NETINTINFO_ID_LEN + group__etcpal__inet.html + ga7d30e1fd482aa981c7ee4a5082d6bc2d + + + + #define + ETCPAL_NETINTINFO_FRIENDLY_NAME_LEN + group__etcpal__inet.html + ga7f8d8782f4dea64648bb74e20db6d3c3 + + + + #define + ETCPAL_IP_STRING_BYTES + group__etcpal__inet.html + gacd7ec0d81e171166483c7629669bf05d + + + + #define + ETCPAL_MAC_STRING_BYTES + group__etcpal__inet.html + ga73f73b31cc309024d3284ebcf4b66b45 + + + + struct EtcPalIpAddr + EtcPalIpAddr + group__etcpal__inet.html + ga0f4fa2c5534edc2061c48b7d0a60941f + + + + struct EtcPalSockAddr + EtcPalSockAddr + group__etcpal__inet.html + ga0178b5f6d720a2293ef10bb61dcecf7a + + + + struct EtcPalMacAddr + EtcPalMacAddr + group__etcpal__inet.html + gac0911b094d33366046d9b947b24cc63f + + + + struct EtcPalNetintInfo + EtcPalNetintInfo + group__etcpal__inet.html + gaed988a9502c1d15538ef945b3b5b234b + + + + + etcpal_iptype_t + group__etcpal__inet.html + ga847282e3fd17bf75ec83292326c455ee + + + + kEtcPalIpTypeInvalid + group__etcpal__inet.html + gga847282e3fd17bf75ec83292326c455eea0e789a4e187f4a7fdbda7271a754eca8 + + + + kEtcPalIpTypeV4 + group__etcpal__inet.html + gga847282e3fd17bf75ec83292326c455eea73ea615eceba61f26d92a63f3738f635 + + + + kEtcPalIpTypeV6 + group__etcpal__inet.html + gga847282e3fd17bf75ec83292326c455eead480ed8d686b23bdb2e5bfc06b93d7ae + + + + bool + etcpal_ip_is_link_local + group__etcpal__inet.html + gaa4b21b32f8776276e582d473e17bf768 + (const EtcPalIpAddr *ip) + + + bool + etcpal_ip_is_loopback + group__etcpal__inet.html + ga6f59d1ebf7873649f0812ee1cae171e7 + (const EtcPalIpAddr *ip) + + + bool + etcpal_ip_is_multicast + group__etcpal__inet.html + ga71b745e5bdc7c77bba5320241639f450 + (const EtcPalIpAddr *ip) + + + bool + etcpal_ip_is_wildcard + group__etcpal__inet.html + gaef79c0c7eac819d7decf1473246d3b82 + (const EtcPalIpAddr *ip) + + + void + etcpal_ip_set_wildcard + group__etcpal__inet.html + ga5d91044202026978c99000b6da2d226e + (etcpal_iptype_t type, EtcPalIpAddr *ip) + + + int + etcpal_ip_cmp + group__etcpal__inet.html + gaf766d207bd3e85c6b3d75768f28a00c6 + (const EtcPalIpAddr *ip1, const EtcPalIpAddr *ip2) + + + bool + etcpal_ip_and_port_equal + group__etcpal__inet.html + gaf897a891bcf59ccb447845628c2a04c2 + (const EtcPalSockAddr *sock1, const EtcPalSockAddr *sock2) + + + unsigned int + etcpal_ip_mask_length + group__etcpal__inet.html + ga9a86a44681bc856e5919578bbf652e38 + (const EtcPalIpAddr *netmask) + + + EtcPalIpAddr + etcpal_ip_mask_from_length + group__etcpal__inet.html + ga0f8ba14963ce91bfd74626f2a1e957f0 + (etcpal_iptype_t type, unsigned int mask_length) + + + bool + etcpal_ip_network_portions_equal + group__etcpal__inet.html + ga2112e37aae54451f5b7b03168183cace + (const EtcPalIpAddr *ip1, const EtcPalIpAddr *ip2, const EtcPalIpAddr *netmask) + + + bool + ip_os_to_etcpal + group__etcpal__inet.html + gad3a164fa82579c3047f6053f7266e6a8 + (const etcpal_os_ipaddr_t *os_ip, EtcPalIpAddr *ip) + + + size_t + ip_etcpal_to_os + group__etcpal__inet.html + gafe364c911711c469e0574821e30600e3 + (const EtcPalIpAddr *ip, etcpal_os_ipaddr_t *os_ip) + + + bool + sockaddr_os_to_etcpal + group__etcpal__inet.html + ga087efaef8630f32173eb397b4cb1ae7f + (const etcpal_os_sockaddr_t *os_sa, EtcPalSockAddr *sa) + + + size_t + sockaddr_etcpal_to_os + group__etcpal__inet.html + gaa8d939a802f0ab99ae1a6e8f9253a83d + (const EtcPalSockAddr *sa, etcpal_os_sockaddr_t *os_sa) + + + etcpal_error_t + etcpal_ip_to_string + group__etcpal__inet.html + gaf98da0ae21f7960b5e046c55b8d79c4a + (const EtcPalIpAddr *src, char *dest) + + + etcpal_error_t + etcpal_string_to_ip + group__etcpal__inet.html + ga92ba01cb2c81a8a97b9555ecf0ab2fe5 + (etcpal_iptype_t type, const char *src, EtcPalIpAddr *dest) + + + etcpal_error_t + etcpal_mac_to_string + group__etcpal__inet.html + gaf1e26c55e9ece4a8a17bd9953eca0886 + (const EtcPalMacAddr *src, char *dest) + + + etcpal_error_t + etcpal_string_to_mac + group__etcpal__inet.html + gac2175076e5d4834fccf76e17a29bbbfe + (const char *src, EtcPalMacAddr *dest) + + + const EtcPalMacAddr + kEtcPalNullMacAddr + group__etcpal__inet.html + gae648df0d068e3335073224fb0fb45512 + + + + #define + ETCPAL_IP_INVALID_INIT_VALUES + group__etcpal__inet.html + gaeffa39a3f4885c198b5ed7f49463d0b0 + + + + #define + ETCPAL_IP_INVALID_INIT + group__etcpal__inet.html + gad8ef4406c72bd87baad2ce085fb29daf + + + + #define + ETCPAL_IPV4_INIT_VALUES + group__etcpal__inet.html + ga19607012ab4fcba516b8f59d8d1df840 + (v4_val) + + + #define + ETCPAL_IPV4_INIT + group__etcpal__inet.html + ga5a003e68fd0875858bf7dcdfad05db3f + (addr_val) + + + #define + ETCPAL_IPV6_INIT_VALUES + group__etcpal__inet.html + gab26d4b7b0dd23818f02a54be33fa2bd2 + (...) + + + #define + ETCPAL_IPV6_INIT + group__etcpal__inet.html + ga66c5a1296b2777b56a9caa013a6a67aa + (...) + + + #define + ETCPAL_IP_IS_V4 + group__etcpal__inet.html + ga4ed3a313f7503031100bb169ad03bc89 + (etcpal_ip_ptr) + + + #define + ETCPAL_IP_IS_V6 + group__etcpal__inet.html + ga85d241eed93be1b271e5dc68a56e9473 + (etcpal_ip_ptr) + + + #define + ETCPAL_IP_IS_INVALID + group__etcpal__inet.html + ga56a6933874bc52770eac5865f237e225 + (etcpal_ip_ptr) + + + #define + ETCPAL_IP_V4_ADDRESS + group__etcpal__inet.html + ga35262011f1ae20211d8aad5c79ab1b50 + (etcpal_ip_ptr) + + + #define + ETCPAL_IP_V6_ADDRESS + group__etcpal__inet.html + gaaee800da95371923f9375dec1a6c0a5c + (etcpal_ip_ptr) + + + #define + ETCPAL_IP_V6_SCOPE_ID + group__etcpal__inet.html + ga88982a2d40356f278c53563ddf96d8b2 + (etcpal_ip_ptr) + + + #define + ETCPAL_IP_SET_V4_ADDRESS + group__etcpal__inet.html + ga5e36f7ec503aef51829aed6fbd88c889 + (etcpal_ip_ptr, val) + + + #define + ETCPAL_IP_SET_V6_ADDRESS + group__etcpal__inet.html + gae0d14b2f44b81a6687390839e0aea869 + (etcpal_ip_ptr, addr_val) + + + #define + ETCPAL_IP_SET_V6_ADDRESS_WITH_SCOPE_ID + group__etcpal__inet.html + gaeb96cdc37b6f57f448b0ac15971380d8 + (etcpal_ip_ptr, addr_val, scope_id_val) + + + #define + ETCPAL_IP_SET_INVALID + group__etcpal__inet.html + gab7df63744affbe2833fcb455e69b6ff5 + (etcpal_ip_ptr) + + + + etcpal_log + log (Logging) + group__etcpal__log.html + EtcPalLogTimestamp + EtcPalLogStrings + EtcPalSyslogParams + EtcPalLogParams + + #define + ETCPAL_LOG_NFACILITIES + group__etcpal__log.html + ga9c650b00d427b03b6169b18514627eb7 + + + + #define + ETCPAL_LOG_FAC + group__etcpal__log.html + gab60e596c37c275724a2d27c0ef608197 + (p) + + + #define + ETCPAL_LOG_PRI + group__etcpal__log.html + ga62757cfe0dd5a61600cbeed6777480d1 + (p) + + + #define + ETCPAL_LOG_MAKEPRI + group__etcpal__log.html + ga443fcc43be128430ebb6d1c82fe6b894 + (fac, pri) + + + #define + ETCPAL_LOG_MASK + group__etcpal__log.html + ga153d45bd7f441311296802b70f704700 + (pri) + + + #define + ETCPAL_LOG_UPTO + group__etcpal__log.html + gaecd624f2fc15671bb3e4c01ede198a08 + (pri) + + + #define + ETCPAL_LOG_HOSTNAME_MAX_LEN + group__etcpal__log.html + gafc4fcfbaaffb603d10e2b27f54e122d2 + + + + #define + ETCPAL_LOG_APP_NAME_MAX_LEN + group__etcpal__log.html + ga2b336b7e2828f1f9c576fb4a6e357b1a + + + + #define + ETCPAL_LOG_PROCID_MAX_LEN + group__etcpal__log.html + ga1786d1616917fb0bf1315504e14060c4 + + + + #define + ETCPAL_RAW_LOG_MSG_MAX_LEN + group__etcpal__log.html + ga23f61f04ce3dd5ee8ceaf88f99121999 + + + + #define + ETCPAL_LOG_TIMESTAMP_LEN + group__etcpal__log.html + ga589d05713f16b04a0337399d5064e7c3 + + + + #define + ETCPAL_SYSLOG_HEADER_MAX_LEN + group__etcpal__log.html + ga6463250841fd9f0b87d84574d5ed561f + + + + #define + ETCPAL_SYSLOG_STR_MIN_LEN + group__etcpal__log.html + ga2b86d5334ad5c012a7b81ce1e9c90e33 + + + + #define + ETCPAL_LOG_STR_MIN_LEN + group__etcpal__log.html + ga5f7e222e2b3359ca02363b27f38e97b2 + + + + #define + ETCPAL_SYSLOG_STR_MAX_LEN + group__etcpal__log.html + gae8f0782821bb95f1c2a0122b9819acac + + + + #define + ETCPAL_LOG_STR_MAX_LEN + group__etcpal__log.html + gaec05f1fdff3420181c0fe5ae92648e68 + + + + #define + ETCPAL_LOG_CREATE_HUMAN_READABLE + group__etcpal__log.html + ga45d65c059c3b46a251f8ca4141ca1810 + + + + #define + ETCPAL_LOG_CREATE_SYSLOG + group__etcpal__log.html + gaf080f0551c3c97b9297429f5d5cbfadc + + + + #define + ETCPAL_LOG_CREATE_LEGACY_SYSLOG + group__etcpal__log.html + ga00ab18ae19f165c3d2b5c54b6c47f936 + + + + #define + ETCPAL_SYSLOG_PARAMS_INIT + group__etcpal__log.html + gaa0719223c22e26ee648c97be97ce2aad + + + + #define + ETCPAL_LOG_PARAMS_INIT + group__etcpal__log.html + ga24911b91f9e4d5043348096a3065cd41 + + + + struct EtcPalLogTimestamp + EtcPalLogTimestamp + group__etcpal__log.html + ga6ce3e6fd83a776f1696163386ed4fde0 + + + + struct EtcPalLogStrings + EtcPalLogStrings + group__etcpal__log.html + gaf51673a8ceea21c025198456ac795a12 + + + + void(* + EtcPalLogCallback + group__etcpal__log.html + gaf8d8eef393a51fca0f1ddbfd7cad9c82 + )(void *context, const EtcPalLogStrings *strings) + + + void(* + EtcPalLogTimeFn + group__etcpal__log.html + gae62cd1cd05e3e42c5df41cab8df8e9e3 + )(void *context, EtcPalLogTimestamp *timestamp) + + + struct EtcPalSyslogParams + EtcPalSyslogParams + group__etcpal__log.html + ga3961fedc222b8d388ebcb2bbe6e00263 + + + + struct EtcPalLogParams + EtcPalLogParams + group__etcpal__log.html + gac6a69c52ee1d8dea2aa9d6a90d217050 + + + + bool + etcpal_create_log_str + group__etcpal__log.html + gacf54b7ce272d89f2a35a83c4cd3bda4f + (char *buf, size_t buflen, const EtcPalLogTimestamp *timestamp, int pri, const char *format,...) + + + bool + etcpal_vcreate_log_str + group__etcpal__log.html + gadec7b676650d22a5315d97f3aeee1dd0 + (char *buf, size_t buflen, const EtcPalLogTimestamp *timestamp, int pri, const char *format, va_list args) + + + bool + etcpal_create_syslog_str + group__etcpal__log.html + gaac4f27cd13defcb0fbd39516b5d5844d + (char *buf, size_t buflen, const EtcPalLogTimestamp *timestamp, const EtcPalSyslogParams *syslog_params, int pri, const char *format,...) + + + bool + etcpal_vcreate_syslog_str + group__etcpal__log.html + ga943bb13f1d71efce45b30b466e757138 + (char *buf, size_t buflen, const EtcPalLogTimestamp *timestamp, const EtcPalSyslogParams *syslog_params, int pri, const char *format, va_list args) + + + bool + etcpal_create_legacy_syslog_str + group__etcpal__log.html + ga614043c892a15eb55d8695da85db36ca + (char *buf, size_t buflen, const EtcPalLogTimestamp *timestamp, const EtcPalSyslogParams *syslog_params, int pri, const char *format,...) + + + bool + etcpal_vcreate_legacy_syslog_str + group__etcpal__log.html + ga412dd0f9c14ece292b9bfacdacf90e28 + (char *buf, size_t buflen, const EtcPalLogTimestamp *timestamp, const EtcPalSyslogParams *syslog_params, int pri, const char *format, va_list args) + + + void + etcpal_sanitize_syslog_params + group__etcpal__log.html + ga895ff8dd5230b10b4ab6d955e556d318 + (EtcPalSyslogParams *params) + + + bool + etcpal_validate_log_params + group__etcpal__log.html + ga949455773a4ecdd6a499940a19ec6080 + (EtcPalLogParams *params) + + + bool + etcpal_validate_log_timestamp + group__etcpal__log.html + ga8bdf4e7812a1fe1d3b2c5da3ffc4f028 + (const EtcPalLogTimestamp *timestamp) + + + bool + etcpal_can_log + group__etcpal__log.html + gac44c39be61d1bf95239f9bd6fb1f11ad + (const EtcPalLogParams *params, int pri) + + + void + etcpal_log + group__etcpal__log.html + gab05a59d52b560561ce33a937f73aae5e + (const EtcPalLogParams *params, int pri, const char *format,...) + + + void + etcpal_vlog + group__etcpal__log.html + ga2f8f5602ed9ad8a869d40c4af8ba8d41 + (const EtcPalLogParams *params, int pri, const char *format, va_list args) + + + #define + ETCPAL_LOG_KERN + group__etcpal__log.html + ga6ae744f52d1ee08daa8fd36bf58597b3 + + + + #define + ETCPAL_LOG_USER + group__etcpal__log.html + ga6fc21fb437c4fa1d90dd8698cfa256f0 + + + + #define + ETCPAL_LOG_MAIL + group__etcpal__log.html + ga42fd837e598b56123c5d38fff2f5fbeb + + + + #define + ETCPAL_LOG_DAEMON + group__etcpal__log.html + ga525978d1bfe16fcd0a4450a7c5dc53ec + + + + #define + ETCPAL_LOG_AUTH + group__etcpal__log.html + gabc74c1a4cef75ebe20e917b68fa23d52 + + + + #define + ETCPAL_LOG_SYSLOG + group__etcpal__log.html + ga46bba655f9c87face73f5e2e680f0e6c + + + + #define + ETCPAL_LOG_LPR + group__etcpal__log.html + ga185481461d7f07edfd95fa80405b37c1 + + + + #define + ETCPAL_LOG_NEWS + group__etcpal__log.html + ga83c2035b9784a9cb0625bc4f33fbdc76 + + + + #define + ETCPAL_LOG_UUCP + group__etcpal__log.html + gaaa5608f22b53b0de9b6c4b1811d632ba + + + + #define + ETCPAL_LOG_CRON + group__etcpal__log.html + ga076221d5039086994c7b2a87963be388 + + + + #define + ETCPAL_LOG_AUTHPRIV + group__etcpal__log.html + ga0c3bcdd91c9d747dea59430a849556b2 + + + + #define + ETCPAL_LOG_FTP + group__etcpal__log.html + gaa3ad1dbc725353f2cd49cc55b32f3153 + + + + #define + ETCPAL_LOG_LOCAL0 + group__etcpal__log.html + ga64040cea6d8c1457ef47e65279f8bca2 + + + + #define + ETCPAL_LOG_LOCAL1 + group__etcpal__log.html + ga2f6c98d265250c28e6102c97a10dee17 + + + + #define + ETCPAL_LOG_LOCAL2 + group__etcpal__log.html + ga752539f8bfef40f0c19dc4ef67a59473 + + + + #define + ETCPAL_LOG_LOCAL3 + group__etcpal__log.html + ga92640deb4a6a2625e4fc36038cd8d45d + + + + #define + ETCPAL_LOG_LOCAL4 + group__etcpal__log.html + ga25a6a69270ce194f38d3d24e17c1d830 + + + + #define + ETCPAL_LOG_LOCAL5 + group__etcpal__log.html + gad7d901793d960e58420eb4025cfa51d1 + + + + #define + ETCPAL_LOG_LOCAL6 + group__etcpal__log.html + gabcdbdf6cbaeec1b06545372144162a79 + + + + #define + ETCPAL_LOG_LOCAL7 + group__etcpal__log.html + ga3b702549e92e23e2918d2fae9af6a84c + + + + #define + ETCPAL_LOG_EMERG + group__etcpal__log.html + gaaba03ada613553b9276df87d7387ae6f + + + + #define + ETCPAL_LOG_ALERT + group__etcpal__log.html + gaefbc8eee2db20c20586eaae217faa385 + + + + #define + ETCPAL_LOG_CRIT + group__etcpal__log.html + ga1f5ee8379832669d8cb7d5abc2e93b1f + + + + #define + ETCPAL_LOG_ERR + group__etcpal__log.html + ga0f39e099c1569ddf03e826eb4e831cf1 + + + + #define + ETCPAL_LOG_WARNING + group__etcpal__log.html + gac79a4a2a830ae8db541f33093b2d50df + + + + #define + ETCPAL_LOG_NOTICE + group__etcpal__log.html + ga2d71e55473353be02c7fd2a785b12b23 + + + + #define + ETCPAL_LOG_INFO + group__etcpal__log.html + ga9f05a0ad034946dfd20477e11d2923a7 + + + + #define + ETCPAL_LOG_DEBUG + group__etcpal__log.html + ga4e46d489885b63c38263e35ad5aca8b6 + + + + + etcpal_mempool + mempool (Memory Pools) + group__etcpal__mempool.html + + #define + ETCPAL_MEMPOOL_DECLARE + group__etcpal__mempool.html + ga1da98d192da467dfb2ec751bad279178 + (name) + + + #define + ETCPAL_MEMPOOL_DEFINE + group__etcpal__mempool.html + ga0d56307540e32e74ce5a87a52ce447b8 + (name, type, size) + + + #define + ETCPAL_MEMPOOL_DEFINE_ARRAY + group__etcpal__mempool.html + ga3a974aa750cca64861b630f0a7776232 + (name, type, array_size, pool_size) + + + #define + etcpal_mempool_init + group__etcpal__mempool.html + ga2b7b0144747ea853ea526f283344c047 + (name) + + + #define + etcpal_mempool_alloc + group__etcpal__mempool.html + ga3cda8bdb4dc13e12ba5e75ccadb23274 + (name) + + + #define + etcpal_mempool_free + group__etcpal__mempool.html + gaf69c62d9c8df5f589fefbaf0283b2435 + (name, mem) + + + #define + etcpal_mempool_size + group__etcpal__mempool.html + ga8b10935dcb7665a6c4418831fd17c9cd + (name) + + + #define + etcpal_mempool_used + group__etcpal__mempool.html + gaa1a695b25f4ea895750e753303eb4f85 + (name) + + + + etcpal_netint + netint (Network Interfaces) + group__etcpal__netint.html + + size_t + etcpal_netint_get_num_interfaces + group__etcpal__netint.html + ga4b952bf9d2c5c21e62c691c722730a39 + (void) + + + const EtcPalNetintInfo * + etcpal_netint_get_interfaces + group__etcpal__netint.html + ga32d2c099254727efd5a2d8208a7a88e4 + (void) + + + etcpal_error_t + etcpal_netint_get_interfaces_by_index + group__etcpal__netint.html + ga78f5df18395e14e959ed0c4dc26580dc + (unsigned int index, const EtcPalNetintInfo **netint_arr, size_t *netint_arr_size) + + + etcpal_error_t + etcpal_netint_get_default_interface + group__etcpal__netint.html + gae5cfdf3d1aa1edf3b6f3729491241911 + (etcpal_iptype_t type, unsigned int *netint_index) + + + etcpal_error_t + etcpal_netint_get_interface_for_dest + group__etcpal__netint.html + gae0297aaa85a237ffd910644cb414750a + (const EtcPalIpAddr *dest, unsigned int *netint_index) + + + etcpal_error_t + etcpal_netint_refresh_interfaces + group__etcpal__netint.html + ga4708e2c4209e3a74e6c22d2c02c52f62 + (bool *list_changed) + + + + etcpal_pack + pack (Buffer Packing and Unpacking) + group__etcpal__pack.html + + int16_t + etcpal_unpack_i16b + group__etcpal__pack.html + ga03cb215e85989e72c68d5375c3ba497a + (const uint8_t *buf) + + + void + etcpal_pack_i16b + group__etcpal__pack.html + ga643eda014d76e31b7b814740477129b6 + (uint8_t *buf, int16_t val) + + + int16_t + etcpal_unpack_i16l + group__etcpal__pack.html + ga9665c39fc1edb5c993a65d1bc0227eca + (const uint8_t *buf) + + + void + etcpal_pack_i16l + group__etcpal__pack.html + gab6baf283ded8edfee3eea443c8494b00 + (uint8_t *buf, int16_t val) + + + uint16_t + etcpal_unpack_u16b + group__etcpal__pack.html + gad3f7ba35fa369d1749bff71ef704fe3d + (const uint8_t *buf) + + + void + etcpal_pack_u16b + group__etcpal__pack.html + gad3d316c55c7673d619bbb92a27eaab5c + (uint8_t *buf, uint16_t val) + + + uint16_t + etcpal_unpack_u16l + group__etcpal__pack.html + gaad71f04b710d89d536ed3d01c75b3d94 + (const uint8_t *buf) + + + void + etcpal_pack_u16l + group__etcpal__pack.html + ga79214e42a36a2cc967fc417e82aa3ecf + (uint8_t *buf, uint16_t val) + + + int32_t + etcpal_unpack_i32b + group__etcpal__pack.html + ga36f5a90e3fe43a44a33a4d8ea7550f6f + (const uint8_t *buf) + + + void + etcpal_pack_i32b + group__etcpal__pack.html + ga6195295fa17c918934dd7ad960356f53 + (uint8_t *buf, int32_t val) + + + int32_t + etcpal_unpack_i32l + group__etcpal__pack.html + gadcd258a8510cb2e25f916c03e2f3cf61 + (const uint8_t *buf) + + + void + etcpal_pack_i32l + group__etcpal__pack.html + ga3d81cfd5ea0db9f904260c9269ae90e6 + (uint8_t *buf, int32_t val) + + + uint32_t + etcpal_unpack_u32b + group__etcpal__pack.html + ga3a0676b70d6f218eb57a2b43a5556fa9 + (const uint8_t *buf) + + + void + etcpal_pack_u32b + group__etcpal__pack.html + ga88e2c7307bc91f9936fcc13c63c02631 + (uint8_t *buf, uint32_t val) + + + uint32_t + etcpal_unpack_u32l + group__etcpal__pack.html + ga08dcb3a3db0e2503288fc0510dacb607 + (const uint8_t *buf) + + + void + etcpal_pack_u32l + group__etcpal__pack.html + ga19ac23cec592f0bd81baa2fda9ae2336 + (uint8_t *buf, uint32_t val) + + + int64_t + etcpal_unpack_i64b + group__etcpal__pack.html + ga561ee21a6f18638da0ac63c6c564db3b + (const uint8_t *buf) + + + void + etcpal_pack_i64b + group__etcpal__pack.html + gaad4afcee267b57a85444bdceb3115d46 + (uint8_t *buf, int64_t val) + + + int64_t + etcpal_unpack_i64l + group__etcpal__pack.html + gabf19d28117a02f5d9365f0acaae51b8b + (const uint8_t *buf) + + + void + etcpal_pack_i64l + group__etcpal__pack.html + ga1a7f6367dcee8974cb5e2ae1dfcced3d + (uint8_t *buf, int64_t val) + + + uint64_t + etcpal_unpack_u64b + group__etcpal__pack.html + ga60cf532cf79359bdee595b049627a1d1 + (const uint8_t *buf) + + + void + etcpal_pack_u64b + group__etcpal__pack.html + ga544c2b2ae7ba6f46758298719de9d2e8 + (uint8_t *buf, uint64_t val) + + + uint64_t + etcpal_unpack_u64l + group__etcpal__pack.html + gafa3382e49751478fe5348e23b7c82dc1 + (const uint8_t *buf) + + + void + etcpal_pack_u64l + group__etcpal__pack.html + gaa220a31557370465e1be3f7bdc53d0fe + (uint8_t *buf, uint64_t val) + + + + etcpal_rbtree + rbtree (Red-Black Trees) + group__etcpal__rbtree.html + EtcPalRbNode + EtcPalRbTree + EtcPalRbIter + + #define + ETCPAL_RB_ITER_MAX_HEIGHT + group__etcpal__rbtree.html + ga347976360fdafc669aab59abc1ff7d73 + + + + struct EtcPalRbIter + EtcPalRbIter + group__etcpal__rbtree.html + gaca406625e86f809e1d5b8e52ca3d3e40 + + + + int + etcpal_rbtree_node_cmp_ptr_cb + group__etcpal__rbtree.html + gabda4a5620ad7cddcc09ef71d4d8222c7 + (const EtcPalRbTree *self, const void *a, const void *b) + + + void + etcpal_rbtree_node_dealloc_cb + group__etcpal__rbtree.html + ga2041c16a4a4e745ccadd180cbb8bc93f + (const EtcPalRbTree *self, EtcPalRbNode *node) + + + EtcPalRbNode * + etcpal_rbnode_init + group__etcpal__rbtree.html + gaf901899ba23ab79070d5ed1440440eb2 + (EtcPalRbNode *self, void *value) + + + EtcPalRbTree * + etcpal_rbtree_init + group__etcpal__rbtree.html + ga82765df01bbb32545a67ec148536602a + (EtcPalRbTree *self, EtcPalRbTreeNodeCmpFunc cmp, EtcPalRbNodeAllocFunc alloc_f, EtcPalRbNodeDeallocFunc dealloc_f) + + + void * + etcpal_rbtree_find + group__etcpal__rbtree.html + ga4d3d93cb20130fc9d34fc13d1ea92316 + (EtcPalRbTree *self, const void *value) + + + etcpal_error_t + etcpal_rbtree_insert + group__etcpal__rbtree.html + gae87df653a152c3942b54a8f8e7c235c6 + (EtcPalRbTree *self, void *value) + + + etcpal_error_t + etcpal_rbtree_remove + group__etcpal__rbtree.html + ga46d80469b4a700447b2721589cbec3d9 + (EtcPalRbTree *self, const void *value) + + + etcpal_error_t + etcpal_rbtree_clear + group__etcpal__rbtree.html + ga1347a53b2f8505e22707702f490949e8 + (EtcPalRbTree *self) + + + size_t + etcpal_rbtree_size + group__etcpal__rbtree.html + gae0aa64287211d3858cef5d0a7cffb033 + (EtcPalRbTree *self) + + + etcpal_error_t + etcpal_rbtree_insert_node + group__etcpal__rbtree.html + ga036f8c0aea4ac2050bd2deb904affed6 + (EtcPalRbTree *self, EtcPalRbNode *node) + + + etcpal_error_t + etcpal_rbtree_remove_with_cb + group__etcpal__rbtree.html + gae9045e863548f8051541f3f054bbf4be + (EtcPalRbTree *self, const void *value, EtcPalRbTreeNodeFunc node_cb) + + + etcpal_error_t + etcpal_rbtree_clear_with_cb + group__etcpal__rbtree.html + ga2dfae49efd1e9a9dbd02635bdea8e73d + (EtcPalRbTree *self, EtcPalRbTreeNodeFunc node_cb) + + + int + etcpal_rbtree_test + group__etcpal__rbtree.html + ga3b194e280069ff3fbd105d9799dbea05 + (EtcPalRbTree *self, EtcPalRbNode *root) + + + EtcPalRbIter * + etcpal_rbiter_init + group__etcpal__rbtree.html + gae7d2f565a40d1ab86873e7bc9c5c5c02 + (EtcPalRbIter *self) + + + void * + etcpal_rbiter_first + group__etcpal__rbtree.html + ga1cd77fc10e7c983be2c12c5f14bc3721 + (EtcPalRbIter *self, EtcPalRbTree *tree) + + + void * + etcpal_rbiter_last + group__etcpal__rbtree.html + ga6f1279b41c60d92a808cc9b364f9eac9 + (EtcPalRbIter *self, EtcPalRbTree *tree) + + + void * + etcpal_rbiter_next + group__etcpal__rbtree.html + gaa3804b7146d1e8a72e4139a0f4d6507e + (EtcPalRbIter *self) + + + void * + etcpal_rbiter_prev + group__etcpal__rbtree.html + gad093318703094fd4bdb9ecb09443241d + (EtcPalRbIter *self) + + + void * + etcpal_rbiter_lower_bound + group__etcpal__rbtree.html + ga44f891bf17cabdfba6bf7748c02fe52b + (EtcPalRbIter *self, EtcPalRbTree *tree, const void *value) + + + void * + etcpal_rbiter_upper_bound + group__etcpal__rbtree.html + ga260091c3e633a8b5e3db3625e615032d + (EtcPalRbIter *self, EtcPalRbTree *tree, const void *value) + + + int(* + EtcPalRbTreeNodeCmpFunc + group__etcpal__rbtree.html + ga0f5fd5d6b8505a1e408a8f22fb3ede2b + )(const EtcPalRbTree *self, const void *value_a, const void *value_b) + + + void(* + EtcPalRbTreeNodeFunc + group__etcpal__rbtree.html + ga6687d480b9c3f3583303d537190a47de + )(const EtcPalRbTree *self, EtcPalRbNode *node) + + + EtcPalRbNode *(* + EtcPalRbNodeAllocFunc + group__etcpal__rbtree.html + ga7e715765639ff5a6b66065858541b083 + )(void) + + + void(* + EtcPalRbNodeDeallocFunc + group__etcpal__rbtree.html + gab04d15dd62a53956d6ea4b1e5dcbe930 + )(EtcPalRbNode *node) + + + + etcpal_socket + socket (Network Socket Interface) + group__etcpal__socket.html + EtcPalLinger + EtcPalMreq + EtcPalGroupReq + EtcPalPollEvent + EtcPalAddrinfo + + #define + ETCPAL_POLL_VALID_INPUT_EVENT_MASK + group__etcpal__socket.html + ga05f5bfa7ea20aa326aa97b2424481d99 + + + + #define + ETCPAL_SOCKET_INVALID + group__etcpal__socket.html + ga304e26b30c36b6c33319b9602c9fe276 + + + + #define + ETCPAL_SOCKET_MAX_POLL_SIZE + group__etcpal__socket.html + ga06b68eaa9d0e50e624659ed1b9c7f05a + + + + uint32_t + etcpal_poll_events_t + group__etcpal__socket.html + ga625b9f37c09cda6d3f13330094fa97d9 + + + + struct EtcPalLinger + EtcPalLinger + group__etcpal__socket.html + gaf5335aecd65e931fa0c9dc0ead350978 + + + + struct EtcPalMreq + EtcPalMreq + group__etcpal__socket.html + ga3ca1dc73415b552ebca00df10e53a5e1 + + + + struct EtcPalGroupReq + EtcPalGroupReq + group__etcpal__socket.html + ga21df9f214a53c2f6b06b15496edfeca8 + + + + struct EtcPalPollEvent + EtcPalPollEvent + group__etcpal__socket.html + ga7b84da8c4de1182c5b7769a5f5b8034c + + + + struct EtcPalAddrinfo + EtcPalAddrinfo + group__etcpal__socket.html + ga83e2e233e87a88a7edf037928d203550 + + + + PLATFORM_DEFINED + etcpal_socket_t + group__etcpal__socket.html + gaf08a63353f05072ee3b28fd754985b66 + + + + etcpal_error_t + etcpal_accept + group__etcpal__socket.html + ga89be7d2b1e4193d678e36dae7a49b4db + (etcpal_socket_t id, EtcPalSockAddr *address, etcpal_socket_t *conn_sock) + + + etcpal_error_t + etcpal_bind + group__etcpal__socket.html + ga86f8e53de9955be4f0ea33f632cc4b2a + (etcpal_socket_t id, const EtcPalSockAddr *address) + + + etcpal_error_t + etcpal_close + group__etcpal__socket.html + gaccdfd06b91ca1632a59c68e819270825 + (etcpal_socket_t id) + + + etcpal_error_t + etcpal_connect + group__etcpal__socket.html + gac5de9387d7aab2a7aa0e6c4e1d4fee3b + (etcpal_socket_t id, const EtcPalSockAddr *address) + + + etcpal_error_t + etcpal_getpeername + group__etcpal__socket.html + gaedab208ccf3be6da95380c5bf01fdf30 + (etcpal_socket_t id, EtcPalSockAddr *address) + + + etcpal_error_t + etcpal_getsockname + group__etcpal__socket.html + ga3563bac602f434da73673accc8da01aa + (etcpal_socket_t id, EtcPalSockAddr *address) + + + etcpal_error_t + etcpal_getsockopt + group__etcpal__socket.html + ga653ed9405ec4cb21d958faab8b1c783e + (etcpal_socket_t id, int level, int option_name, void *option_value, size_t *option_len) + + + etcpal_error_t + etcpal_listen + group__etcpal__socket.html + ga39e660822d93588ea8723414567a2415 + (etcpal_socket_t id, int backlog) + + + int + etcpal_recv + group__etcpal__socket.html + gace688545de41aecba767639fa0c8f7b6 + (etcpal_socket_t id, void *buffer, size_t length, int flags) + + + int + etcpal_recvfrom + group__etcpal__socket.html + ga305e1fb78f8ad29e562fff5762d9c3c0 + (etcpal_socket_t id, void *buffer, size_t length, int flags, EtcPalSockAddr *address) + + + int + etcpal_send + group__etcpal__socket.html + ga52ba67993412de6dc69a582ca07f50d5 + (etcpal_socket_t id, const void *message, size_t length, int flags) + + + int + etcpal_sendto + group__etcpal__socket.html + gaf13f2f32e223ba9ef28e732cc8906508 + (etcpal_socket_t id, const void *message, size_t length, int flags, const EtcPalSockAddr *dest_addr) + + + etcpal_error_t + etcpal_setsockopt + group__etcpal__socket.html + ga0cc965b67084fb27214825cb893d2041 + (etcpal_socket_t id, int level, int option_name, const void *option_value, size_t option_len) + + + etcpal_error_t + etcpal_shutdown + group__etcpal__socket.html + ga3c51a1d50368f372ecd2c44c93f85cac + (etcpal_socket_t id, int how) + + + etcpal_error_t + etcpal_socket + group__etcpal__socket.html + gae0c8d9e036be592eba7db8736c7e1e0f + (unsigned int family, unsigned int type, etcpal_socket_t *id) + + + etcpal_error_t + etcpal_setblocking + group__etcpal__socket.html + ga72f16eec0ea5416ac4a553e1e78d7c77 + (etcpal_socket_t id, bool blocking) + + + etcpal_error_t + etcpal_getblocking + group__etcpal__socket.html + ga7134eafebb4ee73d160cd38d96ddeb9e + (etcpal_socket_t id, bool *blocking) + + + etcpal_error_t + etcpal_getaddrinfo + group__etcpal__socket.html + ga5e63f5fa7b1b4310a4bb317aa4873997 + (const char *hostname, const char *service, const EtcPalAddrinfo *hints, EtcPalAddrinfo *result) + + + bool + etcpal_nextaddr + group__etcpal__socket.html + ga669185d01901034d700f167fa23f3eb1 + (EtcPalAddrinfo *ai) + + + void + etcpal_freeaddrinfo + group__etcpal__socket.html + ga8cc1d9b7b5e8e2b88a337fc727b44535 + (EtcPalAddrinfo *ai) + + + #define + ETCPAL_SOL_SOCKET + group__etcpal__socket.html + ga30a8a29b624b2bef32f68b1fe2aa9e83 + + + + #define + ETCPAL_IPPROTO_IP + group__etcpal__socket.html + gaba74f8fca47e034d676049bd8eb61488 + + + + #define + ETCPAL_IPPROTO_ICMPV6 + group__etcpal__socket.html + ga66aa3d038609a999ad33370a6c0c3284 + + + + #define + ETCPAL_IPPROTO_IPV6 + group__etcpal__socket.html + ga7db66bcfc3f239baf6a5fef9058192de + + + + #define + ETCPAL_IPPROTO_TCP + group__etcpal__socket.html + gaa885355b90b8e92d7f9965b63790810f + + + + #define + ETCPAL_IPPROTO_UDP + group__etcpal__socket.html + ga19bf0e5a8ce939ea6c4ea034f4839bcc + + + + #define + ETCPAL_SO_BROADCAST + group__etcpal__socket.html + gab90f6d9eeabe39a57db6b808d24d9bd2 + + + + #define + ETCPAL_SO_ERROR + group__etcpal__socket.html + ga20fe86808f28b9a96ee808626e4e3293 + + + + #define + ETCPAL_SO_KEEPALIVE + group__etcpal__socket.html + ga085124fd101ed8c2feb6c224d54d0b39 + + + + #define + ETCPAL_SO_LINGER + group__etcpal__socket.html + gaf47bd53da2c92535aa6edcd8cc820259 + + + + #define + ETCPAL_SO_RCVBUF + group__etcpal__socket.html + gab07c26f5ae3d4786c824461a65ba0dcc + + + + #define + ETCPAL_SO_SNDBUF + group__etcpal__socket.html + ga7e246a346418dcd9b4318fd673d4b622 + + + + #define + ETCPAL_SO_RCVTIMEO + group__etcpal__socket.html + ga068a8f93c435a18f79b13e21ff30cfd0 + + + + #define + ETCPAL_SO_SNDTIMEO + group__etcpal__socket.html + gaf74d842c762e41c9a7e5a5a3404905ef + + + + #define + ETCPAL_SO_REUSEADDR + group__etcpal__socket.html + gac2fc9cd09dce99bb5681df96f65c31b8 + + + + #define + ETCPAL_SO_REUSEPORT + group__etcpal__socket.html + ga9fb28d8ce3fc93272b41ebe7b5d87989 + + + + #define + ETCPAL_SO_TYPE + group__etcpal__socket.html + gad8abc2b8b8d29d17c94b3493bbf30816 + + + + #define + ETCPAL_IP_TTL + group__etcpal__socket.html + gaa8067f3bea534148c077f2dd720a6d51 + + + + #define + ETCPAL_IP_MULTICAST_IF + group__etcpal__socket.html + ga972636e83a7c9cbc9bb0e5a950c9c241 + + + + #define + ETCPAL_IP_MULTICAST_TTL + group__etcpal__socket.html + ga53c1ba7904c7917177dea985809b12c4 + + + + #define + ETCPAL_IP_MULTICAST_LOOP + group__etcpal__socket.html + ga0adba5365cbc8344c77ba5a47b43590e + + + + #define + ETCPAL_IP_ADD_MEMBERSHIP + group__etcpal__socket.html + ga19b3047fe621a06b5cedc8043bb823cf + + + + #define + ETCPAL_IP_DROP_MEMBERSHIP + group__etcpal__socket.html + gacbe3547d777f101aaa432e602c4b8e69 + + + + #define + ETCPAL_MCAST_JOIN_GROUP + group__etcpal__socket.html + gacde51cd51d94c43625b96196d7b80f50 + + + + #define + ETCPAL_MCAST_LEAVE_GROUP + group__etcpal__socket.html + ga747194309fa23fa0e092e8bd010f1a2c + + + + #define + ETCPAL_IPV6_V6ONLY + group__etcpal__socket.html + ga6a502de1f396117da63bde901d88e434 + + + + #define + ETCPAL_POLL_IN + group__etcpal__socket.html + ga4e4bec5c7c2860538445ebdba2dd4283 + + + + #define + ETCPAL_POLL_OUT + group__etcpal__socket.html + ga04ebfb989375a6cf612d69f229a74954 + + + + #define + ETCPAL_POLL_CONNECT + group__etcpal__socket.html + gabbd670e11bf27a8a815b2d7985b9a364 + + + + #define + ETCPAL_POLL_OOB + group__etcpal__socket.html + ga1da970a4c0bd353ec963e4bb70c0f8b8 + + + + #define + ETCPAL_POLL_ERR + group__etcpal__socket.html + ga837082b33f4ca260e78373ee40bd25ec + + + + PLATFORM_DEFINED + EtcPalPollContext + group__etcpal__socket.html + ga906fd2bcb17663f4de3fefd0b335656e + + + + etcpal_error_t + etcpal_poll_context_init + group__etcpal__socket.html + gaf566500c673f2e7941f9a399c61c1b68 + (EtcPalPollContext *context) + + + void + etcpal_poll_context_deinit + group__etcpal__socket.html + ga08a886e98949a8c0ba7f162e54cd1a72 + (EtcPalPollContext *context) + + + etcpal_error_t + etcpal_poll_add_socket + group__etcpal__socket.html + gab901f9cf32e98e0d99369366f2e1ffa4 + (EtcPalPollContext *context, etcpal_socket_t socket, etcpal_poll_events_t events, void *user_data) + + + etcpal_error_t + etcpal_poll_modify_socket + group__etcpal__socket.html + ga396b218eda2c3e52b4b917b73e18dab7 + (EtcPalPollContext *context, etcpal_socket_t socket, etcpal_poll_events_t new_events, void *new_user_data) + + + void + etcpal_poll_remove_socket + group__etcpal__socket.html + ga8233886a08aff8ba010dfa7384c76408 + (EtcPalPollContext *context, etcpal_socket_t socket) + + + etcpal_error_t + etcpal_poll_wait + group__etcpal__socket.html + gae5017e2346be12e91c6450fe9860614b + (EtcPalPollContext *context, EtcPalPollEvent *event, int timeout_ms) + + + + etcpal_thread + thread (Threading) + group__etcpal__thread.html + EtcPalThreadParams + + #define + ETCPAL_THREAD_SET_DEFAULT_PARAMS + group__etcpal__thread.html + gacb54f3a06ea1b8ae0f45b8daaae37efe + (threadparamsptr) + + + #define + ETCPAL_THREAD_PARAMS_INIT_VALUES + group__etcpal__thread.html + gacbaaaa3fb12075714725a11874b6b4ad + + + + #define + ETCPAL_THREAD_PARAMS_INIT + group__etcpal__thread.html + ga7f21ced82782c355a30a8ad011aa5b91 + + + + #define + ETCPAL_THREAD_DEFAULT_PRIORITY + group__etcpal__thread.html + ga3539233977b6e793b9b5a4c071fd6e78 + + + + #define + ETCPAL_THREAD_DEFAULT_STACK + group__etcpal__thread.html + gac4147a48a462f0c5b9758334b41243a9 + + + + #define + ETCPAL_THREAD_DEFAULT_NAME + group__etcpal__thread.html + ga41f1567e754166e758fc1fdda38fc300 + + + + #define + ETCPAL_THREAD_NAME_MAX_LENGTH + group__etcpal__thread.html + ga5a0a37d186ac57231b94c287a58b54a0 + + + + #define + ETCPAL_THREAD_HAS_TIMED_JOIN + group__etcpal__thread.html + gaf382d29335eeeb4ed5c8d295bb8a380b + + + + struct EtcPalThreadParams + EtcPalThreadParams + group__etcpal__thread.html + gabb277d1d3fc2b021ca7513d8af038ed4 + + + + PLATFORM_DEFINED + etcpal_thread_t + group__etcpal__thread.html + ga6ea2bb55f405380e3ea296e3b6164ae8 + + + + etcpal_error_t + etcpal_thread_create + group__etcpal__thread.html + ga16f3116e3a533530d44c0d47b263f8e9 + (etcpal_thread_t *id, const EtcPalThreadParams *params, void(*thread_fn)(void *), void *thread_arg) + + + etcpal_error_t + etcpal_thread_join + group__etcpal__thread.html + ga711be33696701513f19239cf22dc3792 + (etcpal_thread_t *id) + + + etcpal_error_t + etcpal_thread_timed_join + group__etcpal__thread.html + ga37eccd4b250f7b697bd366922d081f13 + (etcpal_thread_t *id, int timeout_ms) + + + etcpal_error_t + etcpal_thread_terminate + group__etcpal__thread.html + ga9906049c7d559046052fa9509aedb705 + (etcpal_thread_t *id) + + + void + etcpal_thread_sleep + group__etcpal__thread.html + gaf5d7c5aec312d172e617fd653ade3b08 + (unsigned int sleep_ms) + + + + etcpal_timer + timer (Timers) + group__etcpal__timer.html + EtcPalTimer + + #define + ETCPAL_TIME_ELAPSED_SINCE + group__etcpal__timer.html + ga90572188aaa8e169a70ad52ce251ba9c + (start_time) + + + struct EtcPalTimer + EtcPalTimer + group__etcpal__timer.html + gaa8f82d792cb262d907daa7b9586220ad + + + + uint32_t + etcpal_getms + group__etcpal__timer.html + gad9f192bf100bebdab2d0169c44af066a + (void) + + + void + etcpal_timer_start + group__etcpal__timer.html + ga6e34d82478d4ad222a22df781b5f2f44 + (EtcPalTimer *timer, uint32_t interval) + + + void + etcpal_timer_reset + group__etcpal__timer.html + gae3f2a33d174900c2a2a67e2eef842069 + (EtcPalTimer *timer) + + + uint32_t + etcpal_timer_elapsed + group__etcpal__timer.html + ga5d73c9f8144f65719e8b319cdfdc05bb + (const EtcPalTimer *timer) + + + bool + etcpal_timer_is_expired + group__etcpal__timer.html + gaccc47c2970648c782918f8ab21d10ae9 + (const EtcPalTimer *timer) + + + uint32_t + etcpal_timer_remaining + group__etcpal__timer.html + ga8f0822e6e65f8e63b3776533ce1ff531 + (const EtcPalTimer *timer) + + + + etcpal_uuid + uuid (UUIDs) + group__etcpal__uuid.html + EtcPalUuid + + #define + ETCPAL_UUID_BYTES + group__etcpal__uuid.html + gadfd6e6a51b681c03b6422d1454ddc954 + + + + #define + ETCPAL_UUID_CMP + group__etcpal__uuid.html + ga6f2cff87ab29b0b26d0f641b065c998d + (uuid1ptr, uuid2ptr) + + + #define + ETCPAL_UUID_IS_NULL + group__etcpal__uuid.html + ga3f7c7f1f596e00536adbefb78899ebd1 + (uuidptr) + + + #define + ETCPAL_UUID_STRING_BYTES + group__etcpal__uuid.html + gabab14207e273082491f7be2a21275092 + + + + #define + ETCPAL_UUID_DEV_STR_MAX_LEN + group__etcpal__uuid.html + ga191ac9542f1d4eaa95488b3740bb57bf + + + + struct EtcPalUuid + EtcPalUuid + group__etcpal__uuid.html + ga472e79f55f51afda28c54c6967018922 + + + + bool + etcpal_uuid_to_string + group__etcpal__uuid.html + ga479b00b02ab33cf757e9476ad3286336 + (const EtcPalUuid *uuid, char *buf) + + + bool + etcpal_string_to_uuid + group__etcpal__uuid.html + ga8da6cbed139b61853a98f41120e73b29 + (const char *str, EtcPalUuid *uuid) + + + etcpal_error_t + etcpal_generate_v1_uuid + group__etcpal__uuid.html + ga7a2029b259cc4270fb721b976f21972a + (EtcPalUuid *uuid) + + + etcpal_error_t + etcpal_generate_v3_uuid + group__etcpal__uuid.html + gacede094cfd672660efa757fa2625e083 + (const EtcPalUuid *ns, const void *name, size_t name_len, EtcPalUuid *uuid) + + + etcpal_error_t + etcpal_generate_v4_uuid + group__etcpal__uuid.html + ga1cabb8b6f72752b1a2ae72f776301242 + (EtcPalUuid *uuid) + + + etcpal_error_t + etcpal_generate_v5_uuid + group__etcpal__uuid.html + gac74a0ebbade4f8c2b90a778529176c9b + (const EtcPalUuid *ns, const void *name, size_t name_len, EtcPalUuid *uuid) + + + etcpal_error_t + etcpal_generate_os_preferred_uuid + group__etcpal__uuid.html + gabb977b5a218b4b62224c016bf3932f10 + (EtcPalUuid *uuid) + + + etcpal_error_t + etcpal_generate_device_uuid + group__etcpal__uuid.html + ga1a5104de6a3c54113edf234e0840dcda + (const char *dev_str, const uint8_t *mac_addr, uint32_t uuid_num, EtcPalUuid *uuid) + + + const EtcPalUuid + kEtcPalNullUuid + group__etcpal__uuid.html + gae518c32bbc7d2266568ee9a703bb4f5e + + + + + etcpal_cpp + C++ Wrappers + group__etcpal__cpp.html + etcpal_cpp_error + etcpal_cpp_inet + etcpal_cpp_lock + etcpal_cpp_log + etcpal_cpp_queue + etcpal_cpp_thread + etcpal_cpp_timer + etcpal_cpp_uuid + + #define + ETCPAL_CONSTEXPR_14 + group__etcpal__cpp.html + ga27619ac477b23790da36baecb4389ee1 + + + + #define + ETCPAL_CONSTEXPR_14_OR_INLINE + group__etcpal__cpp.html + ga598701b6928c77a8c086183a0a1cb9cc + + + + #define + ETCPAL_NO_EXCEPTIONS + group__etcpal__cpp.html + gaaecae23a851a2e3b6d126547fbefbae3 + + + + + etcpal_cpp_error + error (Error Handling) + group__etcpal__cpp__error.html + etcpal::Error + etcpal::BadExpectedAccess + etcpal::Expected + + + etcpal_cpp_inet + inet (Internet Addressing) + group__etcpal__cpp__inet.html + etcpal::IpAddr + etcpal::SockAddr + etcpal::MacAddr + + + IpAddrType + group__etcpal__cpp__inet.html + gaf149bcc08653396944a3699b8c5a57c5 + + Invalid + V4 + V6 + + + + etcpal_cpp_lock + lock (Locks and Synchronization) + group__etcpal__cpp__lock.html + etcpal::Mutex + etcpal::Signal + etcpal::RwLock + etcpal::Semaphore + etcpal::MutexGuard + etcpal::ReadGuard + etcpal::WriteGuard + + + etcpal_cpp_log + log (Logging) + group__etcpal__cpp__log.html + etcpal::LogTimestamp + etcpal::LogMessageHandler + etcpal::Logger + + + LogDispatchPolicy + group__etcpal__cpp__log.html + ga886bd6be55942894f6ddb878d1cfc662 + + Direct + Queued + + + + etcpal_cpp_queue + queue (RTOS queues) + group__etcpal__cpp__queue.html + etcpal::Queue + + + etcpal_cpp_thread + thread (Threading) + group__etcpal__cpp__thread.html + etcpal::Thread + + + etcpal_cpp_timer + timer (Timers) + group__etcpal__cpp__timer.html + etcpal::TimePoint + etcpal::Timer + + + etcpal_cpp_uuid + uuid (UUIDs) + group__etcpal__cpp__uuid.html + etcpal::Uuid + + + etcpal_lock + lock (Locks and Synchronization) + group__etcpal__lock.html + etcpal_mutex + etcpal_signal + etcpal_rwlock + etcpal_sem + + + etcpal_mutex + Mutexes + group__etcpal__mutex.html + + #define + ETCPAL_MUTEX_HAS_TIMED_LOCK + group__etcpal__mutex.html + ga8c452b6fbbfffb5071cbb62c2011cd68 + + + + PLATFORM_DEFINED + etcpal_mutex_t + group__etcpal__mutex.html + ga7360372b14b0feb1ad9f22d2a42734a9 + + + + bool + etcpal_mutex_create + group__etcpal__mutex.html + ga848f261552bf8c981590eb784ee5b3b8 + (etcpal_mutex_t *id) + + + bool + etcpal_mutex_lock + group__etcpal__mutex.html + gab53dcdc649c23fb797228f414bb67e34 + (etcpal_mutex_t *id) + + + bool + etcpal_mutex_try_lock + group__etcpal__mutex.html + gac3095a52d1afa4b44ffa066a9dde05a5 + (etcpal_mutex_t *id) + + + bool + etcpal_mutex_timed_lock + group__etcpal__mutex.html + ga94809c21d2ddd2ab62bbb7c7d3f7f576 + (etcpal_mutex_t *id, int timeout_ms) + + + void + etcpal_mutex_unlock + group__etcpal__mutex.html + ga8468c318f6d0737460888bfd6ddd3fe5 + (etcpal_mutex_t *id) + + + void + etcpal_mutex_destroy + group__etcpal__mutex.html + ga4b71ed71a637a07c0fe5cd55222a209c + (etcpal_mutex_t *id) + + + + etcpal_signal + Signals + group__etcpal__signal.html + + #define + ETCPAL_SIGNAL_HAS_TIMED_WAIT + group__etcpal__signal.html + gae27ec551b3bcdeb4c72e6ecea9ba3ca8 + + + + #define + ETCPAL_SIGNAL_HAS_POST_FROM_ISR + group__etcpal__signal.html + ga29bf79c6470cde2c5bdc45ab90f4d826 + + + + PLATFORM_DEFINED + etcpal_signal_t + group__etcpal__signal.html + gab450fff060bfcede49357b2e00357669 + + + + bool + etcpal_signal_create + group__etcpal__signal.html + ga4082ebadfba33b125930d5c5067139f0 + (etcpal_signal_t *id) + + + bool + etcpal_signal_wait + group__etcpal__signal.html + ga10e2d2cc15e6a30f38ba65f02c0905d7 + (etcpal_signal_t *id) + + + bool + etcpal_signal_try_wait + group__etcpal__signal.html + gaae6c46b47ab125aeac18bf0a27bc6f9d + (etcpal_signal_t *id) + + + bool + etcpal_signal_timed_wait + group__etcpal__signal.html + ga770f7b128af027172c866a765f50f4fb + (etcpal_signal_t *id, int timeout_ms) + + + void + etcpal_signal_post + group__etcpal__signal.html + gafa2af190375bdb673563e2a029f0a89b + (etcpal_signal_t *id) + + + void + etcpal_signal_post_from_isr + group__etcpal__signal.html + gad88439176943dd91e5a98f0f508c55a1 + (etcpal_signal_t *id) + + + void + etcpal_signal_destroy + group__etcpal__signal.html + ga4ecc28a0f67939859d91c8e9e75701e4 + (etcpal_signal_t *id) + + + + etcpal_rwlock + Read-Write Locks + group__etcpal__rwlock.html + + #define + ETCPAL_RWLOCK_HAS_TIMED_LOCK + group__etcpal__rwlock.html + ga076630adff898bb71a4aaca77a73aefc + + + + PLATFORM_DEFINED + etcpal_rwlock_t + group__etcpal__rwlock.html + ga5949678b1acff7d9829e257a9bee8d8e + + + + bool + etcpal_rwlock_create + group__etcpal__rwlock.html + ga694477ee8932b83784f2d7a70ac856e3 + (etcpal_rwlock_t *id) + + + bool + etcpal_rwlock_readlock + group__etcpal__rwlock.html + ga846b8783133884b5fbce918811568825 + (etcpal_rwlock_t *id) + + + bool + etcpal_rwlock_try_readlock + group__etcpal__rwlock.html + ga473b7cb0a2bae2deb5477bb699e6cf9b + (etcpal_rwlock_t *id) + + + bool + etcpal_rwlock_timed_readlock + group__etcpal__rwlock.html + gafa8f15715dac3b6f54bd7dcafe62da10 + (etcpal_rwlock_t *id, int timeout_ms) + + + void + etcpal_rwlock_readunlock + group__etcpal__rwlock.html + ga3ab0cac4b091255a2694a4a472151160 + (etcpal_rwlock_t *id) + + + bool + etcpal_rwlock_writelock + group__etcpal__rwlock.html + gac6989af16cb55025d06ee35373739380 + (etcpal_rwlock_t *id) + + + bool + etcpal_rwlock_try_writelock + group__etcpal__rwlock.html + ga05a985e996a37e5a4c8aa7f9c3b1d654 + (etcpal_rwlock_t *id) + + + bool + etcpal_rwlock_timed_writelock + group__etcpal__rwlock.html + ga0f848288a067dbfd5348c089c1dbb76b + (etcpal_rwlock_t *id, int timeout_ms) + + + void + etcpal_rwlock_writeunlock + group__etcpal__rwlock.html + ga83fbb82557a70ad86c8a65fd53b0cb8b + (etcpal_rwlock_t *id) + + + void + etcpal_rwlock_destroy + group__etcpal__rwlock.html + ga2d4feb63613ff8dfb1f106f5ed63dee5 + (etcpal_rwlock_t *id) + + + + etcpal_sem + Counting Semaphores + group__etcpal__sem.html + + #define + ETCPAL_SEM_HAS_TIMED_WAIT + group__etcpal__sem.html + gaada2b485228c5c702f240abd8d42c836 + + + + #define + ETCPAL_SEM_HAS_POST_FROM_ISR + group__etcpal__sem.html + ga297a9999fd042d5dc38a1d4956c1cb50 + + + + #define + ETCPAL_SEM_HAS_MAX_COUNT + group__etcpal__sem.html + ga6c5d81a112726041fbdc0836eeb86896 + + + + #define + ETCPAL_SEM_MUST_BE_BALANCED + group__etcpal__sem.html + ga30a5fee3bf1f93fdb589fe2a99055b0c + + + + PLATFORM_DEFINED + etcpal_sem_t + group__etcpal__sem.html + ga90664f75ae59f03b85b45cc19d3a55ef + + + + bool + etcpal_sem_create + group__etcpal__sem.html + ga5f8de05c22efb1e25bf24890b4afb21d + (etcpal_sem_t *id, unsigned int initial_count, unsigned int max_count) + + + bool + etcpal_sem_wait + group__etcpal__sem.html + gadf3cdb9d9d92dfde1b9933d6076e63aa + (etcpal_sem_t *id) + + + bool + etcpal_sem_try_wait + group__etcpal__sem.html + ga4e6901853d69d55f97717f14bb6eb290 + (etcpal_sem_t *id) + + + bool + etcpal_sem_timed_wait + group__etcpal__sem.html + gad2f3af8fc26a2d028edd4c1341304061 + (etcpal_sem_t *id, int timeout_ms) + + + bool + etcpal_sem_post + group__etcpal__sem.html + ga9e39fbcf982a2d058c7b3f1c598d6aac + (etcpal_sem_t *id) + + + bool + etcpal_sem_post_from_isr + group__etcpal__sem.html + gacd9bdeefdee24e47f40090840665c4fb + (etcpal_sem_t *id) + + + void + etcpal_sem_destroy + group__etcpal__sem.html + gaa4d8fce64dfa93c4c2f7bd08100ef8b0 + (etcpal_sem_t *id) + + + + etcpal_queue + queue (RTOS queues) + group__etcpal__queue.html + + bool + etcpal_queue_create + group__etcpal__queue.html + gaefbd1625abdb0e502024b9c9749c2b17 + (etcpal_queue_t *id, size_t size, size_t item_size) + + + void + etcpal_queue_destroy + group__etcpal__queue.html + ga89749b4899a165bb461570e8a91d470c + (etcpal_queue_t *id) + + + bool + etcpal_queue_send + group__etcpal__queue.html + gad11692ddc849a8c049c1f15da818957d + (etcpal_queue_t *id, const void *data) + + + bool + etcpal_queue_timed_send + group__etcpal__queue.html + gae0c1e587408884bfdf7e9502cac7ffa7 + (etcpal_queue_t *id, const void *data, int timeout_ms) + + + bool + etcpal_queue_send_from_isr + group__etcpal__queue.html + ga19c542b25dd6f5884c4d69ec8c891bb2 + (etcpal_queue_t *id, const void *data) + + + bool + etcpal_queue_receive + group__etcpal__queue.html + ga6606a64800aeb535bc2fea3317e6fd44 + (etcpal_queue_t *id, void *data) + + + bool + etcpal_queue_timed_receive + group__etcpal__queue.html + ga13c3c4ca6b7b2ace00da407f52bba261 + (etcpal_queue_t *id, void *data, int timeout_ms) + + + bool + etcpal_queue_is_empty + group__etcpal__queue.html + ga3c0f4a48f832d88fead582a330255aec + (const etcpal_queue_t *id) + + + bool + etcpal_queue_is_empty_from_isr + group__etcpal__queue.html + ga0a72aed21853d03ac10a09bafd148d0d + (const etcpal_queue_t *id) + + + + etcpal_opts + EtcPal config options + group__etcpal__opts.html + + #define + ETCPAL_INCLUDE_PACK_64 + group__etcpal__opts.html + ga5ababb448dd9ec260738821bd16d06cd + + + + #define + ETCPAL_EMBOS_USE_MALLOC + group__etcpal__opts.html + gaab67221f3adba4ea2b638e55341f8074 + + + + #define + ETCPAL_EMBOS_MAX_NETINTS + group__etcpal__opts.html + gaf5e80b2cbceca9bbe4e918610021a5ba + + + + + additional_docs + Additional Documentation + additional_docs + + + building_etcpal + Building EtcPal + building_etcpal + + + building_for_embedded + Building EtcPal for an embedded target + building_for_embedded + + + interface_indexes + Network Interface Indexes + interface_indexes + + + targeting_freertos + Targeting FreeRTOS + targeting_freertos + + + targeting_lwip + Targeting lwIP + targeting_lwip + + + targeting_mqx + Targeting MQX + targeting_mqx + + + index + ETC Platform Abstraction Layer + index + + diff --git a/docs/generate_doxygen.py b/docs/generate_doxygen.py new file mode 100644 index 000000000..e8f6f85fb --- /dev/null +++ b/docs/generate_doxygen.py @@ -0,0 +1,75 @@ +import argparse +import os +import re +import shutil +import subprocess +import sys +import time + +parser = argparse.ArgumentParser(description="Generate the EtcPal documentation") +parser.add_argument("-r", "--release", help="The release number that this documentation is being generated for.") +args = parser.parse_args() + +THIS_SCRIPT_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) + +print("Generating Doxygen and capturing warnings...") + +if os.getenv("BUILD_REASON", "IndividualCI") == "PullRequest": + project_number = "Staging for pull request {}".format( + os.getenv("SYSTEM_PULLREQUEST_PULLREQUESTNUMBER") + ) + output_dir = "build/{}/docs/stage/{}".format( + os.getenv("GH_REPO_NAME", "EtcPal"), + os.getenv("SYSTEM_PULLREQUEST_PULLREQUESTNUMBER"), + ) +elif args.release: + project_number = args.release + (vers_maj, vers_min, _) = args.release.split(".") + output_dir = "build/{}/docs/v{}".format(os.getenv("GH_REPO_NAME", "EtcPal"), f"{vers_maj}.{vers_min}") +else: + project_number = "HEAD (unstable)" + output_dir = "build/{}/docs/head".format(os.getenv("GH_REPO_NAME", "EtcPal")) + +# Remove the relevant documentation directory - git will resolve the changes when the documentation +# is regenerated. +shutil.rmtree(output_dir, ignore_errors=True) +os.makedirs(output_dir) + +with open("Doxyfile", "r") as doxyfile: + dox_input = doxyfile.read() + dox_input += '\nPROJECT_NUMBER="{}"'.format(project_number) + dox_input += '\nOUTPUT_DIRECTORY="{}"'.format(output_dir) + dox_input += "\nHTML_OUTPUT=." + process_result = subprocess.run( + ["doxygen", "-"], input=dox_input.encode("utf-8"), capture_output=True + ) + +# Print normal output, then print warnings or errors formatted for the Azure Pipelines task. +print(process_result.stdout.decode("utf-8")) + +print("\nISSUES:\n") +num_issues = 0 +# Check to see if we are running on Azure Pipelines. +if os.getenv("BUILD_BUILDID"): + for line in process_result.stderr.decode("utf-8").splitlines(): + num_issues += 1 + if "error:" in line: + print("##vso[task.logissue type=error]{}".format(line)) + else: + match = re.match(r"(.+):(\d+):(.+)", line) + if match: + print( + "##vso[task.logissue type=warning;sourcepath={};linenumber={};columnnumber=0]{}".format( + match.group(1), match.group(2), match.group(3).replace("warning: ", "") + ) + ) + else: + print("##vso[task.logissue type=warning]{}".format(line)) +else: + decoded = process_result.stderr.decode("utf-8") + num_issues = len(decoded.splitlines()) + print(decoded) + +print("\n{} issues captured.".format(num_issues)) + +sys.exit(process_result.returncode) diff --git a/docs/header.html b/docs/header.html index 7f6b3693c..156511aaa 100644 --- a/docs/header.html +++ b/docs/header.html @@ -24,7 +24,7 @@