From 860b56ab47969da6ca4b316664c0ed74f80ed895 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 17:42:53 +0000 Subject: [PATCH 01/24] ci: bump softprops/action-gh-release from 2.0.5 to 2.0.6 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.5 to 2.0.6. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2.0.5...v2.0.6) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/prepare_release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prepare_release.yaml b/.github/workflows/prepare_release.yaml index 07f3fabe8..db9322a0d 100644 --- a/.github/workflows/prepare_release.yaml +++ b/.github/workflows/prepare_release.yaml @@ -151,7 +151,7 @@ jobs: # Create a new release - name: Create release id: create_release - uses: softprops/action-gh-release@v2.0.5 + uses: softprops/action-gh-release@v2.0.6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 110ca9b37cc5105d753d174d8235f7979715296d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:07:58 +0000 Subject: [PATCH 02/24] ci: bump arduino/setup-arduino-cli from 1.1.2 to 2.0.0 Bumps [arduino/setup-arduino-cli](https://github.com/arduino/setup-arduino-cli) from 1.1.2 to 2.0.0. - [Release notes](https://github.com/arduino/setup-arduino-cli/releases) - [Commits](https://github.com/arduino/setup-arduino-cli/compare/v1.1.2...v2.0.0) --- updated-dependencies: - dependency-name: arduino/setup-arduino-cli dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build_examples.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_examples.yaml b/.github/workflows/build_examples.yaml index bfdc620ee..3d000ae43 100644 --- a/.github/workflows/build_examples.yaml +++ b/.github/workflows/build_examples.yaml @@ -123,7 +123,7 @@ jobs: # We use the `arduino/setup-arduino-cli` action to install and # configure the Arduino CLI on the system. - name: Setup Arduino CLI - uses: arduino/setup-arduino-cli@v1.1.2 + uses: arduino/setup-arduino-cli@v2.0.0 - name: Restore Arduino platforms and libraries uses: actions/cache@v4 From a5ba55c3479a78c5c91a90690fcf0b27af72053a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:35:45 +0000 Subject: [PATCH 03/24] ci: bump softprops/action-gh-release from 2.0.6 to 2.0.8 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.0.6 to 2.0.8. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2.0.6...v2.0.8) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/prepare_release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/prepare_release.yaml b/.github/workflows/prepare_release.yaml index db9322a0d..47eba14bb 100644 --- a/.github/workflows/prepare_release.yaml +++ b/.github/workflows/prepare_release.yaml @@ -151,7 +151,7 @@ jobs: # Create a new release - name: Create release id: create_release - uses: softprops/action-gh-release@v2.0.6 + uses: softprops/action-gh-release@v2.0.8 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: From 1ff8b3c89823247d2a5917f94f9ea42df2d4fada Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 8 Aug 2024 16:04:36 -0400 Subject: [PATCH 04/24] Switch to reusable workflows Signed-off-by: Sara Damiano --- .github/dependabot.yml | 2 +- .github/workflows/build_documentation.yaml | 144 +--- .github/workflows/prepare_release.yaml | 184 +---- .../workflows/verify_library_structure.yaml | 95 +-- .gitignore | 32 +- .../generate-documentation.sh | 43 -- continuous_integration/generate_job_matrix.py | 106 ++- .../install-deps-arduino-cli.sh | 159 ----- .../install-deps-platformio.sh | 133 ---- .../install-test-version-arduino-cli.sh | 44 -- docs/Doxyfile | 661 +++++++++++------- examples/example_dependencies.json | 26 + 12 files changed, 577 insertions(+), 1052 deletions(-) delete mode 100644 continuous_integration/generate-documentation.sh delete mode 100644 continuous_integration/install-deps-arduino-cli.sh delete mode 100644 continuous_integration/install-deps-platformio.sh delete mode 100644 continuous_integration/install-test-version-arduino-cli.sh create mode 100644 examples/example_dependencies.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0f88bec19..7318fd3ae 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,7 +3,7 @@ updates: - package-ecosystem: 'github-actions' directory: '/' schedule: - interval: 'daily' + interval: 'weekly' labels: - 'CI/CD' commit-message: diff --git a/.github/workflows/build_documentation.yaml b/.github/workflows/build_documentation.yaml index a42b55b39..c834db08f 100644 --- a/.github/workflows/build_documentation.yaml +++ b/.github/workflows/build_documentation.yaml @@ -1,13 +1,19 @@ -name: Check for Complete Documentation +name: Check, Build, and Publish Documentation on: # Triggers the workflow on push or pull request events push: pull_request: # Trigger when a release is created + # NOTE: This will only trigger if the release is created from the UI or with a personal access token release: types: - published + # Trigger with the release workflow finishes + workflow_run: + workflows: ['Create a New Release'] + types: [completed] + branches: [master] # Also give a manual trigger workflow_dispatch: inputs: @@ -21,135 +27,13 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -env: - REBUILD_CACHE_NUMBER: 2 - PYTHON_DEPS_ARCHIVE_NUM: 2 - DOXYGEN_VERSION: Release_1_9_6 - TEX_VERSION: 2019 - # ^^ 2019 is the latest TeX live available on apt-get and that's good enough - GRAPHVIZ_VERSION: 2.43.0 - jobs: - check_menu_inclusion: - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'ci skip')" - name: Check that all classes are documented in the menu-a-la-carte example - - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - # Using answer from here to get the exit code and pass the output: https://stackoverflow.com/questions/59191913/how-do-i-get-the-output-of-a-specific-step-in-github-actions - - name: check for classes in the menu example - id: check_component - continue-on-error: true - run: | - cd $GITHUB_WORKSPACE/continuous_integration - python check_component_inclusion.py 2>&1 | tee check_component.log - result_code=${PIPESTATUS[0]} - missing_menu_docs=$(cat check_component.log) - missing_menu_docs="${missing_menu_docs//'%'/'%25'}" - missing_menu_docs="${missing_menu_docs//$'\n'/'%0A'}" - missing_menu_docs="${missing_menu_docs//$'\r'/'%0D'}" - echo "missing_menu_docs=missing_menu_docs" >> $GITHUB_OUTPUT - if [[ $result_code ]]; then - echo "$(cat check_component.log)" >> $GITHUB_STEP_SUMMARY - else - echo "Valid library.json =)" >> $GITHUB_STEP_SUMMARY - fi - echo "Finished menu inclusion verification" - exit $result_code - - - name: Create commit comment - uses: peter-evans/commit-comment@v3 - if: steps.check_component.outcome=='failure' - with: - body: | - All sensor and variable subclasses must be included in the Menu a la Carte example - ${{ steps.check_component.outputs.missing_menu_docs }} - - - name: Fail if cannot find all menu flags - id: verification_failure - if: steps.check_component.outcome=='failure' - run: exit 1 - doc_build: - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'ci skip')" + if: ${{ (! contains(github.event.head_commit.message, 'ci skip')) && (github.event_name != 'workflow_run' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')) }} name: Build documentation - - steps: - # check out the ModularSensors repo - - uses: actions/checkout@v4 - with: - path: code_docs/ModularSensors - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Restore Python Dependencies - uses: actions/cache@v4 - id: cache_python - with: - path: ~/.cache/pip - key: ${{ runner.os }}-python-${{ env.REBUILD_CACHE_NUMBER }}-${{ env.PYTHON_DEPS_ARCHIVE_NUM }} - - - name: Install Pygments and other m.css Python Requirements - run: | - python -m pip install --upgrade pip - pip3 install --upgrade --upgrade-strategy only-if-needed jinja2 Pygments beautifulsoup4 - - - name: Restore Doxygen, Graphviz, and TeX Live - id: cache_doxygen - uses: actions/cache@v4 - with: - path: | - /usr/lib/x86_64-linux-gnu/texlive - /usr/lib/x86_64-linux-gnu/graphviz - doxygen-src - key: ${{ runner.os }}-doxygen-${{ env.REBUILD_CACHE_NUMBER }}-${{ env.DOXYGEN_VERSION }}-${{ env.TEX_VERSION }}-${{ env.GRAPHVIZ_VERSION }} - - - name: Build and install doxygen and its dependencies - if: steps.cache_doxygen.outputs.cache-hit != 'true' - run: | - cd ${{ github.workspace }}/code_docs/ModularSensors/ - chmod +x continuous_integration/build-install-doxygen.sh - sh continuous_integration/build-install-doxygen.sh - - # check out my fork of m.css, for processing Doxygen output - - name: Checkout m.css - uses: actions/checkout@v4 - with: - # Repository name with owner. For example, actions/checkout - repository: SRGDamia1/m.css - path: code_docs/m.css - - - name: Generate all the documentation - continue-on-error: true - run: | - cd ${{ github.workspace }}/code_docs/ModularSensors/ - chmod +x continuous_integration/generate-documentation.sh - sh continuous_integration/generate-documentation.sh 2>&1 | tee doxygen_run_output.log - result_code=${PIPESTATUS[0]} - echo "doxygen_warnings=$(cat docs/output_doxygen.log)" >> $GITHUB_OUTPUT - echo "mcss_warnings=$(cat docs/output_mcss.log)" >> $GITHUB_OUTPUT - echo "## Doxygen completed with the following warnings:" >> $GITHUB_STEP_SUMMARY - echo "$(cat docs/output_doxygen.log)" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "## mcss Doxygen post-processing completed with the following warnings:" >> $GITHUB_STEP_SUMMARY - echo "$(cat docs/output_mcss.log)" >> $GITHUB_STEP_SUMMARY - echo "Finished generating documentation" - exit $result_code - - - name: Deploy to github pages - if: "(github.event_name == 'release' && github.event.action == 'published') || (github.event_name == 'workflow_dispatch' && github.event.inputs.publish == 'true')" - uses: peaceiris/actions-gh-pages@v4.0.0 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ${{ github.workspace }}/code_docs/ModularSensorsDoxygen/m.css + uses: EnviroDIY/workflows/.github/workflows/build_documentation.yaml@main + with: + use_graphviz: false + publish: ${{ (github.event_name == 'release' && github.event.action == 'published') || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') || (github.event_name == 'workflow_dispatch' && github.event.inputs.publish == 'true')}} + rebuild_cache_number: 1 + secrets: inherit diff --git a/.github/workflows/prepare_release.yaml b/.github/workflows/prepare_release.yaml index 07f3fabe8..62f618b3e 100644 --- a/.github/workflows/prepare_release.yaml +++ b/.github/workflows/prepare_release.yaml @@ -7,165 +7,43 @@ on: - 'VERSION' # Push events when the VERSION file changes workflow_dispatch: -name: Prepare a new release and add release assets +name: Create a New Release env: PLATFORMIO_AUTH_TOKEN: ${{ secrets.PLATFORMIO_AUTH_TOKEN }} jobs: - release: - name: Prepare a new release + wait_for_checks: + if: ${{ github.event_name != 'workflow_dispatch' }} + strategy: + matrix: + req_workflow: + [ + verify_library_structure.yaml, + build_examples.yaml, + build_documentation.yaml, + ] + name: Wait for Checks to complete runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set environment variable for current library version - run: | - echo "::debug::Get the current version number" - VER=$(cat VERSION) - ZIP_FILE="ModularSensors_Dependencies_${VER}" - echo "VERSION=$VER" >> $GITHUB_ENV - echo "ZIP_NAME=$ZIP_FILE" >> $GITHUB_ENV - - - name: Set up python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install PlatformIO - run: | - python -m pip install --upgrade pip - pip install --upgrade platformio - - # Install *all* the libraries! - - name: Install the libraries - run: | - chmod +x continuous_integration/install-deps-platformio.sh - sh continuous_integration/install-deps-platformio.sh - - - name: Install ModularSensors from the master branch - run: | - pio pkg install -g -l https://github.com/EnviroDIY/ModularSensors - - # Uninstall graphics libraries from Adafruit - - name: Uninstall Adafruit GFX Library library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit GFX Library" - pio pkg uninstall -g -l "adafruit/Adafruit GFX Library" - - - name: Uninstall Adafruit NeoPixel library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit NeoPixel" - pio pkg uninstall -g -l "adafruit/Adafruit NeoPixel" - - - name: Uninstall Adafruit SSD1306 library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit SSD1306" - pio pkg uninstall -g -l "adafruit/Adafruit SSD1306" - - - name: Uninstall Adafruit ADXL343 library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit ADXL343" - pio pkg uninstall -g -l "adafruit/Adafruit ADXL343" - - - name: Uninstall Adafruit STMPE610 library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit STMPE610" - pio pkg uninstall -g -l "adafruit/Adafruit STMPE610" - - - name: Uninstall Adafruit TouchScreen library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit TouchScreen" - pio pkg uninstall -g -l "adafruit/Adafruit TouchScreen" - - - name: Uninstall Adafruit ILI9341 library - continue-on-error: true - run: | - echo "::debug::Removing Adafruit ILI9341" - pio pkg uninstall -g -l "adafruit/Adafruit ILI9341" - - # zip up all the installed libraries - # need to cd into the pio directory so we don't get extra junk directories - - name: Zip libraries - run: | - echo "::debug::Listing global libraries" - pio pkg list -g -v --only-libraries - echo "::debug::Zipping global libraries" - cd /home/runner/.platformio/ - zip ${{ env.ZIP_NAME }}.zip -r lib - mv ${{ env.ZIP_NAME }}.zip $GITHUB_WORKSPACE - cd $GITHUB_WORKSPACE - ls - - # Remove some extras from the zip - - name: Remove git files from the zip - continue-on-error: true - run: | - echo "::debug::Deleting extra files to decrease size of zip" - echo "::debug::Removing Git folders" - zip -d -q ${{ env.ZIP_NAME }} "*/.gitattributes" "*/.gitignore" "*/.gitmodules" "*/.github/*" "*.sh" "*/Doxyfile" "*/.travis.yml" - - name: Remove other pdfs from the zip - continue-on-error: true - run: | - echo "::debug::Removing other pdfs" - zip -d -q libraries "*/doc/*.pdf" - - name: Remove TinyGSM extras from the zip - continue-on-error: true - run: | - echo "::debug::Removing TinyGSM extras" - zip -d -q libraries "*/TinyGSM/extras/*" - - name: Remove YosemitechModbus extras from the zip - continue-on-error: true - run: | - echo "::debug::Removing YosemitechModbus extras" - zip -d -q libraries "*/YosemitechModbus/doc/*" - - name: Remove SDFat extras from the zip - continue-on-error: true - run: | - echo "::debug::Removing SDFat extras" - zip -d -q libraries "*/SdFat/extras/*" - - - name: Get change log entry for release notes - id: changelog_reader - uses: mindsers/changelog-reader-action@v2 - with: - path: ChangeLog.md - version: ${{ env.VERSION }} - # validation_depth: 10 - - # I use the first line of the change log entry as the name, so read it here - # - name: Get release name - # id: get_release_name - # run: | - # release_name=$(echo ${{steps.changelog_reader.outputs.changes}} | cut -d '\n' -f 1) - # echo "release_name=release_name" >> $GITHUB_OUTPUT - - # Create a new release - - name: Create release - id: create_release - uses: softprops/action-gh-release@v2.0.5 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Wait on Workflow + uses: ArcticLampyrid/action-wait-for-workflow@v1.2.0 with: - tag_name: ${{ format('v{0}',env.VERSION) }} - # name: ${{ format('v{0} - {1}', env.VERSION, steps.get_release_name.outputs.release_name) }} - name: ${{ format('v{0}',env.VERSION) }} - draft: ${{ steps.changelog_reader.outputs.status == 'unreleased' }} - prerelease: ${{ steps.changelog_reader.outputs.status == 'prereleased' }} - body: ${{ steps.changelog_reader.outputs.changes }} - generate_release_notes: false - files: ${{ format('./{0}.zip', env.ZIP_NAME) }} - fail_on_unmatched_files: true + workflow: ${{ matrix.req_workflow }} + sha: ${{ github.sha || github.event.pull_request.head.sha || github.event.pull_request.head.ref }} # optional + allowed-conclusions: | + success + cancelled + skipped - # Publish the new release to the PlatformIO package manager - - name: Publish release to the PlatformIO package manager - id: publish-pio - run: pio package publish --owner envirodiy --non-interactive + release: + name: Prepare a new release + needs: [wait_for_checks] + if: | + always() && + (needs.wait_for_checks.result == 'success' || needs.wait_for_checks.result == 'skipped') + uses: EnviroDIY/workflows/.github/workflows/prepare_release.yaml@main + secrets: inherit + with: + library-manager: 'update' + library-compliance: 'strict' diff --git a/.github/workflows/verify_library_structure.yaml b/.github/workflows/verify_library_structure.yaml index 2d8aad016..bf9958771 100644 --- a/.github/workflows/verify_library_structure.yaml +++ b/.github/workflows/verify_library_structure.yaml @@ -8,91 +8,10 @@ concurrency: cancel-in-progress: true jobs: - pio_lint: - name: Verify library.json for PlatformIO - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'ci skip')" - - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - - - name: Install PlatformIO - run: | - python -m pip install --upgrade pip - pip install --upgrade platformio - - - name: Run python script to verify structure of library.json for PlatformIO - id: validate_manifest - continue-on-error: true - run: | - python continuous_integration/validate_manifest.py 2>&1 | tee validate_manifest.log - result_code=${PIPESTATUS[0]} - manifest_errors=$(cat validate_manifest.log) - manifest_errors="${manifest_errors//'%'/'%25'}" - manifest_errors="${manifest_errors//$'\n'/'%0A'}" - manifest_errors="${manifest_errors//$'\r'/'%0D'}" - echo "manifest_errors=manifest_errors" >> $GITHUB_OUTPUT - echo "$(cat validate_manifest.log)" >> $GITHUB_STEP_SUMMARY - echo "Finished library.json manifest verification" - exit $result_code - - - name: Create commit comment - uses: peter-evans/commit-comment@v3 - if: steps.validate_manifest.outcome=='failure' - with: - body: | - Please correct errors in the library.json file! - ${{ steps.validate_manifest.outputs.manifest_errors }} - - - name: Fail if cannot verify json - id: verification_failure - if: steps.validate_manifest.outcome=='failure' - run: exit 1 - - arduino_lint: - name: Validate library structure for Arduino Library Manager inclusion - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'ci skip')" - - steps: - - uses: actions/checkout@v4 - - - name: Run Arduino-Lint to verify the library structure and syntax for the Arduino IDE - id: validate_library - continue-on-error: true - env: - ARDUINO_LINT_LIBRARY_MANAGER_INDEXING: true - uses: arduino/arduino-lint-action@v1 - with: - project-type: library - library-manager: submit - compliance: strict - verbose: true - report-file: arduino_lint.json - - - name: beautify_lint_output - id: beautify_output - run: | - python continuous_integration/beautify_arduino_lint_log.py - lint_errors=$(cat arduino_lint.md) - lint_errors="${lint_errors//'%'/'%25'}" - lint_errors="${lint_errors//$'\n'/'%0A'}" - lint_errors="${lint_errors//$'\r'/'%0D'}" - echo "lint_errors=lint_errors" >> $GITHUB_OUTPUT - echo "$(cat arduino_lint.md)" >> $GITHUB_STEP_SUMMARY - - - name: Create commit comment - uses: peter-evans/commit-comment@v3 - if: steps.validate_library.outcome=='failure' - with: - body: ${{ steps.beautify_output.outputs.lint_errors }} - - - name: Fail if cannot verify library structure - id: verification_failure - if: steps.validate_library.outcome=='failure' - run: exit 1 + verify_library_structure: + name: Validate library structure + if: ${{ ! contains(github.event.head_commit.message, 'ci skip') }} + uses: EnviroDIY/workflows/.github/workflows/verify_library_structure.yaml@main + with: + library-manager: 'update' + library-compliance: 'strict' diff --git a/.gitignore b/.gitignore index 9c278f49b..ec6909142 100644 --- a/.gitignore +++ b/.gitignore @@ -47,22 +47,22 @@ Network Trash Folder Temporary Items .apdisk +# Python +__pycache__/ + # PyCharm .idea/ -# Atom / PlatformIO -.pio -.pioenvs -.piolibdeps -.pio -.pio/libdeps -.pio/build +# Atom +.atomrc.cson + +# PlatformIO .pio/* .clang_complete .gcc-flags.json -.atomrc.cson lib/* include/* +boards/* /platformio.ini .sconsign.dblite @@ -80,21 +80,13 @@ YosemitechDO/ LongTermLogger/ barometric_correction/ 3G_Test/ - -__pycache__/ runDoxygen.bat docs/examples/* -output_doxygen.log -output_doxygen_run.log -output_mcss_run.log -output_mcss.log docs/examples.dox_x platformio_extra_envs.ini src/sensors/table.md cache -docs/output_copyFunctions.log -docs/output_documentExamples.log -docs/output_fixSectionsInXml.log +output_*.log examples/DRWI_Mayfly1_Wifi_5tm_ds18b20_1/DRWI_Mayfly1_Wifi_5tm_ds18b20_1.ino clang_format_all.bat arduino_lint.md @@ -109,6 +101,8 @@ continuous_integration_artifacts/* arduino_cli.log **/sensor_tests/* docs/Doxyfile.bak -continuous_integration/output_check_component_inclusion.log continuous_integration/platformio_ci_local.ini -pioScripts/install_shared_deps.py +runDoxygen_archive.bat +generateKeywords.bat +update_path.bat +pio_common_libdeps.ini diff --git a/continuous_integration/generate-documentation.sh b/continuous_integration/generate-documentation.sh deleted file mode 100644 index 5985eeaa1..000000000 --- a/continuous_integration/generate-documentation.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# Makes the bash script print out every command before it is executed, except echo -trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG - -# Script modified from scripts by Jeroen de Bruijn, thephez, and Adafruit -# https://gist.github.com/vidavidorra/548ffbcdae99d752da02 -# https://github.com/thephez/doxygen-travis-build -# https://learn.adafruit.com/the-well-automated-arduino-library/travis-ci - -# Exit with nonzero exit code if anything fails -set -e - -cd $GITHUB_WORKSPACE/code_docs/m.css -echo "\n\e[32mUpdate the style sheets\e[0m" -cd $GITHUB_WORKSPACE/code_docs/m.css/css/EnviroDIY -python $GITHUB_WORKSPACE/code_docs/m.css/css/postprocess.py "m-EnviroDIY.css" -python $GITHUB_WORKSPACE/code_docs/m.css/css/postprocess.py "m-EnviroDIY.css" "m-documentation.css" -o "m-EnviroDIY+documentation.compiled.css" -python $GITHUB_WORKSPACE/code_docs/m.css/css/postprocess.py "m-EnviroDIY.css" "m-theme-EnviroDIY.css" "m-documentation.css" --no-import -o "m-EnviroDIY.documentation.compiled.css" -cp $GITHUB_WORKSPACE/code_docs/m.css/css/EnviroDIY/m-EnviroDIY+documentation.compiled.css $GITHUB_WORKSPACE/code_docs/ModularSensors/docs/css - -cd $GITHUB_WORKSPACE/code_docs/ModularSensors/docs - -# echo "\n\e[32mCreating dox files from example read-me files\e[0m" -# python documentExamples.py - -echo "\n\e[32mCurrent Doxygen version...\e[0m" -$GITHUB_WORKSPACE/doxygen-src/build/bin/doxygen -v 2>&1 - -# Redirect both stderr and stdout to the log file AND the console. -echo "\n\e[32mGenerating Doxygen code documentation...\e[0m" -$GITHUB_WORKSPACE/doxygen-src/build/bin/doxygen Doxyfile 2>&1 - -echo "\n\e[32mFixing errant xml section names in examples as generated by Doxygen...\e[0m" -python fixSectionsInXml.py - -# echo "\n\e[32mFixing copied function documentation in group documentation\e[0m" -# python fixFunctionsInGroups.py - -python $GITHUB_WORKSPACE/code_docs/m.css/documentation/doxygen.py "mcss-conf.py" --no-doxygen --output "$GITHUB_WORKSPACE/code_docs/ModularSensors/docs/output_mcss.log" --templates "$GITHUB_WORKSPACE/code_docs/m.css/documentation/templates/EnviroDIY" - -echo "\n\e[32mCopying function documentation\e[0m" -python copyFunctions.py diff --git a/continuous_integration/generate_job_matrix.py b/continuous_integration/generate_job_matrix.py index 495ee97ff..b8c12ebde 100644 --- a/continuous_integration/generate_job_matrix.py +++ b/continuous_integration/generate_job_matrix.py @@ -8,35 +8,54 @@ import re import os import copy +import requests + +# %% +# set verbose +use_verbose = False +if "RUNNER_DEBUG" in os.environ.keys() and os.environ["RUNNER_DEBUG"] == "1": + use_verbose = True + # %% # Some working directories + # The workspace directory if "GITHUB_WORKSPACE" in os.environ.keys(): workspace_dir = os.environ.get("GITHUB_WORKSPACE") else: - fileDir = os.path.dirname(os.path.realpath("__file__")) - workspace_dir = os.path.join(fileDir, "../") - workspace_dir = os.path.abspath(os.path.realpath(workspace_dir)) + workspace_dir = os.getcwd() +workspace_path = os.path.abspath(os.path.realpath(workspace_dir)) +print(f"Workspace Path: {workspace_path}") # The examples directory examples_dir = "./examples/" examples_path = os.path.join(workspace_dir, examples_dir) examples_path = os.path.abspath(os.path.realpath(examples_path)) +print(f"Examples Path: {examples_path}") # The continuous integration directory ci_dir = "./continuous_integration/" ci_path = os.path.join(workspace_dir, ci_dir) ci_path = os.path.abspath(os.path.realpath(ci_path)) +print(f"Continuous Integration Path: {ci_path}") +if not os.path.exists(ci_path): + print(f"Creating the directory for CI: {ci_path}") + os.makedirs(ci_path, exist_ok=True) # A directory of files to save and upload as artifacts to use in future jobs artifact_dir = os.path.join( os.path.join(workspace_dir, "continuous_integration_artifacts") ) +artifact_path = os.path.abspath(os.path.realpath(artifact_dir)) +print(f"Artifact Path: {artifact_path}") if not os.path.exists(artifact_dir): + print(f"Creating the directory for artifacts: {artifact_path}") os.makedirs(artifact_dir) compilers = ["Arduino CLI", "PlatformIO"] + + # %% # The locations of some important files @@ -46,6 +65,18 @@ os.path.join(examples_path, menu_example_name), menu_example_name + ".ino" ) + +# %% +# Pull files to convert between boards and platforms and FQBNs +response = requests.get( + "https://raw.githubusercontent.com/EnviroDIY/workflows/main/scripts/platformio_to_arduino_boards.json" +) +with open(os.path.join(ci_path, "platformio_to_arduino_boards.json"), "wb") as f: + f.write(response.content) +# Translation between board names on PlatformIO and the Arduino CLI +with open(os.path.join(ci_path, "platformio_to_arduino_boards.json")) as f: + pio_to_acli = json.load(f) + # Find all of the non-menu examples non_menu_examples = [ f @@ -54,13 +85,30 @@ and f not in [".history", "logger_test", menu_example_name] ] -# Arduino CLI configurations +# %% +# read configurations based on existing files and environment variables + +# Arduino CLI configuration +# Always use the generic one from the shared workflow repository if "GITHUB_WORKSPACE" in os.environ.keys(): - arduino_cli_config = os.path.join(ci_dir, "arduino_cli.yaml") + arduino_cli_config = os.path.join(ci_path, "arduino_cli.yaml") + if not os.path.isfile(arduino_cli_config): + # download the default file + response = requests.get( + "https://raw.githubusercontent.com/EnviroDIY/workflows/main/scripts/arduino_cli.yaml" + ) + # copy to the CI directory + with open(os.path.join(ci_path, "arduino_cli.yaml"), "wb") as f: + f.write(response.content) + # also copy to the artifacts directory + shutil.copyfile( + os.path.join(ci_path, "arduino_cli.yaml"), + os.path.join(artifact_path, "arduino_cli.yaml"), + ) else: arduino_cli_config = os.path.join(ci_dir, "arduino_cli_local.yaml") -# PlatformIO configurations +# PlatformIO configuration pio_config_file = os.path.join(ci_path, "platformio.ini") pio_extra_config_file = os.path.join(ci_path, "platformio_extra_flags.ini") pio_config = ProjectConfig(pio_config_file) @@ -88,33 +136,39 @@ def get_example_filepath(subfolder_name): def create_arduino_cli_command(pio_env_name: str, code_subfolder: str) -> str: - arduino_command_arguments = [ + arduino_command_args = [ "arduino-cli", "compile", - # "--verbose", + ] + if use_verbose: + arduino_command_args += ["--verbose"] + arduino_command_args += [ "--warnings", "more", "--config-file", - arduino_cli_config, + f'"{arduino_cli_config}"', "--format", "text", "--fqbn", pio_to_acli[pio_config.get("env:{}".format(pio_env_name), "board")]["fqbn"], - os.path.join(examples_path, code_subfolder), + f'"{os.path.join(examples_path, code_subfolder)}"', ] - return " ".join(arduino_command_arguments) + return " ".join(arduino_command_args) def create_pio_ci_command(pio_env_file: str, pio_env: str, code_subfolder: str) -> str: pio_command_args = [ "pio", "ci", - # "--verbose", + ] + if use_verbose: + pio_command_args += ["--verbose"] + pio_command_args += [ "--project-conf", - pio_env_file, + f'"{pio_env_file}"', "--environment", pio_env, - os.path.join(examples_path, code_subfolder), + f'"{os.path.join(examples_path, code_subfolder)}"', ] return " ".join(pio_command_args) @@ -134,7 +188,7 @@ def add_log_to_command(command: str, group_title: str) -> List: ) command_list.append("echo ::endgroup::") command_list.append( - 'if [ "$result_code" -eq "0" ]; then echo -e "\e[32m{title} successfully compiled\e[0m"; else echo -e "\e[31m{title} failed to compile\e[0m"; fi'.format( + 'if [ "$result_code" -eq "0" ]; then echo -e "\\e[32m{title} successfully compiled\\e[0m"; else echo -e "\\e[31m{title} failed to compile\\e[0m"; fi'.format( title=group_title ) ) @@ -247,7 +301,7 @@ def modify_example_filename(example_subfolder, in_file_defines): preped_folder_name = "{}_{}".format(example_subfolder, suffix).replace( "_a_la_carte", "" ) - prepped_ex_folder = os.path.join(artifact_dir, preped_folder_name) + prepped_ex_folder = os.path.join(artifact_path, preped_folder_name) prepped_ex_file = os.path.join(prepped_ex_folder, preped_folder_name + ".ino") return prepped_ex_folder, prepped_ex_file @@ -296,7 +350,7 @@ def extend_pio_config(added_envs): new_config = copy.deepcopy(pio_config) new_config_path = os.path.join( - artifact_dir, "test_ci_" + "_".join(added_envs) + ".ini" + artifact_path, "test_ci_" + "_".join(added_envs) + ".ini" ) for added_env in added_envs: @@ -658,17 +712,23 @@ def extend_pio_config(added_envs): # Convert commands in the matrix into bash scripts for matrix_job in arduino_job_matrix + pio_job_matrix: bash_file_name = matrix_job["job_name"].replace(" ", "") + ".sh" - bash_out = open(os.path.join(artifact_dir, bash_file_name), "w+") + print(f"Writing bash file to {os.path.join(artifact_path, bash_file_name)}") + bash_out = open(os.path.join(artifact_path, bash_file_name), "w+") bash_out.write("#!/bin/bash\n\n") bash_out.write( - "# Makes the bash script print out every command before it is executed, except echo\n" - ) - bash_out.write( - "trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG\n\n" + """ +set -e # Exit with nonzero exit code if anything fails +if [ "$RUNNER_DEBUG" = "1" ]; then + echo "Enabling debugging!" + set -v # Prints shell input lines as they are read. + set -x # Print command traces before executing command. +fi + +""" ) bash_out.write(matrix_job["command"]) bash_out.close() - matrix_job["script"] = os.path.join(artifact_dir, bash_file_name) + matrix_job["script"] = os.path.join(artifact_path, bash_file_name) # Remove the command from the dictionaries before outputting them for items in arduino_job_matrix + pio_job_matrix: diff --git a/continuous_integration/install-deps-arduino-cli.sh b/continuous_integration/install-deps-arduino-cli.sh deleted file mode 100644 index 61ba26a4b..000000000 --- a/continuous_integration/install-deps-arduino-cli.sh +++ /dev/null @@ -1,159 +0,0 @@ -#!/bin/bash - -# Makes the bash script print out every command before it is executed, except echo -trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG - -# Exit with nonzero exit code if anything fails -set -e - -echo "\n\e[32mCurrent Arduino CLI version:\e[0m" -arduino-cli version - -echo "::group::Installing Platforms and Frameworks" -echo "\n\e[32mUpdating the core index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core update-index - -echo "\n\e[32mInstalling the Arduino AVR Core\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core install arduino:avr - -echo "\n\e[32mInstalling the EnviroDIY AVR Core\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core install EnviroDIY:avr - -echo "\n\e[32mInstalling the Arduino SAMD Core\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core install arduino:samd - -echo "\n\e[32mInstalling the Adafruit SAMD Core\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core install adafruit:samd - -echo "\n\e[32mUpdating the core index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core update-index - -echo "\n\e[32mUpgrading all cores\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core upgrade - -echo "\n\e[32mCurrently installed cores:\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml core list -echo "::endgroup::" - - -echo "::group::Installing Libraries" -echo "\n\e[32mUpdating the library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib update-index - -echo "\n\e[32mInstalling EnviroDIY DS3231 library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install EnviroDIY_DS3231 - -echo "\n\e[32mInstalling RTCZero library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install RTCZero - -echo "\n\e[32mInstalling EnableInterrupt library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install EnableInterrupt - -echo "\n\e[32mInstalling SdFat library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install SdFat - -echo "\n\e[32mInstalling TinyGSM library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install TinyGSM - -echo "\n\e[32mInstalling PubSubClient library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install PubSubClient - -echo "\n\e[32mInstalling Adafruit BusIO library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit BusIO" - -echo "\n\e[32mInstalling Adafruit Unified Sensor library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit Unified Sensor" - -echo "\n\e[32mDownloading Soligen fork of Adafruit_ADS1X15 as a zip" -# Soligen fork needs to be manually unzipped and moved because the CLI chokes on the library name not matching the h file -curl -L --retry 15 --retry-delay 0 https://github.com/soligen2010/Adafruit_ADS1X15/archive/master.zip --create-dirs -o home/arduino/downloads/Adafruit_ADS1X15.zip -echo "\e[32mDecompressing Adafruit_ADS1X15\e[0m" -unzip -q -o home/arduino/downloads/Adafruit_ADS1X15.zip -d home/arduino/downloads/ -echo "\e[32mMoving Adafruit_ADS1X15 to the libraries folder\e[0m" -mkdir -p home/arduino/user/libraries/Adafruit_ADS1X15 -mv home/arduino/downloads/Adafruit_ADS1X15-master/* home/arduino/user/libraries/Adafruit_ADS1X15 - -echo "\n\e[32mInstalling Adafruit AM2315 library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit AM2315" - -echo "\n\e[32mInstalling Adafruit BME280 Library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit BME280 Library" - -echo "\n\e[32mInstalling DHT sensor library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "DHT sensor library" - -echo "\n\e[32mInstalling Adafruit INA219 library from Arduino library index - excluding dependencies\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit INA219" --no-deps - -echo "\n\e[32mInstalling Adafruit MPL115A2 library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit MPL115A2" - -echo "\n\e[32mInstalling Adafruit SHT4x Library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "Adafruit SHT4x Library" - -echo "\n\e[32mInstalling Martin Lindupp's BMP388 Library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install "BMP388_DEV" - -echo "\n\e[32mInstalling OneWire library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install OneWire - -echo "\n\e[32mInstalling DallasTemperature library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install DallasTemperature - -echo "\n\e[32mDownloading External Interrupt version of the SDI-12 library as a zip\e[0m" -# The "external interrupt" version needs to be installed from a zip because the Arduino CLI cannot pull from a branch -curl -L --retry 15 --retry-delay 0 https://github.com/EnviroDIY/Arduino-SDI-12/archive/refs/heads/ExtInts.zip --create-dirs -o home/arduino/downloads/EnviroDIY_SDI12_ExtInts.zip -echo "\e[32mDecompressing EnviroDIY_SDI12_ExtInts\e[0m" -unzip -q -o home/arduino/downloads/EnviroDIY_SDI12_ExtInts.zip -d home/arduino/downloads/ -echo "\e[32mMoving EnviroDIY_SDI12_ExtInts to the libraries folder\e[0m" -mkdir -p home/arduino/user/libraries/EnviroDIY_SDI12_ExtInts -mv home/arduino/downloads/Arduino-SDI-12-ExtInts/* home/arduino/user/libraries/EnviroDIY_SDI12_ExtInts - -echo "\n\e[32mInstalling NorthernWidget MS5803 library from GitHub\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install --git-url https://github.com/NorthernWidget/MS5803.git - -echo "\n\e[32mInstalling EnviroDIY Tally_Library from GitHub" -# NOTE: This only works because the DEV_I2C branch is the main branch of the EnviroDIY fork -# The Arduino CLI can only install from whatever is assigned as the default branch on GitHub -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install --git-url https://github.com/EnviroDIY/Tally_Library.git - -echo "\n\e[32mInstalling EnviroDIY SensorModbusMaster library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install SensorModbusMaster - -echo "\n\e[32mInstalling EnviroDIY KellerModbus library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install KellerModbus - -echo "\n\e[32mInstalling EnviroDIY YosemitechModbus library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install YosemitechModbus - -echo "\n\e[32mInstalling EnviroDIY GropointModbus library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install GropointModbus - -echo "\n\e[32mInstalling StreamDebugger library from Arduino library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install StreamDebugger - -echo "\n\e[32mInstalling AltSoftSerial library from GitHub\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install --git-url https://github.com/PaulStoffregen/AltSoftSerial.git - -echo "\n\e[32mInstalling SoftwareWire library from GitHub\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install --git-url https://github.com/Testato/SoftwareWire.git#v1.5.1 - -echo "\n\e[32mInstalling NeoSWSerial library from GitHub\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib install --git-url https://github.com/SRGDamia1/NeoSWSerial.git - -echo "\n\e[32mDownloading SoftwareSerial with External Interrupts as a zip\e[0m" -# SoftwareSerial with External Interrupts needs to be manually unzipped and moved because the CLI chokes on the library name not matching the h file -curl -L --retry 15 --retry-delay 0 https://github.com/EnviroDIY/SoftwareSerial_ExternalInts/archive/master.zip --create-dirs -o home/arduino/downloads/SoftwareSerial_ExternalInts.zip -echo "\e[32mDecompressing SoftwareSerial_ExternalInts\e[0m" -unzip -q -o home/arduino/downloads/SoftwareSerial_ExternalInts.zip -d home/arduino/downloads/ -echo "\e[32mMoving SoftwareSerial_ExternalInts to the libraries folder\e[0m" -mkdir -p home/arduino/user/libraries/SoftwareSerial_ExternalInts -mv home/arduino/downloads/SoftwareSerial_ExtInts-master/* home/arduino/user/libraries/SoftwareSerial_ExternalInts -echo "::endgroup::" - - -echo "::group::Current globally installed packages" -echo "\n\e[32mCurrently installed libraries:\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib update-index -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib list -echo "::endgroup::" diff --git a/continuous_integration/install-deps-platformio.sh b/continuous_integration/install-deps-platformio.sh deleted file mode 100644 index 22219218e..000000000 --- a/continuous_integration/install-deps-platformio.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash - -# Makes the bash script print out every command before it is executed, except echo -trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG - -# Exit with nonzero exit code if anything fails -set -e - -echo "::group::Installing Platforms and Frameworks" -echo "\e[32mInstalling Atmel AVR platforms \e[0m" -pio pkg install -g --platform atmelavr -pio pkg install -g --tool framework-arduino-avr -pio pkg install -g --tool tool-avrdude -pio pkg install -g --tool toolchain-atmelavr - -echo "\e[32mInstalling Atmel AVR framework \e[0m" -pio pkg install -g --platform atmelmegaavr -pio pkg install -g --tool framework-arduino-megaavr - -echo "\e[32mInstalling Atmel SAM platform \e[0m" -pio pkg install -g --platform atmelsam - -echo "\e[32mInstalling Atmel SAM framework \e[0m" -pio pkg install -g --tool framework-arduino-samd -pio pkg install -g --tool framework-arduino-samd-adafruit -pio pkg install -g --tool framework-arduino-samd-sodaq -pio pkg install -g --tool framework-cmsis -pio pkg install -g --tool framework-cmsis-atmel -pio pkg install -g --tool tool-bossac -pio pkg install -g --tool toolchain-gccarmnoneeabi -echo "::endgroup::" - - -echo "::group::Installing Libraries" -echo "\e[32m\nCurrently installed packages:\e[0m" -pio pkg list -g -v - -echo "\e[32mInstalling envirodiy/EnviroDIY_DS3231\e[0m" -pio pkg install -g --library envirodiy/EnviroDIY_DS3231 - -echo "\e[32mInstalling arduino-libraries/RTCZero\e[0m" -pio pkg install -g --library arduino-libraries/RTCZero - -echo "\e[32mInstalling greygnome/EnableInterrupt\e[0m" -pio pkg install -g --library greygnome/EnableInterrupt - -echo "\e[32mInstalling greiman/SdFat\e[0m" -pio pkg install -g --library greiman/SdFat - -echo "\e[32mInstalling vshymanskyy/TinyGSM\e[0m" -pio pkg install -g --library vshymanskyy/TinyGSM - -echo "\e[32mInstalling knolleary/PubSubClient\e[0m" -pio pkg install -g --library knolleary/PubSubClient - -echo "\e[32mInstalling adafruit/'Adafruit BusIO'\e[0m" -pio pkg install -g --library adafruit/'Adafruit BusIO' - -echo "\e[32mInstalling adafruit/'Adafruit Unified Sensor'\e[0m" -pio pkg install -g --library adafruit/'Adafruit Unified Sensor' - -echo "\e[32mInstalling https://github.com/soligen2010/Adafruit_ADS1X15.git\e[0m" -pio pkg install -g --library https://github.com/soligen2010/Adafruit_ADS1X15.git - -echo "\e[32mInstalling adafruit/'Adafruit AM2315'\e[0m" -pio pkg install -g --library adafruit/'Adafruit AM2315' - -echo "\e[32mInstalling adafruit/'Adafruit BME280 Library'\e[0m" -pio pkg install -g --library adafruit/'Adafruit BME280 Library' - -echo "\e[32mInstalling adafruit/'DHT sensor library'\e[0m" -pio pkg install -g --library adafruit/'DHT sensor library' - -echo "\e[32mInstalling adafruit/'Adafruit INA219'\e[0m" -pio pkg install -g --library adafruit/'Adafruit INA219' - -echo "\e[32mInstalling adafruit/'Adafruit MPL115A2'\e[0m" -pio pkg install -g --library adafruit/'Adafruit MPL115A2' - -echo "\e[32mInstalling adafruit/'Adafruit SHT'\e[0m" -pio pkg install -g --library adafruit/'Adafruit SHT4x Library' - -echo "\e[32mInstalling Martin Lindupp's BMP388 Library\e[0m" -pio pkg install -g --library MartinL1/BMP388_DEV - -echo "\e[32mInstalling paulstoffregen/OneWire\e[0m" -pio pkg install -g --library paulstoffregen/OneWire - -echo "\e[32mInstalling milesburton/DallasTemperature\e[0m" -pio pkg install -g --library milesburton/DallasTemperature - -echo "\e[32mInstalling envirodiy/SDI-12\e[0m" -pio pkg install -g --library envirodiy/SDI-12 - -echo "\e[32mInstalling northernwidget/MS5803\e[0m" -pio pkg install -g --library northernwidget/MS5803 - -echo "\e[32mInstalling https://github.com/EnviroDIY/Tally_Library.git#Dev_I2C\e[0m" -pio pkg install -g --library https://github.com/EnviroDIY/Tally_Library.git#Dev_I2C - -echo "\e[32mInstalling envirodiy/SensorModbusMaster\e[0m" -pio pkg install -g --library envirodiy/SensorModbusMaster - -echo "\e[32mInstalling envirodiy/KellerModbus\e[0m" -pio pkg install -g --library envirodiy/KellerModbus - -echo "\e[32mInstalling envirodiy/YosemitechModbus\e[0m" -pio pkg install -g --library envirodiy/YosemitechModbus - -echo "\e[32mInstalling envirodiy/GroPointModbus\e[0m" -pio pkg install -g --library envirodiy/GroPointModbus - -echo "\e[32mInstalling vshymanskyy/StreamDebugger\e[0m" -pio pkg install -g --library vshymanskyy/StreamDebugger - -echo "\e[32mInstalling https://github.com/PaulStoffregen/AltSoftSerial.git\e[0m" -pio pkg install -g --library https://github.com/PaulStoffregen/AltSoftSerial.git - -echo "\e[32mInstalling https://github.com/Testato/SoftwareWire.git#v1.5.1\e[0m" -pio pkg install -g --library https://github.com/Testato/SoftwareWire.git#v1.5.1 - -echo "\e[32mInstalling https://github.com/SRGDamia1/NeoSWSerial.git\e[0m" -pio pkg install -g --library https://github.com/SRGDamia1/NeoSWSerial.git - -echo "\e[32mInstalling https://github.com/EnviroDIY/SoftwareSerial_ExternalInts.git\e[0m" -pio pkg install -g --library https://github.com/EnviroDIY/SoftwareSerial_ExternalInts.git -echo "::endgroup::" - - -echo "::group::Current globally installed packages" -echo "\e[32m\nCurrently installed packages:\e[0m" -pio pkg list -g -v -echo "::endgroup::" diff --git a/continuous_integration/install-test-version-arduino-cli.sh b/continuous_integration/install-test-version-arduino-cli.sh deleted file mode 100644 index 74ac0f883..000000000 --- a/continuous_integration/install-test-version-arduino-cli.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -# Makes the bash script print out every command before it is executed, except echo -trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG - -# Exit with nonzero exit code if anything fails -set -e - -echo "\n\e[32mCurrent Arduino CLI version:\e[0m" -arduino-cli version - -echo "\n\e[32mDeleting any archived zips\e[0m" -rm -f home/arduino/downloads/ModularSensors.zip - -echo "\n\e[32mDownloading library zip from ${LIBRARY_INSTALL_ZIP}\e[0m" -curl -L --retry 15 --retry-delay 0 ${LIBRARY_INSTALL_ZIP} --create-dirs -o home/arduino/downloads/ModularSensors.zip - -echo "\n\e[32mUnzipping the library\e[0m" -unzip -o home/arduino/downloads/ModularSensors.zip -d home/arduino/downloads/ -x "*.git/*" "continuous_integration/*" "docs/*" "examples/*" - -echo "\n\e[32mEnsuring no old directories exist\e[0m" -rm -r -f home/arduino/user/libraries/ModularSensors - -echo "\n\e[32mCreating a new directory for the testing version of Modular sensors\e[0m" -mkdir -p home/arduino/user/libraries/ModularSensors - -echo "\n\e[32mMoving the unzipped library to the new directory\e[0m" -if [ -z "${GITHUB_HEAD_REF}" ]; then - echo "\n\e[36mExpected unzipped directory name (from commit SHA): home/arduino/downloads/ModularSensors-${GITHUB_SHA}\e[0m" - mv home/arduino/downloads/ModularSensors-${GITHUB_SHA}/* home/arduino/user/libraries/ModularSensors -else - INTERNAL_ZIP_NAME=$(echo "${GITHUB_HEAD_REF}" | sed -e 's/\//-/g') - echo "\n\e[36mExpected unzipped directory name (from head of ${GITHUB_HEAD_REF}): home/arduino/downloads/ModularSensors-${SAVED_ZIP_NAME}\e[0m" - mv home/arduino/downloads/ModularSensors-${INTERNAL_ZIP_NAME}/* home/arduino/user/libraries/ModularSensors -fi - -echo "\n\e[32mUpdating the library index\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib update-index - -echo "\n\e[32mListing libraries detected by the Arduino CLI\e[0m" -arduino-cli --config-file continuous_integration/arduino_cli.yaml lib list - -echo "\n\e[32mListing the contents of the Arduino library directory\e[0m" -ls home/arduino/user/libraries diff --git a/docs/Doxyfile b/docs/Doxyfile index 840f599d3..f6ceb512d 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -1,7 +1,7 @@ -# Doxyfile 1.9.6 +# Doxyfile 1.12.0 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. +# Doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. @@ -15,10 +15,10 @@ # # Note: # -# Use doxygen to compare the used configuration file with the template +# Use Doxygen to compare the used configuration file with the template # configuration file: # doxygen -x [configFile] -# Use doxygen to compare the used configuration file with the template +# Use Doxygen to compare the used configuration file with the template # configuration file without replacing the environment variables or CMake type # replacement variables: # doxygen -x_noenv [configFile] @@ -63,17 +63,23 @@ PROJECT_BRIEF = "An Arduino library to give environmental sensors a com PROJECT_LOGO = ModularSensors_ubuntu_264x55.png +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If +# entered, it will be relative to the location where Doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = ../../ModularSensorsDoxygen -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format # and will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where +# option can be useful when feeding Doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to # control the number of sub-directories. @@ -92,7 +98,7 @@ CREATE_SUBDIRS = NO CREATE_SUBDIRS_LEVEL = 8 -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. @@ -101,7 +107,7 @@ CREATE_SUBDIRS_LEVEL = 8 ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this +# documentation generated by Doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, # Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English @@ -115,14 +121,14 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -153,13 +159,13 @@ ABBREVIATE_BRIEF = "The $name class" \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief +# Doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. @@ -167,7 +173,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -177,11 +183,11 @@ FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to +# If left blank the directory from which Doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. +# will be relative from the directory where Doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = .. @@ -195,14 +201,14 @@ STRIP_FROM_PATH = .. STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief @@ -211,17 +217,17 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO -# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be -# interpreted by doxygen. +# interpreted by Doxygen. # The default value is: NO. JAVADOC_BANNER = NO -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) @@ -229,7 +235,7 @@ JAVADOC_BANNER = NO QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this @@ -241,10 +247,10 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO -# By default Python docstrings are displayed as preformatted text and doxygen's +# By default Python docstrings are displayed as preformatted text and Doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the -# doxygen's special commands can be used and the contents of the docstring -# documentation blocks is shown as doxygen documentation. +# Doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as Doxygen documentation. # The default value is: YES. PYTHON_DOCSTRING = YES @@ -255,7 +261,7 @@ PYTHON_DOCSTRING = YES INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. @@ -342,30 +348,30 @@ OPTIMIZE_OUTPUT_SLICE = NO # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, # VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make doxygen treat .inc files +# default for Fortran type files). For instance to make Doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. When specifying no_extension you should add +# the files are not read by Doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = ino=C++ -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# The output of markdown processing is further processed by Doxygen, so you can +# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. @@ -375,12 +381,23 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. +# Minimum value: 0, maximum value: 99, default value: 6. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 10 -# When enabled doxygen tries to link words that correspond to documented +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = GITHUB + +# When enabled Doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. @@ -390,10 +407,10 @@ AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and +# tag to YES in order to let Doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. +# versus func(std::string) {}). This also makes the inheritance and +# collaboration diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO @@ -405,16 +422,16 @@ 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 -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. +# https://www.riverbankcomputing.com/software) 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. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. +# Doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. @@ -423,7 +440,7 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first +# tag is set to YES then Doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. @@ -481,18 +498,18 @@ TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The +# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# Doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest +# symbols. At the end of a run Doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use -# during processing. When set to 0 doxygen will based this on the number of +# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use +# during processing. When set to 0 Doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple @@ -504,11 +521,19 @@ LOOKUP_CACHE_SIZE = 0 NUM_PROC_THREADS = 1 +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = YES + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -574,7 +599,7 @@ EXTRACT_ANON_NSPACES = NO RESOLVE_UNNAMED_PARAMS = YES -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. @@ -582,7 +607,7 @@ RESOLVE_UNNAMED_PARAMS = YES HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # will also hide undocumented C++ concepts if enabled. This option has no effect @@ -591,14 +616,14 @@ HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -612,7 +637,7 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly @@ -621,7 +646,7 @@ INTERNAL_DOCS = NO # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and MacOS, users should typically set this option +# Windows (including Cygwin) and macOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. # Possible values are: SYSTEM, NO and YES. @@ -629,14 +654,14 @@ INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. @@ -649,7 +674,7 @@ HIDE_COMPOUND_REFERENCE= NO SHOW_HEADERFILE = YES -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -662,7 +687,7 @@ SHOW_INCLUDE_FILES = YES SHOW_GROUPED_MEMB_INC = YES -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. @@ -674,14 +699,14 @@ FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = NO -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. @@ -689,7 +714,7 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. @@ -701,7 +726,7 @@ SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. @@ -718,11 +743,11 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = YES -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. @@ -792,25 +817,25 @@ SHOW_FILES = YES SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from +# Doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file +# by Doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated +# by Doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can +# that represents Doxygen's defaults, run Doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. See also section "Changing the # layout of pages" for information. # -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# Note that if you run Doxygen from a directory containing a file called +# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = DoxygenLayout.xml @@ -825,19 +850,35 @@ LAYOUT_FILE = DoxygenLayout.xml CITE_BIB_FILES = +# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH +# environment variable) so that external tools such as latex and gs can be +# found. +# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the +# path already specified by the PATH variable, and are added in the order +# specified. +# Note: This option is particularly useful for macOS version 14 (Sonoma) and +# higher, when running Doxygen from Doxywizard, because in this case any user- +# defined changes to the PATH are ignored. A typical example on macOS is to set +# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin +# together with the standard path, the full search path used by doxygen when +# launching external tools will then become +# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + +EXTERNAL_TOOL_PATH = + #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the +# standard output by Doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -845,14 +886,14 @@ QUIET = NO WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for # potential errors in the documentation, such as documenting some parameters in # a documented function twice, or documenting parameters that don't exist or # using markup commands wrongly. @@ -860,8 +901,8 @@ WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES -# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete -# function parameter documentation. If set to NO, doxygen will accept that some +# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete +# function parameter documentation. If set to NO, Doxygen will accept that some # parameters have no documentation without warning. # The default value is: YES. @@ -869,7 +910,7 @@ WARN_IF_INCOMPLETE_DOC = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong parameter +# value. If set to NO, Doxygen will only warn about wrong parameter # documentation, but not about the absence of documentation. If EXTRACT_ALL is # set to YES then this flag will automatically be disabled. See also # WARN_IF_INCOMPLETE_DOC @@ -877,24 +918,31 @@ WARN_IF_INCOMPLETE_DOC = YES WARN_NO_PARAMDOC = YES -# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about -# undocumented enumeration values. If set to NO, doxygen will accept +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about +# undocumented enumeration values. If set to NO, Doxygen will accept # undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: NO. WARN_IF_UNDOC_ENUM_VAL = YES -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the Doxygen process Doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = FAIL_ON_WARNINGS -# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# The WARN_FORMAT tag determines the format of the warning messages that Doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will @@ -907,7 +955,7 @@ WARN_FORMAT = "$file:$line: $text" # In the $text part of the WARN_FORMAT command it is possible that a reference # to a more specific place is given. To make it easier to jump to this place -# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# (outside of Doxygen) the user can define a custom "cut" / "paste" string. # Example: # WARN_LINE_FORMAT = "'vi $file +$line'" # See also: WARN_FORMAT @@ -937,7 +985,7 @@ WARN_LOGFILE = output_doxygen.log INPUT = .. # 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 +# 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 possible encodings. @@ -947,12 +995,12 @@ INPUT = .. INPUT_ENCODING = UTF-8 # This tag can be used to specify the character encoding of the source files -# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# that Doxygen parses The INPUT_FILE_ENCODING tag can be used to specify # character encoding on a per file pattern basis. Doxygen will compare the file # name with each pattern and apply the encoding instead of the default # INPUT_ENCODING) if there is a match. The character encodings are a list of the -# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding -# "INPUT_ENCODING" for further information on supported encodings. +# form: pattern=encoding (like *.php=ISO-8859-1). +# See also: INPUT_ENCODING for further information on supported encodings. INPUT_FILE_ENCODING = @@ -962,17 +1010,17 @@ INPUT_FILE_ENCODING = # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. +# read by Doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, -# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C -# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, -# *.vhdl, *.ucf, *.qsf and *.ice. +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, +# *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to +# be provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -1004,7 +1052,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # -# Note that relative paths are relative to the directory from which doxygen is +# Note that relative paths are relative to the directory from which Doxygen is # run. EXCLUDE = ../src/ReadMe.md \ @@ -1034,9 +1082,6 @@ EXCLUDE_PATTERNS = # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # ANamespace::AClass, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = @@ -1073,7 +1118,7 @@ EXAMPLE_RECURSIVE = YES IMAGE_PATH = -# The INPUT_FILTER tag can be used to specify a program that doxygen should +# The INPUT_FILTER tag can be used to specify a program that Doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # @@ -1088,14 +1133,14 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # -# Note that doxygen will use the data processed and written to standard output +# Note that Doxygen will use the data processed and written to standard output # for further processing, therefore nothing else, like debug statements or used # commands (so in case of a Windows batch file always use @echo OFF), should be # written to standard output. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. +# properly processed by Doxygen. INPUT_FILTER = @@ -1108,7 +1153,7 @@ INPUT_FILTER = # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. +# properly processed by Doxygen. FILTER_PATTERNS = "*.md=python markdown_prefilter.py" @@ -1130,7 +1175,7 @@ FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. +# and want to reuse the introduction page also for the Doxygen output. USE_MDFILE_AS_MAINPAGE = README.md @@ -1157,12 +1202,13 @@ FORTRAN_COMMENT_AFTER = 72 SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. +# multi-line macros, enums or list initialized variables directly into the +# documentation. # The default value is: NO. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. @@ -1200,7 +1246,7 @@ REFERENCES_LINK_SOURCE = YES 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 +# 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 # 4.8.6 or higher. @@ -1214,14 +1260,14 @@ SOURCE_TOOLTIPS = YES # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # -# The result: instead of the source browser generated by doxygen, the links to +# The result: instead of the source browser generated by Doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. @@ -1229,19 +1275,19 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# If the CLANG_ASSISTED_PARSING tag is set to YES then Doxygen will use the # clang parser (see: # http://clang.llvm.org/) for more accurate parsing at the cost of reduced # performance. This can be particularly helpful with template rich C++ code for -# which doxygen's built-in parser lacks the necessary type information. -# Note: The availability of this option depends on whether or not doxygen was +# which Doxygen's built-in parser lacks the necessary type information. +# 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: NO. CLANG_ASSISTED_PARSING = NO # If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS -# tag is set to YES then doxygen will add the directory of each input to the +# tag is set to YES then Doxygen will add the directory of each input to the # include path. # The default value is: YES. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. @@ -1250,7 +1296,7 @@ CLANG_ADD_INC_PATHS = YES # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories +# the include paths will already be set by Doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. @@ -1264,7 +1310,7 @@ CLANG_OPTIONS = # specifying the -p option to a clang tool, such as clang-check. These options # will then be passed to the parser. Any options specified with CLANG_OPTIONS # will be added as well. -# Note: The availability of this option depends on whether or not doxygen was +# Note: The availability of this option depends on whether or not Doxygen was # generated with the -Duse_libclang=ON option for CMake. CLANG_DATABASE_PATH = @@ -1293,7 +1339,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = NO @@ -1314,40 +1360,40 @@ HTML_OUTPUT = html HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a +# each generated HTML page. If the tag is left blank Doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. +# that Doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally +# for information on how to generate the default header that Doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description +# default header when upgrading to a newer version of Doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard +# generated HTML page. If the tag is left blank Doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. +# that Doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. +# the HTML output. If left blank Doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. +# sheet that Doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. @@ -1357,7 +1403,7 @@ HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. +# created by Doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. @@ -1385,11 +1431,11 @@ HTML_EXTRA_FILES = # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. -# Possible values are: LIGHT always generate light mode output, DARK always -# generate dark mode output, AUTO_LIGHT automatically set the mode according to -# the user preference, use light mode if no preference is set (the default), -# AUTO_DARK automatically set the mode according to the user preference, use -# dark mode if no preference is set and TOGGLE allow to user to switch between +# Possible values are: LIGHT always generates light mode output, DARK always +# generates dark mode output, AUTO_LIGHT automatically sets the mode according +# to the user preference, uses light mode if no preference is set (the default), +# AUTO_DARK automatically sets the mode according to the user preference, uses +# dark mode if no preference is set and TOGGLE allows a user to switch between # light and dark mode via a button. # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1426,15 +1472,6 @@ HTML_COLORSTYLE_SAT = 83 HTML_COLORSTYLE_GAMMA = 88 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = YES - # 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 @@ -1454,6 +1491,33 @@ HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = YES +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1471,7 +1535,7 @@ HTML_INDEX_NUM_ENTRIES = 500 # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, doxygen will generate a Makefile in the HTML +# 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 @@ -1519,7 +1583,7 @@ DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # on Windows. In the beginning of 2021 Microsoft took the original page, with @@ -1530,7 +1594,7 @@ DOCSET_PUBLISHER_NAME = Publisher # ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for @@ -1550,7 +1614,7 @@ CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. +# Doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1584,6 +1648,16 @@ BINARY_TOC = NO TOC_EXPAND = NO +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1642,7 +1716,7 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1687,7 +1761,7 @@ DISABLE_INDEX = NO # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine tune the look of the index (see "Fine-tuning the output"). As an -# example, the default style sheet generated by doxygen has an example that +# example, the default style sheet generated by Doxygen has an example that # shows how to put an image at the root of the tree instead of the PROJECT_NAME. # Since the tree basically has the same information as the tab index, you could # consider setting DISABLE_INDEX to YES when enabling this option. @@ -1709,7 +1783,7 @@ GENERATE_TREEVIEW = YES FULL_SIDEBAR = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. +# Doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. @@ -1718,6 +1792,12 @@ FULL_SIDEBAR = NO ENUM_VALUES_PER_LINE = 4 +# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified +# enumeration values besides the enumeration mnemonics. +# The default value is: NO. + +SHOW_ENUM_VALUES = YES + # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. @@ -1725,21 +1805,21 @@ ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 200 -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO -# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email # addresses. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. OBFUSCATE_EMAILS = YES -# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. @@ -1752,7 +1832,7 @@ HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML +# Doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1796,7 +1876,7 @@ MATHJAX_VERSION = MathJax_2 # Possible values are: HTML-CSS (which is slower, but has the best # compatibility. This is the name for Mathjax version 2, for MathJax version 3 # this will be translated into chtml), NativeMML (i.e. MathML. Only supported -# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This # is the name for Mathjax version 3, for MathJax version 2 this will be # translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. @@ -1830,7 +1910,7 @@ MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 MATHJAX_EXTENSIONS = -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an @@ -1839,12 +1919,12 @@ MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and +# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for +# the HTML output. The underlying search engine uses JavaScript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then +# For large projects the JavaScript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically @@ -1863,7 +1943,7 @@ SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, doxygen will generate a PHP script for searching and +# setting. When disabled, Doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing # and searching needs to be provided by external tools. See the section # "External Indexing and Searching" for details. @@ -1872,7 +1952,7 @@ SEARCHENGINE = YES SERVER_BASED_SEARCH = NO -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# When EXTERNAL_SEARCH tag is enabled Doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain the @@ -1917,7 +1997,7 @@ SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through Doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of @@ -1931,7 +2011,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, Doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1976,7 +2056,7 @@ MAKEINDEX_CMD_NAME = makeindex LATEX_MAKEINDEX_CMD = makeindex -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# If the COMPACT_LATEX tag is set to YES, Doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -2007,15 +2087,15 @@ EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for # the generated LaTeX document. The header should contain everything until the -# first chapter. If it is left blank doxygen will generate a standard header. It +# first chapter. If it is left blank Doxygen will generate a standard header. It # is highly recommended to start with a default header using # doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty # and then modify the file new_header.tex. See also section "Doxygen usage" for -# information on how to generate the default header that doxygen normally uses. +# information on how to generate the default header that Doxygen normally uses. # # Note: Only use a user-defined header if you know what you are doing! # Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. The following +# default header when upgrading to a newer version of Doxygen. The following # commands have a special meaning inside the header (and footer): For a # description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2024,10 +2104,10 @@ LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for # the generated LaTeX document. The footer should contain everything after the -# last chapter. If it is left blank doxygen will generate a standard footer. See +# last chapter. If it is left blank Doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what # special commands can be used inside the footer. See also section "Doxygen -# usage" for information on how to generate the default footer that doxygen +# usage" for information on how to generate the default footer that Doxygen # normally uses. Note: Only use a user-defined footer if you know what you are # doing! # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2036,7 +2116,7 @@ LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created -# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# by Doxygen. Using this option one can overrule certain style aspects. Doxygen # will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the @@ -2062,7 +2142,7 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# If the USE_PDFLATEX tag is set to YES, Doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX # files. Set this option to YES, to get a higher quality PDF documentation. # @@ -2072,15 +2152,22 @@ PDF_HYPERLINKS = YES USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BATCHMODE = NO -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# If the LATEX_HIDE_INDICES tag is set to YES then Doxygen will not include the # index chapters (such as File Index, Compound Index, etc.) in the output. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2095,14 +2182,6 @@ LATEX_HIDE_INDICES = NO LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_TIMESTAMP = NO - # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, # it will be relative to the LATEX_OUTPUT directory. If left blank the @@ -2115,7 +2194,7 @@ LATEX_EMOJI_DIRECTORY = # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, Doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -2130,7 +2209,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, Doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -2150,28 +2229,36 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load stylesheet definitions from file. Syntax is similar to Doxygen's # configuration file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the -# default style sheet that doxygen normally uses. +# default style sheet that Doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's configuration file. A template extensions file can be +# similar to Doxygen's configuration file. A template extensions file can be # generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = +# The RTF_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the RTF_OUTPUT output directory. +# Note that the files will be copied as-is; there are no commands or markers +# available. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_EXTRA_FILES = + #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, Doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -2202,7 +2289,7 @@ MAN_EXTENSION = .3 MAN_SUBDIR = -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, then it # will generate one additional man file for each entity documented in the real # man page(s). These additional files only source the real man page, but without # them the man command would be unable to find the correct page. @@ -2215,7 +2302,7 @@ MAN_LINKS = NO # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, Doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -2229,7 +2316,7 @@ GENERATE_XML = YES XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, Doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -2238,7 +2325,7 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = NO -# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, Doxygen will include # namespace members in file scope as well, matching the HTML output. # The default value is: NO. # This tag requires that the tag GENERATE_XML is set to YES. @@ -2249,7 +2336,7 @@ XML_NS_MEMB_FILE_SCOPE = YES # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, Doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -2267,19 +2354,45 @@ DOCBOOK_OUTPUT = docbook # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# If the GENERATE_AUTOGEN_DEF tag is set to YES, Doxygen will generate an +# AutoGen Definitions (see https://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. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + +# If the GENERATE_SQLITE3 tag is set to YES Doxygen will generate a Sqlite3 +# database with symbols found by Doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each Doxygen run. If set to NO, Doxygen +# will warn if a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, Doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -2287,7 +2400,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, Doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -2317,13 +2430,13 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, Doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# If the MACRO_EXPANSION tag is set to YES, Doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. @@ -2434,7 +2547,7 @@ EXPAND_AS_DEFINED = MS_MODEM_EXTRA_SETUP \ MS_PRINT_DEBUG_TIMER \ MAKE_VARIABLE_CLASS -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# If the SKIP_FUNCTION_MACROS tag is set to YES then Doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have # an all uppercase name, and do not end with a semicolon. Such function macros # are typically used for boiler-plate code, and will confuse the parser if not @@ -2458,26 +2571,26 @@ SKIP_FUNCTION_MACROS = YES # section "Linking to external documentation" for more information about the use # of tag files. # Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which doxygen is +# the path). If a tag file is not located in the directory in which Doxygen is # run, you must also specify the path to the tagfile here. TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# When a file name is specified after GENERATE_TAGFILE, Doxygen will create a # 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 = -# 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 -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be +# in the topic index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2491,33 +2604,26 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to diagram generator tools #--------------------------------------------------------------------------- -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. HIDE_UNDOC_RELATIONS = NO -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# If you set the HAVE_DOT tag to YES then Doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. HAVE_DOT = YES -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed -# to run in parallel. When set to 0 doxygen will base this on the number of +# The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed +# to run in parallel. When set to 0 Doxygen will base this on the number of # processors available in the system. You can set it explicitly to a value # larger than 0 to get control over the balance between CPU load and processing # speed. @@ -2528,7 +2634,7 @@ DOT_NUM_THREADS = 0 # DOT_COMMON_ATTR is common attributes for nodes, edges and labels of # subgraphs. When you want a differently looking font in the dot files that -# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# Doxygen generates you can specify fontname, fontcolor and fontsize attributes. # For details please see Node, # Edge and Graph Attributes specification You need to make sure dot is able # to find the font, which can be done by putting it in a standard location or by @@ -2562,35 +2668,47 @@ DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a -# graph for each documented class showing the direct and indirect inheritance -# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, -# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set -# to TEXT the direct and indirect inheritance relations will be shown as texts / -# links. -# Possible values are: NO, YES, TEXT and GRAPH. +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then Doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. Explicit enabling an inheritance +# graph or choosing a different representation for an inheritance graph of a +# specific class, can be accomplished by means of the command \inheritancegraph. +# Disabling an inheritance graph can be accomplished by means of the command +# \hideinheritancegraph. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. See also the chapter Grouping -# in the manual. +# If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2611,10 +2729,10 @@ UML_LOOK = NO UML_LIMIT_NUM_FIELDS = 10 -# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# If the DOT_UML_DETAILS tag is set to NO, Doxygen will show attributes and # methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS -# tag is set to YES, doxygen will add type and arguments for attributes and -# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# tag is set to YES, Doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, Doxygen # will not generate fields with class member information in the UML graphs. The # class diagrams will look similar to the default class diagrams but using UML # notation for the relationships. @@ -2626,8 +2744,8 @@ DOT_UML_DETAILS = NO # The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters # to display on a single line. If the actual line length exceeds this threshold -# significantly it will wrapped across multiple lines. Some heuristics are apply -# to avoid ugly line breaks. +# significantly it will be wrapped across multiple lines. Some heuristics are +# applied to avoid ugly line breaks. # Minimum value: 0, maximum value: 1000, default value: 17. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2642,24 +2760,29 @@ DOT_WRAP_THRESHOLD = 17 TEMPLATE_RELATIONS = YES # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then doxygen will generate a graph for each documented file showing the +# YES then Doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then doxygen will generate a graph for each documented file showing +# set to YES then Doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# If the CALL_GRAPH tag is set to YES then Doxygen will generate a call # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2671,7 +2794,7 @@ INCLUDED_BY_GRAPH = YES CALL_GRAPH = YES -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2683,17 +2806,20 @@ CALL_GRAPH = YES CALLER_GRAPH = YES -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2709,7 +2835,7 @@ DIR_GRAPH_MAX_DEPTH = 5 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). +# https://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). @@ -2746,11 +2872,12 @@ DOT_PATH = DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). +# You can include diagrams made with dia in Doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. -MSCFILE_DIRS = +DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2758,7 +2885,7 @@ MSCFILE_DIRS = DIAFILE_DIRS = -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# When using PlantUML, the PLANTUML_JAR_PATH tag should be used to specify the # path where java can find the plantuml.jar file or to the filename of jar file # to be used. If left blank, it is assumed PlantUML is not used or called during # a preprocessing step. Doxygen will generate a warning when it encounters a @@ -2766,20 +2893,20 @@ DIAFILE_DIRS = PLANTUML_JAR_PATH = -# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a -# configuration file for plantuml. +# When using PlantUML, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for PlantUML. PLANTUML_CFG_FILE = -# When using plantuml, the specified paths are searched for files specified by -# the !include statement in a plantuml block. +# When using PlantUML, the specified paths are searched for files specified by +# the !include statement in a PlantUML block. PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that doxygen if the number of direct +# larger than this value, Doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that if the number of direct # children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that # the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. @@ -2809,17 +2936,17 @@ MAX_DOT_GRAPH_DEPTH = 0 DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# If the GENERATE_LEGEND tag is set to YES Doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. -# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# Note: This tag requires that UML_LOOK isn't set, i.e. the Doxygen internal # graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# If the DOT_CLEANUP tag is set to YES, Doxygen will remove the intermediate # files that are used to generate the various graphs. # # Note: This setting is not only used for dot files but also for msc temporary @@ -2827,3 +2954,19 @@ GENERATE_LEGEND = YES # The default value is: YES. DOT_CLEANUP = YES + +# You can define message sequence charts within Doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then Doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, Doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/examples/example_dependencies.json b/examples/example_dependencies.json new file mode 100644 index 000000000..787d94b4d --- /dev/null +++ b/examples/example_dependencies.json @@ -0,0 +1,26 @@ +{ + "action_cache_version": 1, + "dependencies": [ + { + "name": "StreamDebugger", + "owner": "vshymanskyy", + "version": "~1.0.1" + }, + { + "name": "NeoSWSerial", + "version": "https://github.com/SRGDamia1/NeoSWSerial.git" + }, + { + "name": "AltSoftSerial", + "version": "https://github.com/PaulStoffregen/AltSoftSerial.git" + }, + { + "name": "SoftwareWire", + "version": "https://github.com/Testato/SoftwareWire.git#v1.5.1" + }, + { + "name": "SoftwareSerial_ExternalInts", + "version": "https://github.com/EnviroDIY/SoftwareSerial_ExternalInts.git" + } + ] +} From 5b6ab8411a422db37fea0c8f6b4e243c8e463549 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 9 Aug 2024 11:11:17 -0400 Subject: [PATCH 05/24] Use build examples workflow Signed-off-by: Sara Damiano --- .github/workflows/build_examples.yaml | 237 +------------------------- continuous_integration/platformio.ini | 12 +- src/sensors/GroPointGPLP8.h | 4 +- 3 files changed, 15 insertions(+), 238 deletions(-) diff --git a/.github/workflows/build_examples.yaml b/.github/workflows/build_examples.yaml index bfdc620ee..ec772ba06 100644 --- a/.github/workflows/build_examples.yaml +++ b/.github/workflows/build_examples.yaml @@ -8,233 +8,10 @@ concurrency: cancel-in-progress: true jobs: - generate_matrix: - name: Generate build matrices - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'ci skip')" - outputs: - arduino_job_matrix: ${{ steps.py_matrix.outputs.arduino_job_matrix }} - pio_job_matrix: ${{ steps.py_matrix.outputs.pio_job_matrix }} - - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - cache: 'pip' - - - name: Install python dependencies, including PlatformIO - run: pip install -r continuous_integration/requirements.txt - - - name: Generate Matrices - id: py_matrix - run: | - python continuous_integration/generate_job_matrix.py - - - name: Store generated examples - uses: actions/upload-artifact@v4 - with: - name: generated_examples - path: | - continuous_integration_artifacts/ - - print_job_matrix: - name: print_job_matrix - runs-on: ubuntu-latest - needs: generate_matrix - steps: - - name: Check the generated matrix output - run: | - echo "Arduino job matrix:" - echo "${{ needs.generate_matrix.outputs.arduino_job_matrix }}" - echo - echo "PlatformIO job matrix" - echo "${{ needs.generate_matrix.outputs.pio_job_matrix }}" - - determine_library_source: - name: determine_library_source - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, 'ci skip')" - outputs: - library_install_zip: ${{ steps.store_vars.outputs.library_install_zip }} - library_install_git: ${{ steps.store_vars.outputs.library_install_git }} - - steps: - - uses: actions/checkout@v4 - - - name: Set environment variables for pushes to any branch in EnviroDIY/ModularSensors - if: github.event_name == 'push' - run: | - echo "Push to commit ${GITHUB_SHA}" - echo "LIBRARY_INSTALL_ZIP=https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.zip" >> $GITHUB_ENV - echo "LIBRARY_INSTALL_GIT=https://github.com/${GITHUB_REPOSITORY}.git#${GITHUB_SHA}" >> $GITHUB_ENV - - - name: Set environment variable for PR's from any branch in EnviroDIY/ModularSensors - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.name == github.repository - run: | - echo "Pull Request from the ${GITHUB_HEAD_REF} branch" - echo "LIBRARY_INSTALL_ZIP=https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_HEAD_REF}.zip" >> $GITHUB_ENV - echo "LIBRARY_INSTALL_GIT=https://github.com/${GITHUB_REPOSITORY}.git#${GITHUB_HEAD_REF}" >> $GITHUB_ENV - - - name: Set environment variable for PR's from any branch in EnviroDIY/ModularSensors - if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.name != github.repository - run: | - echo "Pull Request from the fork ${{ github.event.pull_request.head.repo.full_name }} at ${{ github.event.pull_request.head.ref }}" - echo "LIBRARY_INSTALL_ZIP=https://github.com/${{ github.event.pull_request.head.repo.full_name }}/archive/${{ github.event.pull_request.head.ref }}.zip" >> $GITHUB_ENV - echo "LIBRARY_INSTALL_GIT=https://github.com/${{ github.event.pull_request.head.repo.full_name }}.git#${{ github.event.pull_request.head.ref }}" >> $GITHUB_ENV - - - name: store enviroment variables as output - id: store_vars - run: | - echo "library_install_zip=${{ env.LIBRARY_INSTALL_ZIP }}" >> $GITHUB_OUTPUT - echo "library_install_git=${{ env.LIBRARY_INSTALL_GIT }}" >> $GITHUB_OUTPUT - - print_library_source: - name: print_library_source - runs-on: ubuntu-latest - needs: determine_library_source - steps: - - name: Check the library installation source - run: | - echo "Link to zip for Arduino CLI testing install:" - echo "${{ needs.determine_library_source.outputs.library_install_zip }}" - echo - echo "Git reference for PlatformIO testing install" - echo "${{ needs.determine_library_source.outputs.library_install_git }}" - - build_ex_arduino: - name: ${{ matrix.job_info.job_name }} - runs-on: ubuntu-latest - needs: [generate_matrix, determine_library_source] - env: - LIBRARY_INSTALL_ZIP: ${{ needs.determine_library_source.outputs.library_install_zip }} - strategy: - matrix: - job_info: ${{ fromJSON(needs.generate_matrix.outputs.arduino_job_matrix) }} - - steps: - - uses: actions/checkout@v4 - - - name: Unused Step - run: echo "This is needed to make the step number match with the PlatformIO jobs. =)" - - # We use the `arduino/setup-arduino-cli` action to install and - # configure the Arduino CLI on the system. - - name: Setup Arduino CLI - uses: arduino/setup-arduino-cli@v1.1.2 - - - name: Restore Arduino platforms and libraries - uses: actions/cache@v4 - id: cache_libraries - with: - path: | - home/arduino - # if nothing in the dependencies.json file has changed, then it will - # be a "cache hit" and we can restore libraries from cache and not - # download them. If it has changed we have to re-download. - key: ${{ hashFiles('./continuous_integration/dependencies.json','continuous_integration/install-deps-arduino-cli.sh') }} - - # Install cores and library dependencies for the Arduino CLI, iff no cache - - name: Install the Arduino libraries - if: steps.cache_libraries.outputs.cache-hit != 'true' - run: | - chmod +x continuous_integration/install-deps-arduino-cli.sh - sh continuous_integration/install-deps-arduino-cli.sh - - # Install ModularSensors for the Arduino CLI - - name: Install the testing version of Modular Sensors for the Arduino CLI - run: | - chmod +x continuous_integration/install-test-version-arduino-cli.sh - sh continuous_integration/install-test-version-arduino-cli.sh - - - name: Download the prepared examples - uses: actions/download-artifact@v4 - with: - name: generated_examples - path: | - continuous_integration_artifacts/ - - - name: Include problem matcher - uses: ammaraskar/gcc-problem-matcher@master - - # Run the script to compile the examples - - name: Compile - env: - ACTION_RUN_ID: ${{ github.run_id }} - run: | - chmod +x ${{ matrix.job_info.script }} - bash ${{ matrix.job_info.script }} - - # NOTE: Don't uninstall for PlatformIO because the library manager will clean up the - # dependencies leaving nothing for the cache - # pio pkg uninstall --library -g EnviroDIY_ModularSensors - - name: Uninstall testing version of Modular Sensors before caching - run: | - arduino-cli --config-file continuous_integration/arduino_cli.yaml lib uninstall ModularSensors - - build_pio: - name: ${{ matrix.job_info.job_name }} - runs-on: ubuntu-latest - needs: [generate_matrix, determine_library_source] - env: - LIBRARY_INSTALL_GIT: ${{ needs.determine_library_source.outputs.library_install_git }} - strategy: - matrix: - job_info: ${{ fromJSON(needs.generate_matrix.outputs.pio_job_matrix) }} - - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.x' - cache: 'pip' - - - name: Install python dependencies, including PlatformIO - run: pip install -r continuous_integration/requirements.txt - - - name: Restore PlatformIO platforms and libraries - uses: actions/cache@v4 - id: cache_libraries - with: - path: | - ~/.platformio - # if nothing in the dependencies.json file has changed, then it will - # be a "cache hit" and we can restore libraries from cache and not - # download them. If it has changed we have to re-download. - key: ${{ hashFiles('./continuous_integration/dependencies.json','continuous_integration/install-deps-platformio.sh') }} - - # Install the dependencies for PlatformIO - - name: Install the PlatformIO dependencies at global level - if: steps.cache_libraries.outputs.cache-hit != 'true' - run: | - chmod +x continuous_integration/install-deps-platformio.sh - sh continuous_integration/install-deps-platformio.sh - cp -a /home/runner/.platformio/lib/. $GITHUB_WORKSPACE/lib/ - - # Install ModularSensors at the Global level for PlatformIO - # Force install to get the right version - - name: Install the testing version of Modular Sensors for PlatformIO - run: | - pio pkg install -g --library ${{ env.LIBRARY_INSTALL_GIT }} - - - name: Download the prepared examples - uses: actions/download-artifact@v4 - with: - name: generated_examples - path: | - continuous_integration_artifacts/ - - - name: Include problem matcher - uses: ammaraskar/gcc-problem-matcher@master - - # Run the script to compile the examples - - name: Compile - env: - ACTION_RUN_ID: ${{ github.run_id }} - run: | - chmod +x ${{ matrix.job_info.script }} - bash ${{ matrix.job_info.script }} + build_examples: + name: Build all examples with PlatformIO and the Arduino CLI + if: ${{ ! contains(github.event.head_commit.message, 'ci skip') }} + uses: EnviroDIY/workflows/.github/workflows/build_examples.yaml@main + with: + boards_to_build: 'mayfly,megaatmega2560,zeroUSB,adafruit_feather_m0' + secrets: inherit diff --git a/continuous_integration/platformio.ini b/continuous_integration/platformio.ini index 263173d30..6b56d0d53 100644 --- a/continuous_integration/platformio.ini +++ b/continuous_integration/platformio.ini @@ -26,7 +26,7 @@ build_flags = -D SDI12_EXTERNAL_PCINT -D NEOSWSERIAL_EXTERNAL_PCINT -[env:Mayfly] +[env:mayfly] board = mayfly platform = atmelavr lib_ignore = @@ -36,7 +36,7 @@ lib_ignore = build_flags = ${env.build_flags} -[env:Mega] +[env:mega] platform = atmelavr board = megaatmega2560 lib_ignore = @@ -46,7 +46,7 @@ lib_ignore = build_flags = ${env.build_flags} -[env:Zero] +[env:zero] platform = atmelsam board = zeroUSB lib_ignore = @@ -58,7 +58,7 @@ lib_ignore = build_flags = ${env.build_flags} -[env:FeatherM0] +[env:feather_m0] platform = atmelsam board = adafruit_feather_m0 lib_ignore = @@ -71,7 +71,7 @@ build_flags = ${env.build_flags} build_unflags = -D USE_TINYUSB -; [env:FeatherM4] +; [env:feather_m4] ; platform = atmelsam ; board = adafruit_feather_m4 ; lib_ignore = @@ -86,7 +86,7 @@ build_unflags = -D USE_TINYUSB ; -D MS_SAMD_DS3231 ; build_unflags = -D USE_TINYUSB -; [env:GrandCentralM4] +; [env:grandcentral_m4] ; platform = atmelsam ; board = adafruit_grandcentral_m4 ; lib_ignore = diff --git a/src/sensors/GroPointGPLP8.h b/src/sensors/GroPointGPLP8.h index 869ea74b3..c73a34244 100644 --- a/src/sensors/GroPointGPLP8.h +++ b/src/sensors/GroPointGPLP8.h @@ -26,7 +26,7 @@ * Profiling Probe. Classes for the GroPoint Profile GPLP-8 Soil Moisture & * Temperature Probe. * - * @ingroup GroPoint_group + * @ingroup gropoint_group * * @tableofcontents * @m_footernavigation @@ -34,7 +34,7 @@ * @section sensor_gplp8_datasheet Sensor Datasheet * - [GroPoint Profile User Manual](https://www.gropoint.com/s/2625-N-T-GroPoint-Profile-User-Manual-V113.pdf), including Modbus Instructions. * - [GroPoint Profile Technical Info](https://www.gropoint.com/s/GroPoint-Profile-Technical-Info.pdf) - * * + * * @section sensor_gplp8_ctor Sensor Constructor * {{ @ref GroPointGPLP8::GroPointGPLP8 }} * From f09491d32505610a340ead79558056d6682cebe7 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 12:53:35 -0400 Subject: [PATCH 06/24] Update doxyfile Signed-off-by: Sara Damiano --- docs/Doxyfile | 57 +- .../m-EnviroDIY+documentation.compiled.css | 4397 ----------------- docs/markdown_prefilter.py | 355 -- 3 files changed, 30 insertions(+), 4779 deletions(-) delete mode 100644 docs/css/m-EnviroDIY+documentation.compiled.css delete mode 100644 docs/markdown_prefilter.py diff --git a/docs/Doxyfile b/docs/Doxyfile index f6ceb512d..3b2217a8f 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -67,7 +67,7 @@ PROJECT_LOGO = ModularSensors_ubuntu_264x55.png # when the HTML document is shown. Doxygen will copy the logo to the output # directory. -PROJECT_ICON = +PROJECT_ICON = enviroDIY_Favicon.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -135,7 +135,7 @@ BRIEF_MEMBER_DESC = YES # brief descriptions will be completely suppressed. # The default value is: YES. -REPEAT_BRIEF = YES +REPEAT_BRIEF = NO # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found @@ -245,7 +245,7 @@ QT_AUTOBRIEF = NO # not recognized any more. # The default value is: NO. -MULTILINE_CPP_IS_BRIEF = NO +MULTILINE_CPP_IS_BRIEF = YES # By default Python docstrings are displayed as preformatted text and Doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the @@ -289,9 +289,9 @@ TAB_SIZE = 4 # with the commands \{ and \} for these it is advised to use the version @{ and # @} or use a double escape (\\{ and \\}) -ALIASES = "license=@par License:\n" \ - "environment=@par Development Environment:\n" \ - "platform=@par Hardware Platform:\n" \ +ALIASES = "license=@par License^^" \ + "environment=@par Development Environment^^" \ + "platform=@par Hardware Platform^^" \ "m_div{1}=@xmlonly@endxmlonly" \ "m_enddiv=@xmlonly@endxmlonly" \ "m_span{1}=@xmlonly@endxmlonly" \ @@ -541,19 +541,19 @@ TIMESTAMP = YES # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = YES +EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. -EXTRACT_PRIVATE = NO +EXTRACT_PRIVATE = YES # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. -EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PRIV_VIRTUAL = YES # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. @@ -565,7 +565,7 @@ EXTRACT_PACKAGE = NO # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = NO +EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, @@ -940,7 +940,7 @@ WARN_IF_UNDOC_ENUM_VAL = YES # Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. -WARN_AS_ERROR = FAIL_ON_WARNINGS +WARN_AS_ERROR = FAIL_ON_WARNINGS_PRINT # The WARN_FORMAT tag determines the format of the warning messages that Doxygen # can produce. The string should contain the $file, $line, and $text tags, which @@ -1032,6 +1032,7 @@ FILE_PATTERNS = *.c \ *.hxx \ *.hpp \ *.h++ \ + *.tpp \ *.inc \ *.m \ *.markdown \ @@ -1039,8 +1040,7 @@ FILE_PATTERNS = *.c \ *.mm \ *.dox \ *.doc \ - *.txt \ - *.tpp + *.txt # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. @@ -1059,7 +1059,10 @@ EXCLUDE = ../src/ReadMe.md \ ../examples/logger_test \ ../examples/logger_test_nonew \ ../examples/YosemitechDO \ - ../src/sensors/table.md + ../src/sensors/table.md \ + ../lib \ + ../boards \ + ../variants # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -1177,7 +1180,7 @@ FILTER_SOURCE_PATTERNS = # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the Doxygen output. -USE_MDFILE_AS_MAINPAGE = README.md +USE_MDFILE_AS_MAINPAGE = # The Fortran standard specifies that for fixed formatted Fortran code all # characters from position 72 are to be considered as comment. A common @@ -2620,7 +2623,7 @@ HIDE_UNDOC_RELATIONS = NO # set to NO # The default value is: NO. -HAVE_DOT = YES +HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed # to run in parallel. When set to 0 Doxygen will base this on the number of @@ -2683,7 +2686,7 @@ DOT_FONTPATH = # Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. -CLASS_GRAPH = YES +CLASS_GRAPH = NO # If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a # graph for each documented class showing the direct and indirect implementation @@ -2695,7 +2698,7 @@ CLASS_GRAPH = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -COLLABORATION_GRAPH = YES +COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for # groups, showing the direct groups dependencies. Explicit enabling a group @@ -2706,7 +2709,7 @@ COLLABORATION_GRAPH = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -GROUP_GRAPHS = YES +GROUP_GRAPHS = NO # If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling @@ -2757,7 +2760,7 @@ DOT_WRAP_THRESHOLD = 17 # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -TEMPLATE_RELATIONS = YES +TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then Doxygen will generate a graph for each documented file showing the @@ -2768,7 +2771,7 @@ TEMPLATE_RELATIONS = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -INCLUDE_GRAPH = YES +INCLUDE_GRAPH = NO # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then Doxygen will generate a graph for each documented file showing @@ -2780,7 +2783,7 @@ INCLUDE_GRAPH = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -INCLUDED_BY_GRAPH = YES +INCLUDED_BY_GRAPH = NO # If the CALL_GRAPH tag is set to YES then Doxygen will generate a call # dependency graph for every global function or class method. @@ -2792,7 +2795,7 @@ INCLUDED_BY_GRAPH = YES # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALL_GRAPH = YES +CALL_GRAPH = NO # If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller # dependency graph for every global function or class method. @@ -2804,14 +2807,14 @@ CALL_GRAPH = YES # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALLER_GRAPH = YES +CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -GRAPHICAL_HIERARCHY = YES +GRAPHICAL_HIERARCHY = NO # If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the # dependencies a directory has on other directories in a graphical way. The @@ -2823,7 +2826,7 @@ GRAPHICAL_HIERARCHY = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -DIRECTORY_GRAPH = YES +DIRECTORY_GRAPH = NO # The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels # of child directories generated in directory dependency graphs by dot. @@ -2845,7 +2848,7 @@ DIR_GRAPH_MAX_DEPTH = 5 # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_IMAGE_FORMAT = png +DOT_IMAGE_FORMAT = svg # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. diff --git a/docs/css/m-EnviroDIY+documentation.compiled.css b/docs/css/m-EnviroDIY+documentation.compiled.css deleted file mode 100644 index ce5c1158e..000000000 --- a/docs/css/m-EnviroDIY+documentation.compiled.css +++ /dev/null @@ -1,4397 +0,0 @@ -/* Generated using `./postprocess.py m-EnviroDIY.css m-documentation.css -o m-EnviroDIY+documentation.compiled.css`. Do not edit. */ - -/* - This file is part of m.css. - - Copyright © 2017, 2018, 2019, 2020, 2021, 2022 - Vladimír Vondruš - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. -*/ - -*, ::before, ::after { box-sizing: border-box; } -body { margin: 0; } -.m-container { - width: 100%; - margin: auto; - padding-left: 1rem; - padding-right: 1rem; -} -.m-row { - margin-left: -1rem; - margin-right: -1rem; -} -.m-row::after { - content: ' '; - clear: both; - display: table; -} -.m-row > [class*='m-col-'] { - position: relative; - padding: 1rem; -} -[class*='m-clearfix-']::after { - display: block; - content: ' '; - clear: both; -} -[class*='m-show-'] { - display: none; -} -.m-container-inflate, :not(.m-row) > [class*='m-col-'] { - margin-bottom: 1rem; -} -.m-container-inflate:last-child, :not(.m-row) > [class*='m-col-']:last-child { - margin-bottom: 0; -} -.m-container.m-nopad, [class*='m-col-'].m-nopad, -.m-container.m-nopadx, [class*='m-col-'].m-nopadx, -.m-container.m-nopadl, [class*='m-col-'].m-nopadl { - padding-left: 0; -} -.m-container.m-nopad, [class*='m-col-'].m-nopad, -.m-container.m-nopadx, [class*='m-col-'].m-nopadx, -.m-container.m-nopadr, [class*='m-col-'].m-nopadr { - padding-right: 0; -} -[class*='m-col-'].m-nopad, [class*='m-col-'].m-nopady, [class*='m-col-'].m-nopadt { - padding-top: 0; -} -[class*='m-col-'].m-nopad, [class*='m-col-'].m-nopady, [class*='m-col-'].m-nopadb, -.m-container-inflate.m-nopadb { - padding-bottom: 0; -} -[class*='m-col-t-'] { float: left; } -.m-left-t { - padding-right: 1rem; - float: left; -} -.m-right-t, [class*='m-col-t-'].m-right-t { - padding-left: 1rem; - float: right; -} -.m-center-t, [class*='m-col-t-'].m-center-t { - float: none; -} -.m-center-t, [class*='m-col-t-'].m-center-t { - margin-left: auto; - margin-right: auto; - float: none; -} -.m-col-t-1 { width: calc(1 * 100% / 12); } -.m-col-t-2 { width: calc(2 * 100% / 12); } -.m-col-t-3 { width: calc(3 * 100% / 12); } -.m-col-t-4 { width: calc(4 * 100% / 12); } -.m-col-t-5 { width: calc(5 * 100% / 12); } -.m-col-t-6 { width: calc(6 * 100% / 12); } -.m-col-t-7 { width: calc(7 * 100% / 12); } -.m-col-t-8 { width: calc(8 * 100% / 12); } -.m-col-t-9 { width: calc(9 * 100% / 12); } -.m-col-t-10 { width: calc(10 * 100% / 12); } -.m-col-t-11 { width: calc(11 * 100% / 12); } -.m-col-t-12 { width: calc(12 * 100% / 12); } -.m-push-t-1 { left: calc(1 * 100% / 12); } -.m-push-t-2 { left: calc(2 * 100% / 12); } -.m-push-t-3 { left: calc(3 * 100% / 12); } -.m-push-t-4 { left: calc(4 * 100% / 12); } -.m-push-t-5 { left: calc(5 * 100% / 12); } -.m-push-t-6 { left: calc(6 * 100% / 12); } -.m-push-t-7 { left: calc(7 * 100% / 12); } -.m-push-t-8 { left: calc(8 * 100% / 12); } -.m-push-t-9 { left: calc(9 * 100% / 12); } -.m-push-t-10 { left: calc(10 * 100% / 12); } -.m-push-t-11 { left: calc(11 * 100% / 12); } -.m-pull-t-1 { right: calc(1 * 100% / 12); } -.m-pull-t-2 { right: calc(2 * 100% / 12); } -.m-pull-t-3 { right: calc(3 * 100% / 12); } -.m-pull-t-4 { right: calc(4 * 100% / 12); } -.m-pull-t-5 { right: calc(5 * 100% / 12); } -.m-pull-t-6 { right: calc(6 * 100% / 12); } -.m-pull-t-7 { right: calc(7 * 100% / 12); } -.m-pull-t-8 { right: calc(8 * 100% / 12); } -.m-pull-t-9 { right: calc(9 * 100% / 12); } -.m-pull-t-10 { right: calc(10 * 100% / 12); } -.m-pull-t-11 { right: calc(11 * 100% / 12); } -@media screen and (min-width: 576px) { - .m-container { width: 560px; } - .m-container-inflatable .m-col-s-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { - margin-left: -10%; - margin-right: -10%; - } - .m-container-inflatable .m-col-s-10 .m-container-inflate.m-left-s { - margin-left: -10%; - } - .m-container-inflatable .m-col-s-10 .m-container-inflate.m-right-s { - margin-right: -10%; - } - [class*='m-col-s-'] { float: left; } - .m-left-s { - padding-right: 1rem; - float: left; - } - .m-right-s, [class*='m-col-s-'].m-right-s { - padding-left: 1rem; - float: right; - } - .m-center-s, [class*='m-col-s-'].m-center-s { - margin-left: auto; - margin-right: auto; - float: none; - } - .m-col-s-1 { width: calc(1 * 100% / 12); } - .m-col-s-2 { width: calc(2 * 100% / 12); } - .m-col-s-3 { width: calc(3 * 100% / 12); } - .m-col-s-4 { width: calc(4 * 100% / 12); } - .m-col-s-5 { width: calc(5 * 100% / 12); } - .m-col-s-6 { width: calc(6 * 100% / 12); } - .m-col-s-7 { width: calc(7 * 100% / 12); } - .m-col-s-8 { width: calc(8 * 100% / 12); } - .m-col-s-9 { width: calc(9 * 100% / 12); } - .m-col-s-10 { width: calc(10 * 100% / 12); } - .m-col-s-11 { width: calc(11 * 100% / 12); } - .m-col-s-12 { width: calc(12 * 100% / 12); } - .m-push-s-0 { left: calc(0 * 100% / 12); } - .m-push-s-1 { left: calc(1 * 100% / 12); } - .m-push-s-2 { left: calc(2 * 100% / 12); } - .m-push-s-3 { left: calc(3 * 100% / 12); } - .m-push-s-4 { left: calc(4 * 100% / 12); } - .m-push-s-5 { left: calc(5 * 100% / 12); } - .m-push-s-6 { left: calc(6 * 100% / 12); } - .m-push-s-7 { left: calc(7 * 100% / 12); } - .m-push-s-8 { left: calc(8 * 100% / 12); } - .m-push-s-9 { left: calc(9 * 100% / 12); } - .m-push-s-10 { left: calc(10 * 100% / 12); } - .m-push-s-11 { left: calc(11 * 100% / 12); } - .m-pull-s-0 { right: calc(0 * 100% / 12); } - .m-pull-s-1 { right: calc(1 * 100% / 12); } - .m-pull-s-2 { right: calc(2 * 100% / 12); } - .m-pull-s-3 { right: calc(3 * 100% / 12); } - .m-pull-s-4 { right: calc(4 * 100% / 12); } - .m-pull-s-5 { right: calc(5 * 100% / 12); } - .m-pull-s-6 { right: calc(6 * 100% / 12); } - .m-pull-s-7 { right: calc(7 * 100% / 12); } - .m-pull-s-8 { right: calc(8 * 100% / 12); } - .m-pull-s-9 { right: calc(9 * 100% / 12); } - .m-pull-s-10 { right: calc(10 * 100% / 12); } - .m-pull-s-11 { right: calc(11 * 100% / 12); } - .m-clearfix-t::after { display: none; } - .m-hide-s { display: none; } - .m-show-s { display: block; } - .m-col-s-none { - width: auto; - float: none; - } -} -@media screen and (min-width: 768px) { - .m-container { width: 750px; } - .m-container-inflatable .m-col-m-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { - margin-left: -10%; - margin-right: -10%; - } - .m-container-inflatable .m-col-m-10 .m-container-inflate.m-left-m { - margin-left: -10%; - } - .m-container-inflatable .m-col-m-10 .m-container-inflate.m-right-m { - margin-right: -10%; - } - [class*='m-col-m-'] { float: left; } - .m-left-m { - padding-right: 1rem; - float: left; - } - .m-right-m, [class*='m-col-m-'].m-right-m { - padding-left: 1rem; - float: right; - } - .m-center-m, [class*='m-col-m-'].m-center-m { - margin-left: auto; - margin-right: auto; - float: none; - } - .m-col-m-1 { width: calc(1 * 100% / 12); } - .m-col-m-2 { width: calc(2 * 100% / 12); } - .m-col-m-3 { width: calc(3 * 100% / 12); } - .m-col-m-4 { width: calc(4 * 100% / 12); } - .m-col-m-5 { width: calc(5 * 100% / 12); } - .m-col-m-6 { width: calc(6 * 100% / 12); } - .m-col-m-7 { width: calc(7 * 100% / 12); } - .m-col-m-8 { width: calc(8 * 100% / 12); } - .m-col-m-9 { width: calc(9 * 100% / 12); } - .m-col-m-10 { width: calc(10 * 100% / 12); } - .m-col-m-11 { width: calc(11 * 100% / 12); } - .m-col-m-12 { width: calc(12 * 100% / 12); } - .m-push-m-0 { left: calc(0 * 100% / 12); } - .m-push-m-1 { left: calc(1 * 100% / 12); } - .m-push-m-2 { left: calc(2 * 100% / 12); } - .m-push-m-3 { left: calc(3 * 100% / 12); } - .m-push-m-4 { left: calc(4 * 100% / 12); } - .m-push-m-5 { left: calc(5 * 100% / 12); } - .m-push-m-6 { left: calc(6 * 100% / 12); } - .m-push-m-7 { left: calc(7 * 100% / 12); } - .m-push-m-8 { left: calc(8 * 100% / 12); } - .m-push-m-9 { left: calc(9 * 100% / 12); } - .m-push-m-10 { left: calc(10 * 100% / 12); } - .m-push-m-11 { left: calc(11 * 100% / 12); } - .m-pull-m-0 { right: calc(0 * 100% / 12); } - .m-pull-m-1 { right: calc(1 * 100% / 12); } - .m-pull-m-2 { right: calc(2 * 100% / 12); } - .m-pull-m-3 { right: calc(3 * 100% / 12); } - .m-pull-m-4 { right: calc(4 * 100% / 12); } - .m-pull-m-5 { right: calc(5 * 100% / 12); } - .m-pull-m-6 { right: calc(6 * 100% / 12); } - .m-pull-m-7 { right: calc(7 * 100% / 12); } - .m-pull-m-8 { right: calc(8 * 100% / 12); } - .m-pull-m-9 { right: calc(9 * 100% / 12); } - .m-pull-m-10 { right: calc(10 * 100% / 12); } - .m-pull-m-11 { right: calc(11 * 100% / 12); } - .m-clearfix-s::after { display: none; } - .m-hide-m { display: none; } - .m-show-m { display: block; } - .m-col-m-none { - width: auto; - float: none; - } -} -@media screen and (min-width: 992px) { - .m-container { width: 960px; } - .m-container-inflatable .m-col-l-10 .m-container-inflate:not([class*='m-left-']):not([class*='m-right-']) { - margin-left: -10%; - margin-right: -10%; - } - .m-container-inflatable .m-col-l-10 .m-container-inflate.m-left-l { - margin-left: -10%; - } - .m-container-inflatable .m-col-l-10 .m-container-inflate.m-right-l { - margin-right: -10%; - } - [class*='m-col-l-'] { float: left; } - .m-left-l { - padding-right: 1rem; - float: left; - } - .m-right-l, [class*='m-col-l-'].m-right-l { - padding-left: 1rem; - float: right; - } - .m-center-l, [class*='m-col-l-'].m-center-l { - margin-left: auto; - margin-right: auto; - float: none; - } - .m-col-l-1 { width: calc(1 * 100% / 12); } - .m-col-l-2 { width: calc(2 * 100% / 12); } - .m-col-l-3 { width: calc(3 * 100% / 12); } - .m-col-l-4 { width: calc(4 * 100% / 12); } - .m-col-l-5 { width: calc(5 * 100% / 12); } - .m-col-l-6 { width: calc(6 * 100% / 12); } - .m-col-l-7 { width: calc(7 * 100% / 12); } - .m-col-l-8 { width: calc(8 * 100% / 12); } - .m-col-l-9 { width: calc(9 * 100% / 12); } - .m-col-l-10 { width: calc(10 * 100% / 12); } - .m-col-l-11 { width: calc(11 * 100% / 12); } - .m-col-l-12 { width: calc(12 * 100% / 12); } - .m-push-l-0 { left: calc(0 * 100% / 12); } - .m-push-l-1 { left: calc(1 * 100% / 12); } - .m-push-l-2 { left: calc(2 * 100% / 12); } - .m-push-l-3 { left: calc(3 * 100% / 12); } - .m-push-l-4 { left: calc(4 * 100% / 12); } - .m-push-l-5 { left: calc(5 * 100% / 12); } - .m-push-l-6 { left: calc(6 * 100% / 12); } - .m-push-l-7 { left: calc(7 * 100% / 12); } - .m-push-l-8 { left: calc(8 * 100% / 12); } - .m-push-l-9 { left: calc(9 * 100% / 12); } - .m-push-l-10 { left: calc(10 * 100% / 12); } - .m-push-l-11 { left: calc(11 * 100% / 12); } - .m-pull-l-0 { right: calc(0 * 100% / 12); } - .m-pull-l-1 { right: calc(1 * 100% / 12); } - .m-pull-l-2 { right: calc(2 * 100% / 12); } - .m-pull-l-3 { right: calc(3 * 100% / 12); } - .m-pull-l-4 { right: calc(4 * 100% / 12); } - .m-pull-l-5 { right: calc(5 * 100% / 12); } - .m-pull-l-6 { right: calc(6 * 100% / 12); } - .m-pull-l-7 { right: calc(7 * 100% / 12); } - .m-pull-l-8 { right: calc(8 * 100% / 12); } - .m-pull-l-9 { right: calc(9 * 100% / 12); } - .m-pull-l-10 { right: calc(10 * 100% / 12); } - .m-pull-l-11 { right: calc(11 * 100% / 12); } - .m-clearfix-m::after { display: none; } - .m-hide-l { display: none; } - .m-show-l { display: block; } - .m-col-l-none { - width: auto; - float: none; - } -} - -html { - font-size: 14px; - background-color: #e8e8e8; -} -body { - font-family: 'Roboto', sans-serif; - font-size: 14px; - line-height: normal; - color: #000000; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin-top: 0; - font-weight: 300; -} -h1 { - margin-bottom: 1rem; -} -h2, -h3, -h4, -h5, -h6 { - margin-bottom: 0.5rem; -} -p, -ul, -ol, -dl { - margin-top: 0; -} -ul, -ol { - padding-left: 2rem; -} -ul ol, -ul ul, -ol ol, -ol ul { - margin-bottom: 0; -} -main p { - text-indent: 1.5rem; - text-align: justify; -} -main p.m-noindent, -li > p, -dd > p, -table.m-table td > p { - text-indent: 0; - text-align: left; -} -blockquote { - margin-top: 0; - margin-left: 1rem; - margin-right: 1rem; - padding: 1rem; - border-left-style: solid; - border-left-width: 0.25rem; -} -hr { - width: 75%; - border-width: 0.0625rem; - border-style: solid; -} -blockquote, -hr { - border-color: #92d050; -} -strong, -.m-text.m-strong { - font-weight: bold; -} -em, -.m-text.m-em { - font-style: italic; -} -s, -.m-text.m-s { - text-decoration: line-through; -} -sub, -sup, -.m-text.m-sub, -.m-text.m-sup { - font-size: 0.75rem; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup, -.m-text.m-sup { - top: -0.35rem; -} -sub, -.m-text.m-sub { - bottom: -0.2rem; -} -abbr { - cursor: help; - text-decoration: underline dotted; -} -a { - color: #26a9e0; -} -a.m-flat { - text-decoration: none; -} -a:hover, -a:focus, -a:active { - color: #26a9e0; -} -a img { - border: 0; -} -svg a { - cursor: pointer; -} -mark { - padding: 0.0625rem; - background-color: #e6e69c; - color: #4c93d3; -} -.m-link-wrap { - word-break: break-all; -} -pre, -code { - font-family: 'Monaco', monospace, monospace, monospace; - font-size: 0.95em; - color: #000000; - background-color: #f7f7f7; -} -pre.m-console, -code.m-console { - color: #000000; - background-color: #f7f7f7; -} -pre { - padding: 0.5rem 1rem; - border-radius: 0px; - overflow-x: auto; - margin-top: 0; -} -pre.m-console-wrap { - white-space: pre-wrap; - word-break: break-all; -} -code { - padding: 0.125rem; -} -*:focus { - outline-color: #ffffff; -} -div.m-scroll { - max-width: 100%; - overflow-x: auto; -} -.m-fullwidth { - width: 100%; -} -.m-spacing-150 { - line-height: 1.5rem; -} -.m-text-center, -.m-text-center.m-noindent, -table.m-table th.m-text-center, -.m-text-center p { - text-align: center; -} -.m-text-left, -.m-text-left.m-noindent, -table.m-table th.m-text-left, -.m-text-right p { - text-align: left; -} -.m-text-right, -.m-text-right.m-noindent, -table.m-table th.m-text-right, -.m-text-right p { - text-align: right; -} -.m-text-top, -table.m-table th.m-text-top, -table.m-table td.m-text-top { - vertical-align: top; -} -.m-text-middle, -table.m-table th.m-text-middle, -table.m-table td.m-text-middle { - vertical-align: middle; -} -.m-text-bottom, -table.m-table th.m-text-bottom, -table.m-table td.m-text-bottom { - vertical-align: bottom; -} -.m-text.m-tiny { - font-size: 50%; -} -.m-text.m-small { - font-size: 85.4%; -} -.m-text.m-big { - font-size: 117%; -} -h1 .m-thin, -h2 .m-thin, -h3 .m-thin, -h4 .m-thin, -h5 .m-thin, -h6 .m-thin { - font-weight: normal; - font-size: 75%; - color: #666; -} -ul.m-unstyled, -ol.m-unstyled { - list-style-type: none; - padding-left: 0; -} -ul[class*="m-block-"], -ol[class*="m-block-"] { - padding-left: 0; -} -ul[class*="m-block-"] li, -ol[class*="m-block-"] li { - display: inline; -} -ul[class*="m-block-bar-"] li:not(:last-child)::after, -ol[class*="m-block-bar-"] li:not(:last-child)::after { - content: " | "; -} -ul[class*="m-block-dot-"] li:not(:last-child)::after, -ol[class*="m-block-dot-"] li:not(:last-child)::after { - content: " • "; -} -@media screen and (min-width: 576px) { - ul.m-block-bar-s, - ol.m-block-bar-s, - ul.m-block-dot-s, - ol.m-block-dot-s { - padding-left: 2rem; - } - ul.m-block-bar-s li, - ol.m-block-bar-s li, - ul.m-block-dot-s li, - ol.m-block-dot-s li { - display: list-item; - } - ul.m-block-bar-s li:not(:last-child)::after, - ol.m-block-bar-s li:not(:last-child)::after, - ul.m-block-dot-s li:not(:last-child)::after, - ol.m-block-dot-s li:not(:last-child)::after { - content: ""; - } -} -@media screen and (min-width: 768px) { - ul.m-block-bar-m, - ol.m-block-bar-m, - ul.m-block-dot-m, - ol.m-block-dot-m { - padding-left: 2rem; - } - ul.m-block-bar-m li, - ol.m-block-bar-m li, - ul.m-block-dot-m li, - ol.m-block-dot-m li { - display: list-item; - } - ul.m-block-bar-m li:not(:last-child)::after, - ol.m-block-bar-m li:not(:last-child)::after, - ul.m-block-dot-m li:not(:last-child)::after, - ol.m-block-dot-m li:not(:last-child)::after { - content: ""; - } -} -@media screen and (min-width: 992px) { - ul.m-block-bar-l, - ol.m-block-bar-l, - ul.m-block-dot-l, - ol.m-block-dot-l { - padding-left: 2rem; - } - ul.m-block-bar-l li, - ol.m-block-bar-l li, - ul.m-block-dot-l li, - ol.m-block-dot-l li { - display: list-item; - } - ul.m-block-bar-l li:not(:last-child)::after, - ol.m-block-bar-l li:not(:last-child)::after, - ul.m-block-dot-l li:not(:last-child)::after, - ol.m-block-dot-l li:not(:last-child)::after { - content: ""; - } -} -p.m-poem { - text-indent: 0; - text-align: left; - margin-left: 1.5rem; -} -p.m-transition { - color: #ddd; - text-indent: 0; - text-align: center; - font-size: 2rem; -} -dl.m-diary { - margin-bottom: 1.25rem; -} -dl.m-diary:last-child { - margin-bottom: 0.25rem; -} -dl.m-diary dt { - font-weight: bold; - width: 6rem; - float: left; - clear: both; - padding-top: 0.25rem; -} -dl.m-diary dd { - padding-top: 0.25rem; - padding-left: 6rem; - margin-left: 0; -} -a.m-footnote, -dl.m-footnote dd span.m-footnote { - top: -0.35rem; - font-size: 0.75rem; - line-height: 0; - position: relative; - vertical-align: baseline; -} -a.m-footnote, -dl.m-footnote dd span.m-footnote a { - text-decoration: none; -} -a.m-footnote::before { - content: "["; -} -a.m-footnote::after { - content: "]"; -} -dl.m-footnote dt { - width: 1.5rem; - float: left; - clear: both; -} -dl.m-footnote dd { - margin-left: 1.5rem; -} -dl.m-footnote { - font-size: 85.4%; -} -dl.m-footnote dd span.m-footnote a { - font-weight: bold; - font-style: italic; -} -.m-container-inflatable { - background-color: #ffffff; -} -.m-note { - border-radius: 0px; - padding: 1rem; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-frame { - background-color: #e8e8e8; - border-style: solid; - border-width: 0.125rem; - border-radius: 0px; - border-color: #ddd; - padding: 0.875rem; -} -.m-block { - border-style: solid; - border-width: 0.0625rem; - border-radius: 0px; - border-color: #ddd; - padding: 0.9375rem 0.9375rem 0.9375rem 0.75rem; -} -.m-block.hr { - width: 75%; - border-width: 0.0625rem; - border-style: solid; - border-color: #92d050; -} -.m-block.m-row.hr { - width: 75%; - border-width: 0.0625rem; - border-style: solid; - border-color: #92d050; -} -.m-block.m-badge::after { - content: " "; - display: block; - clear: both; -} -.m-block.m-badge h3 { - margin-left: 5rem; -} -.m-block.m-badge p { - margin-left: 5rem; - text-indent: 0; -} -.m-block.m-badge img { - width: 4rem; - height: 4rem; - border-radius: 0.5rem; - float: left; -} -div.m-button { - text-align: center; -} -div.m-button a { - display: inline-block; - border-radius: 0.5rem; - padding-top: 0.75rem; - padding-bottom: 0.75rem; - padding-left: 1.5rem; - padding-right: 1.5rem; - text-decoration: none; - font-size: 1.17rem; -} -div.m-button.m-fullwidth a { - display: block; - padding-left: 0.5rem; - padding-right: 0.5rem; -} -div.m-button a .m-big:first-child { - font-size: 1.37rem; - font-weight: bold; -} -div.m-button a .m-small:last-child { - font-size: 0.854rem; -} -.m-label { - border-radius: 0.5rem; - font-size: 75%; - font-weight: normal; - padding: 0.125rem 0.25rem; - vertical-align: 7.5%; -} -.m-label.m-flat { - border-width: 0.0625rem; - border-style: solid; - border-color: #666; - padding: 0.0625rem 0.1875rem; -} -table.m-table { - border-collapse: collapse; - margin-left: auto; - margin-right: auto; - font-size: 0.9em; -} -table.m-table.m-big { - margin-top: 1.75rem; -} -div.m-scroll > table.m-table:last-child { - margin-bottom: 0.0625rem; -} -table.m-table:not(.m-flat) tbody tr:hover { - background-color: #ddd; -} -table.m-table tr, -table.m-table th, -table.m-table td { - vertical-align: top; - border-style: solid; - border-top-width: 0.0625rem; - border-left-width: 0; - border-right-width: 0; - border-bottom-width: 0; - border-color: #ddd; -} -table.m-table tr:first-child th, -table.m-table tr:first-child td { - vertical-align: top; - border-style: solid; - border-top-width: 0.0625rem; - border-left-width: 0; - border-right-width: 0; - border-bottom-width: 0; - border-color: #ddd; -} -table.m-table tr:last-child th, -table.m-table tr:last-child td { - vertical-align: top; - border-style: solid; - border-top-width: 0.0625rem; - border-bottom-width: 0.0625rem; - border-left-width: 0; - border-right-width: 0; - border-color: #ddd; -} -table.m-table caption { - padding-bottom: 0.5rem; -} -table.m-table thead tr:first-child th, -table.m-table thead tr:first-child td { - border-top-width: 0.125rem; - border-left-width: 0; - border-right-width: 0; -} -table.m-table thead th, -table.m-table thead td { - border-bottom-width: 0.125rem; - vertical-align: bottom; - border-left-width: 0; - border-right-width: 0; -} -table.m-table tfoot th, -table.m-table tfoot td { - border-top-width: 0.125rem; -} -table.m-table th, -table.m-table td { - padding: 0.5rem; -} -table.m-table.m-big th, -table.m-table.m-big td { - padding: 0.75rem 1rem; -} -table.m-table th { - text-align: left; -} -table.m-table th.m-thin { - font-weight: normal; -} -table.m-table td.m-default, -table.m-table th.m-default, -table.m-table td.m-primary, -table.m-table th.m-primary, -table.m-table td.m-success, -table.m-table th.m-success, -table.m-table td.m-warning, -table.m-table th.m-warning, -table.m-table td.m-danger, -table.m-table th.m-danger, -table.m-table td.m-info, -table.m-table th.m-info, -table.m-table td.m-dim, -table.m-table th.m-dim, -table.m-table td.m-param, -table.m-table th.m-param { - padding-left: 0.4375rem; - padding-right: 0.4375rem; -} -table.m-table.m-big td.m-default, -table.m-table.m-big th.m-default, -table.m-table.m-big td.m-primary, -table.m-table.m-big th.m-primary, -table.m-table.m-big td.m-success, -table.m-table.m-big th.m-success, -table.m-table.m-big td.m-warning, -table.m-table.m-big th.m-warning, -table.m-table.m-big td.m-danger, -table.m-table.m-big th.m-danger, -table.m-table.m-big td.m-info, -table.m-table.m-big th.m-info, -table.m-table.m-big td.m-dim, -table.m-table.m-big th.m-dim, -table.m-table.m-big td.m-param, -table.m-table.m-big th.m-param { - padding-left: 0.9375rem; - padding-right: 0.9375rem; -} -table.m-table tr.m-default td, -table.m-table td.m-default, -table.m-table tr.m-default th, -table.m-table th.m-default, -table.m-table tr.m-primary td, -table.m-table td.m-primary, -table.m-table tr.m-primary th, -table.m-table th.m-primary, -table.m-table tr.m-success td, -table.m-table td.m-success, -table.m-table tr.m-success th, -table.m-table th.m-success, -table.m-table tr.m-warning td, -table.m-table td.m-warning, -table.m-table tr.m-warning th, -table.m-table th.m-warning, -table.m-table tr.m-danger td, -table.m-table td.m-danger, -table.m-table tr.m-danger th, -table.m-table th.m-danger, -table.m-table tr.m-info td, -table.m-table td.m-info, -table.m-table tr.m-info th, -table.m-table th.m-info, -table.m-table tr.m-dim td, -table.m-table td.m-dim, -table.m-table tr.m-dim th, -table.m-table th.m-dim, -table.m-table tr.m-param td, -table.m-table td.m-param, -table.m-table tr.m-param th, -table.m-table th.m-param { - border-color: #e8e8e8; -} -.m-note pre, -.m-note code, -table.m-table tr.m-default pre, -table.m-table tr.m-default code, -table.m-table td.m-default pre, -table.m-table td.m-default code, -table.m-table th.m-default pre, -table.m-table th.m-default code, -table.m-table tr.m-primary pre, -table.m-table tr.m-primary code, -table.m-table td.m-primary pre, -table.m-table td.m-primary code, -table.m-table th.m-primary pre, -table.m-table th.m-primary code, -table.m-table tr.m-success pre, -table.m-table tr.m-success code, -table.m-table td.m-success pre, -table.m-table td.m-success code, -table.m-table th.m-success pre, -table.m-table th.m-success code, -table.m-table tr.m-warning pre, -table.m-table tr.m-warning code, -table.m-table td.m-warning pre, -table.m-table td.m-warning code, -table.m-table th.m-warning pre, -table.m-table th.m-warning code, -table.m-table tr.m-danger pre, -table.m-table tr.m-danger code, -table.m-table td.m-danger pre, -table.m-table td.m-danger code, -table.m-table th.m-danger pre, -table.m-table th.m-danger code, -table.m-table tr.m-info pre, -table.m-table tr.m-info code, -table.m-table td.m-info pre, -table.m-table td.m-info code, -table.m-table th.m-info pre, -table.m-table th.m-info code, -table.m-table tr.m-dim pre, -table.m-table tr.m-dim code, -table.m-table td.m-dim pre, -table.m-table td.m-dim code, -table.m-table th.m-dim pre, -table.m-table th.m-dim code, -table.m-table tr.m-param pre, -table.m-table tr.m-param code, -table.m-table td.m-param pre, -table.m-table td.m-param code, -table.m-table th.m-param pre, -table.m-table th.m-param code { - background-color: rgba(251, 240, 236, 0.5); -} -img.m-image, -svg.m-image { - display: block; - margin-left: auto; - margin-right: auto; -} -div.m-image { - text-align: center; -} -img.m-image, -svg.m-image, -div.m-image img, -div.m-image svg { - max-width: 100%; - border-radius: 0px; -} -div.m-image.m-fullwidth img, -div.m-image.m-fullwidth svg { - width: 100%; -} -img.m-image.m-badge, -div.m-image.m-badge img { - border-radius: 50%; -} -figure.m-figure { - max-width: 100%; - margin-top: 0; - margin-left: auto; - margin-right: auto; - position: relative; - display: table; -} -figure.m-figure::before { - position: absolute; - content: " "; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: -1; - border-style: solid; - border-width: 0.125rem; - border-radius: 0px; - border-color: #ddd; -} -figure.m-figure.m-flat::before { - border-color: transparent; -} -figure.m-figure > * { - margin-left: 1rem; - margin-right: 1rem; - display: table-caption; - caption-side: bottom; -} -figure.m-figure > *:first-child { - display: inline; -} -figure.m-figure > *:last-child { - margin-bottom: 1rem !important; -} -figure.m-figure img, -figure.m-figure svg { - position: relative; - margin-left: 0; - margin-right: 0; - margin-bottom: 0; - border-top-left-radius: 0px; - border-top-right-radius: 0px; - max-width: 100%; -} -figure.m-figure.m-flat img, -figure.m-figure.m-flat svg { - border-bottom-left-radius: 0px; - border-bottom-right-radius: 0px; -} -figure.m-figure a img, -figure.m-figure a svg { - margin-left: -1rem; - margin-right: -1rem; -} -figure.m-figure.m-fullwidth, -figure.m-figure.m-fullwidth > * { - display: block; -} -figure.m-figure.m-fullwidth > *:first-child { - display: inline; -} -figure.m-figure.m-fullwidth img, -figure.m-figure.m-fullwidth svg { - width: 100%; -} -figure.m-figure.m-fullwidth::after { - content: " "; - display: block; - margin-top: 1rem; - height: 1px; -} -.m-code-figure, -.m-console-figure { - margin-top: 0; - margin-left: 0; - margin-right: 0; - position: relative; - padding: 1rem; -} -.m-code-figure::before, -.m-console-figure::before { - position: absolute; - content: " "; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: -1; - border-style: solid; - border-width: 0.125rem; - border-radius: 0px; -} -.m-code-figure::before { - border-color: #f7f7f7; -} -.m-console-figure::before { - border-color: #f7f7f7; -} -.m-code-figure.m-flat::before, -.m-console-figure.m-flat::before { - border-color: transparent; -} -.m-code-figure > pre:first-child, -.m-console-figure > pre:first-child { - position: relative; - margin: -1rem -1rem 1rem -1rem; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} -.m-code-figure > pre.m-nopad, -.m-console-figure > pre.m-nopad { - margin-left: -0.875rem; - margin-right: -0.875rem; - margin-top: -1rem; - margin-bottom: -0.875rem; - padding-left: 0.875rem; -} -figure.m-figure figcaption, -.m-code-figure figcaption, -.m-console-figure figcaption { - margin-top: 0.5rem; - margin-bottom: 0.5rem; - font-weight: 300; - font-size: 1.17rem; -} -figure.m-figure figcaption a, -.m-code-figure figcaption a, -.m-console-figure figcaption a { - text-decoration: none; -} -figure.m-figure figcaption .m-figure-description { - margin-top: 0.5rem; - font-weight: normal; - font-size: 1rem; -} -figure.m-figure figcaption .m-figure-description a { - text-decoration: underline; -} -.m-imagegrid > div { - background-color: #e8e8e8; -} -.m-imagegrid > div > figure { - display: block; - float: left; - position: relative; - margin: 0; -} -.m-imagegrid > div > figure > div, -.m-imagegrid > div > figure > figcaption, -.m-imagegrid > div > figure > a > div, -.m-imagegrid > div > figure > a > figcaption { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - border-color: #e8e8e8; - border-style: solid; - border-width: 0.25rem; - padding: 0.5rem; -} -.m-imagegrid > div > figure:first-child > div, -.m-imagegrid > div > figure:first-child > figcaption, -.m-imagegrid > div > figure:first-child > a > div, -.m-imagegrid > div > figure:first-child > a > figcaption { - border-left-width: 0; -} -.m-imagegrid > div > figure:last-child > div, -.m-imagegrid > div > figure:last-child > figcaption, -.m-imagegrid > div > figure:last-child > a > div, -.m-imagegrid > div > figure:last-child > a > figcaption { - border-right-width: 0; -} -.m-imagegrid > div > figure > figcaption, -.m-imagegrid > div > figure > a > figcaption { - color: transparent; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 0.75rem; -} -.m-imagegrid > div > figure > div::before, -.m-imagegrid > div > figure > figcaption::before, -.m-imagegrid > div > figure > a > div::before, -.m-imagegrid > div > figure > a > figcaption::before { - content: ""; - display: inline-block; - height: 100%; - vertical-align: bottom; - width: 0; -} -.m-imagegrid > div > figure:hover > figcaption, -.m-imagegrid > div > figure:hover > a > figcaption { - background: linear-gradient( - transparent 0%, - transparent 75%, - rgba(0, 0, 0, 0.85) 100% - ); - color: #ffffff; -} -.m-imagegrid > div > figure > img, -.m-imagegrid > div > figure > a > img { - width: 100%; - height: 100%; -} -.m-imagegrid > div::after { - display: block; - content: " "; - clear: both; -} -@media screen and (max-width: 767px) { - .m-imagegrid > div > figure { - float: none; - width: 100% !important; - } - .m-imagegrid > div > figure > div, - .m-imagegrid > div > figure > figcaption, - .m-imagegrid > div > figure > a > div, - .m-imagegrid > div > figure > a > figcaption { - border-left-width: 0; - border-right-width: 0; - } -} -.m-container-inflatable > .m-row > [class*="m-col-"] > .m-note, -.m-container-inflatable > .m-row > [class*="m-col-"] > .m-frame, -.m-container-inflatable > .m-row > [class*="m-col-"] > .m-block, -.m-container-inflatable > .m-row > [class*="m-col-"] > .m-imagegrid, -.m-container-inflatable > .m-row > [class*="m-col-"] > pre, -.m-container-inflatable > .m-row > [class*="m-col-"] > .m-code-figure, -.m-container-inflatable > .m-row > [class*="m-col-"] > .m-console-figure, -.m-container-inflatable > .m-row > [class*="m-col-"] section > .m-note, -.m-container-inflatable > .m-row > [class*="m-col-"] section > .m-frame, -.m-container-inflatable > .m-row > [class*="m-col-"] section > .m-block, -.m-container-inflatable > .m-row > [class*="m-col-"] section > .m-imagegrid, -.m-container-inflatable > .m-row > [class*="m-col-"] section > pre, -.m-container-inflatable > .m-row > [class*="m-col-"] section > .m-code-figure, -.m-container-inflatable > .m-row > [class*="m-col-"] section > .m-console-figure, -.m-container-inflatable [class*="m-center-"] > .m-note, -.m-container-inflatable [class*="m-center-"] > .m-frame, -.m-container-inflatable [class*="m-center-"] > .m-block, -.m-container-inflatable [class*="m-center-"] > .m-imagegrid, -.m-container-inflatable [class*="m-center-"] > pre, -.m-container-inflatable [class*="m-center-"] > .m-code-figure, -.m-container-inflatable [class*="m-center-"] > .m-console-figure, -.m-container-inflatable [class*="m-left-"] > .m-note, -.m-container-inflatable [class*="m-left-"] > .m-frame, -.m-container-inflatable [class*="m-left-"] > .m-block, -.m-container-inflatable [class*="m-left-"] > .m-imagegrid, -.m-container-inflatable [class*="m-left-"] > pre, -.m-container-inflatable [class*="m-left-"] > .m-code-figure, -.m-container-inflatable [class*="m-left-"] > .m-console-figure, -.m-container-inflatable [class*="m-right-"] > .m-note, -.m-container-inflatable [class*="m-right-"] > .m-frame, -.m-container-inflatable [class*="m-right-"] > .m-block, -.m-container-inflatable [class*="m-right-"] > .m-imagegrid, -.m-container-inflatable [class*="m-right-"] > pre, -.m-container-inflatable [class*="m-right-"] > .m-code-figure, -.m-container-inflatable [class*="m-right-"] > .m-console-figure, -.m-container-inflatable .m-container-inflate > .m-note, -.m-container-inflatable .m-container-inflate > .m-frame, -.m-container-inflatable .m-container-inflate > .m-block, -.m-container-inflatable .m-container-inflate > .m-imagegrid, -.m-container-inflatable .m-container-inflate > pre, -.m-container-inflatable .m-container-inflate > .m-code-figure, -.m-container-inflatable .m-container-inflate > .m-console-figure { - margin-left: -1rem; - margin-right: -1rem; -} -@media screen and (min-width: 576px) { - .m-container-inflatable .m-center-s > .m-note, - .m-container-inflatable .m-center-s > .m-frame, - .m-container-inflatable .m-center-s > .m-block, - .m-container-inflatable .m-center-s > .m-imagegrid, - .m-container-inflatable .m-center-s > pre, - .m-container-inflatable .m-center-s > .m-code-figure, - .m-container-inflatable .m-center-s > .m-console-figure { - margin-left: -1rem; - margin-right: -1rem; - } - .m-container-inflatable .m-left-s > .m-note, - .m-container-inflatable .m-left-s > .m-frame, - .m-container-inflatable .m-left-s > .m-block, - .m-container-inflatable .m-left-s > .m-imagegrid, - .m-container-inflatable .m-left-s > pre, - .m-container-inflatable .m-left-s > .m-code-figure, - .m-container-inflatable .m-left-s > .m-console-figure { - margin-left: -1rem; - margin-right: 0; - } - .m-container-inflatable .m-right-s > .m-note, - .m-container-inflatable .m-right-s > .m-frame, - .m-container-inflatable .m-right-s > .m-block, - .m-container-inflatable .m-right-s > .m-imagegrid, - .m-container-inflatable .m-right-s > pre, - .m-container-inflatable .m-right-s > .m-code-figure, - .m-container-inflatable .m-right-s > .m-console-figure { - margin-left: 0; - margin-right: -1rem; - } - .m-container-inflatable - > .m-row - > .m-col-s-10 - > .m-imagegrid.m-container-inflate, - .m-container-inflatable - > .m-row - > .m-col-s-10 - section - > .m-imagegrid.m-container-inflate { - margin-left: -10%; - margin-right: -10%; - } -} -@media screen and (min-width: 768px) { - .m-container-inflatable .m-center-m > .m-note, - .m-container-inflatable .m-center-m > .m-frame, - .m-container-inflatable .m-center-m > .m-block, - .m-container-inflatable .m-center-m > .m-imagegrid, - .m-container-inflatable .m-center-m > pre, - .m-container-inflatable .m-center-m > .m-code-figure, - .m-container-inflatable .m-center-m > .m-console-figure { - margin-left: -1rem; - margin-right: -1rem; - } - .m-container-inflatable .m-left-m > .m-note, - .m-container-inflatable .m-left-m > .m-frame, - .m-container-inflatable .m-left-m > .m-block, - .m-container-inflatable .m-left-m > .m-imagegrid, - .m-container-inflatable .m-left-m > pre, - .m-container-inflatable .m-left-m > .m-code-figure, - .m-container-inflatable .m-left-m > .m-console-figure { - margin-left: -1rem; - margin-right: 0; - } - .m-container-inflatable .m-right-m > .m-note, - .m-container-inflatable .m-right-m > .m-frame, - .m-container-inflatable .m-right-m > .m-block, - .m-container-inflatable .m-right-m > .m-imagegrid, - .m-container-inflatable .m-right-m > pre, - .m-container-inflatable .m-right-m > .m-code-figure, - .m-container-inflatable .m-right-m > .m-console-figure { - margin-left: 0; - margin-right: -1rem; - } - .m-container-inflatable - > .m-row - > .m-col-m-10 - > .m-imagegrid.m-container-inflate, - .m-container-inflatable - > .m-row - > .m-col-m-10 - section - > .m-imagegrid.m-container-inflate { - margin-left: -10%; - margin-right: -10%; - } -} -@media screen and (min-width: 992px) { - .m-container-inflatable .m-center-l > .m-note, - .m-container-inflatable .m-center-l > .m-frame, - .m-container-inflatable .m-center-l > .m-block, - .m-container-inflatable .m-center-l > .m-imagegrid, - .m-container-inflatable .m-center-l > pre, - .m-container-inflatable .m-center-l > .m-code-figure, - .m-container-inflatable .m-center-l > .m-console-figure { - margin-left: -1rem; - margin-right: -1rem; - } - .m-container-inflatable .m-left-l > .m-note, - .m-container-inflatable .m-left-l > .m-frame, - .m-container-inflatable .m-left-l > .m-block, - .m-container-inflatable .m-left-l > .m-imagegrid, - .m-container-inflatable .m-left-l > pre, - .m-container-inflatable .m-left-l > .m-code-figure, - .m-container-inflatable .m-left-l > .m-console-figure { - margin-left: -1rem; - margin-right: 0; - } - .m-container-inflatable .m-right-l > .m-note, - .m-container-inflatable .m-right-l > .m-frame, - .m-container-inflatable .m-right-l > .m-block, - .m-container-inflatable .m-right-l > .m-imagegrid, - .m-container-inflatable .m-right-l > pre, - .m-container-inflatable .m-right-l > .m-code-figure, - .m-container-inflatable .m-right-l > .m-console-figure { - margin-left: 0; - margin-right: -1rem; - } - .m-container-inflatable - > .m-row - > .m-col-l-10 - > .m-imagegrid.m-container-inflate, - .m-container-inflatable - > .m-row - > .m-col-l-10 - section - > .m-imagegrid.m-container-inflate { - margin-left: -10%; - margin-right: -10%; - } -} -pre.m-code span.hll { - margin-left: -1rem; - margin-right: -1rem; - padding-left: 1rem; -} -.m-code.m-inverted > span, -.m-console.m-inverted > span { - opacity: 0.3333; -} -.m-code.m-inverted > span.hll, -.m-console.m-inverted > span.hll { - opacity: 1; - background-color: transparent; - border-color: transparent; -} -.m-code.m-inverted { - color: rgba(91, 91, 91, 0.33); -} -.m-console.m-inverted { - color: rgba(91, 91, 91, 0.33); -} -.m-code.m-inverted > span.hll { - color: #000000; -} -.m-cosole.m-inverted > span.hll { - color: #000000; -} -.m-code-color { - display: inline-block; - width: 0.75rem; - height: 0.75rem; - vertical-align: -0.05rem; - margin-left: 0.2rem; - margin-right: 0.1rem; - border-radius: 0px; -} -div.m-math { - overflow-x: auto; - overflow-y: hidden; -} -div.m-math svg { - margin-left: auto; - margin-right: auto; - display: block; -} -div.m-button a svg.m-math { - fill: #ffffff; -} -div.m-button.m-flat a svg.m-math { - fill: #000000; -} -div.m-button.m-flat a:hover svg.m-math, -div.m-button.m-default a:focus svg.m-math, -div.m-button.m-default a:active svg.m-math { - fill: #26a9e0; -} -.m-graph { - font-size: 14px; -} -div.m-plot svg, -div.m-graph svg { - max-width: 100%; - margin-left: auto; - margin-right: auto; - display: block; -} -div.m-plot .m-background { - fill: #fbf0ec; -} -div.m-plot svg .m-label { - font-size: 11px; -} -div.m-plot svg .m-title { - font-size: 13px; -} -div.m-plot svg .m-label, -div.m-plot svg .m-title { - fill: #000000; -} -div.m-plot svg .m-line { - stroke: #000000; - stroke-width: 0.8; -} -div.m-plot svg .m-error { - stroke: #000000; - stroke-width: 1.5; -} -div.m-plot svg .m-label.m-dim { - fill: #666; -} -.m-graph g.m-edge path, -.m-graph g.m-cluster polygon, -.m-graph g.m-node.m-flat ellipse, -.m-graph g.m-node.m-flat polygon { - fill: none; -} -.m-graph g.m-node:not(.m-flat) text { - fill: #ffffff; -} -figure.m-figure > svg.m-math:first-child, -figure.m-figure > svg.m-graph:first-child { - padding: 1rem; - box-sizing: content-box; -} -figure.m-figure:not(.m-flat) > svg.m-math:first-child, -figure.m-figure:not(.m-flat) > svg.m-graph:first-child { - background-color: #ddd; -} -.m-block.m-default { - border-left-color: #ddd; -} -.m-block.m-default h3, -.m-block.m-default h4, -.m-block.m-default h5, -.m-block.m-default h6, -.m-text.m-default, -.m-label.m-flat.m-default { - color: #000000; -} -.m-block.m-default h3 a, -.m-block.m-default h4 a, -.m-block.m-default h5 a, -.m-block.m-default h6 a { - color: #26a9e0; -} -.m-block.m-primary { - border-left-color: #31708f; -} -.m-block.m-primary h3, -.m-block.m-primary h4, -.m-block.m-primary h5, -.m-block.m-primary h6, -.m-block.m-primary h3 a, -.m-block.m-primary h4 a, -.m-block.m-primary h5 a, -.m-block.m-primary h6 a, -.m-text.m-primary, -.m-label.m-flat.m-primary { - color: #31708f; -} -.m-block.m-success { - border-left-color: #9ad36a; -} -.m-block.m-success h3, -.m-block.m-success h4, -.m-block.m-success h5, -.m-block.m-success h6, -.m-block.m-success h3 a, -.m-block.m-success h4 a, -.m-block.m-success h5 a, -.m-block.m-success h6 a, -.m-text.m-success, -.m-label.m-flat.m-success { - color: #9ad36a; -} -.m-block.m-warning { - border-left-color: #f9cf79; -} -.m-block.m-warning h3, -.m-block.m-warning h4, -.m-block.m-warning h5, -.m-block.m-warning h6, -.m-block.m-warning h3 a, -.m-block.m-warning h4 a, -.m-block.m-warning h5 a, -.m-block.m-warning h6 a, -.m-text.m-warning, -.m-label.m-flat.m-warning { - color: #f9cf79; -} -.m-block.m-danger { - border-left-color: #f60000; -} -.m-block.m-danger h3, -.m-block.m-danger h4, -.m-block.m-danger h5, -.m-block.m-danger h6, -.m-block.m-danger h3 a, -.m-block.m-danger h4 a, -.m-block.m-danger h5 a, -.m-block.m-danger h6 a, -.m-text.m-danger, -.m-label.m-flat.m-danger { - color: #f60000; -} -.m-block.m-info { - border-left-color: #31708f; -} -.m-block.m-info h3, -.m-block.m-info h4, -.m-block.m-info h5, -.m-block.m-info h6, -.m-block.m-info h3 a, -.m-block.m-info h4 a, -.m-block.m-info h5 a, -.m-block.m-info h6 a, -.m-text.m-info, -.m-label.m-flat.m-info { - color: #31708f; -} -.m-block.m-param h3, -.m-block.m-param h4, -.m-block.m-param h5, -.m-block.m-param h6, -.m-block.m-param h3 a, -.m-block.m-param h4 a, -.m-block.m-param h5 a, -.m-block.m-param h6 a, -.m-text.m-param, -.m-label.m-flat.m-param { - color: #9ad36a; -} -.m-block.m-dim { - border-left-color: #666; -} -span.m-default { - color: #000000; - background-color: transparent; -} -span.m-default a { - color: var(--default-link-color); - background-color: transparent; -} -span.m-default a:hover, -span.m-default a:focus, -span.m-default a:active { - color: #26a9e0; - background-color: transparent; -} -span.m-primary { - color: #31708f; - background-color: transparent; -} -span.m-primary a { - color: var(--primary-link-color); - background-color: transparent; -} -span.m-primary a:hover, -span.m-primary a:focus, -span.m-primary a:active { - color: #31708f; - background-color: transparent; -} -span.m-success { - color: #9ad36a; - background-color: transparent; -} -span.m-success a { - color: var(--success-link-color); - background-color: transparent; -} -span.m-success a:hover, -span.m-success a:focus, -span.m-success a:active { - color: #9ad36a; - background-color: transparent; -} -span.m-warning { - color: #f9cf79; - background-color: transparent; -} -span.m-warning a { - color: var(--warning-link-color); - background-color: transparent; -} -span.m-warning a:hover, -span.m-warning a:focus, -span.m-warning a:active { - color: #f9cf79; - background-color: transparent; -} -span.m-danger { - color: #f60000; - background-color: transparent; -} -span.m-danger a { - color: var(--danger-link-color); - background-color: transparent; -} -span.m-danger a:hover, -span.m-danger a:focus, -span.m-danger a:active { - color: #f60000; - background-color: transparent; -} -span.m-info { - color: #31708f; - background-color: transparent; -} -span.m-info a { - color: var(--info-link-color); - background-color: transparent; -} -span.m-info a:hover, -span.m-info a:focus, -span.m-info a:active { - color: #67cce0; - background-color: transparent; -} -span.m-param { - color: #9ad36a; - background-color: transparent; - font-weight: bold; -} -span.m-param a { - color: var(--param-link-color); - background-color: transparent; -} -span.m-param a:hover, -span.m-param a:focus, -span.m-param a:active { - color: #9ad36a; - background-color: transparent; -} -span.m-dim { - color: #666; - background-color: transparent; -} -span.m-dim a { - color: #949494; - background-color: transparent; -} -span.m-dim a:hover, -span.m-dim a:focus, -span.m-dim a:active { - color: #949494; - background-color: transparent; -} -.m-block.m-dim, -.m-text.m-dim, -.m-label.m-flat.m-dim { - color: #666; -} -.m-block.m-dim a, -.m-text.m-dim a { - color: #949494; -} -.m-block.m-dim a:hover, -.m-block.m-dim a:focus, -.m-block.m-dim a:active, -.m-text.m-dim a:hover, -.m-text.m-dim a:focus, -.m-text.m-dim a:active { - color: #949494; -} -.m-block.m-param { - border-left-color: #9ad36a; -} -.m-block.m-param h3, -.m-block.m-param h4, -.m-block.m-param h5, -.m-block.m-param h6, -.m-block.m-param h3 a, -.m-block.m-param h4 a, -.m-block.m-param h5 a, -.m-block.m-param h6 a, -.m-text.m-param, -.m-label.m-flat.m-param { - color: #9ad36a; -} -.m-block.m-flat { - border-color: transparent; -} -.m-block.m-flat h3, -.m-block.m-flat h4, -.m-block.m-flat h5, -.m-block.m-flat h6 { - color: #000000; -} -.m-block.m-default h3 a:hover, -.m-block.m-default h3 a:focus, -.m-block.m-default h3 a:active, -.m-block.m-default h4 a:hover, -.m-block.m-default h4 a:focus, -.m-block.m-default h4 a:active, -.m-block.m-default h5 a:hover, -.m-block.m-default h5 a:focus, -.m-block.m-default h5 a:active, -.m-block.m-default h6 a:hover, -.m-block.m-default h6 a:focus, -.m-block.m-default h6 a:active { - color: #26a9e0; -} -.m-block.m-primary h3 a:hover, -.m-block.m-primary h3 a:focus, -.m-block.m-primary h3 a:active, -.m-block.m-primary h4 a:hover, -.m-block.m-primary h4 a:focus, -.m-block.m-primary h4 a:active, -.m-block.m-primary h5 a:hover, -.m-block.m-primary h5 a:focus, -.m-block.m-primary h5 a:active, -.m-block.m-primary h6 a:hover, -.m-block.m-primary h6 a:focus, -.m-block.m-primary h6 a:active { - color: #31708f; -} -.m-block.m-success h3 a:hover, -.m-block.m-success h3 a:focus, -.m-block.m-success h3 a:active, -.m-block.m-success h4 a:hover, -.m-block.m-success h4 a:focus, -.m-block.m-success h4 a:active, -.m-block.m-success h5 a:hover, -.m-block.m-success h5 a:focus, -.m-block.m-success h5 a:active, -.m-block.m-success h6 a:hover, -.m-block.m-success h6 a:focus, -.m-block.m-success h6 a:active { - color: #9ad36a; -} -.m-block.m-warning h3 a:hover, -.m-block.m-warning h3 a:focus, -.m-block.m-warning h3 a:active, -.m-block.m-warning h4 a:hover, -.m-block.m-warning h4 a:focus, -.m-block.m-warning h4 a:active, -.m-block.m-warning h5 a:hover, -.m-block.m-warning h5 a:focus, -.m-block.m-warning h5 a:active, -.m-block.m-warning h6 a:hover, -.m-block.m-warning h6 a:focus, -.m-block.m-warning h6 a:active { - color: #f9cf79; -} -.m-block.m-danger h3 a:hover, -.m-block.m-danger h3 a:focus, -.m-block.m-danger h3 a:active, -.m-block.m-danger h4 a:hover, -.m-block.m-danger h4 a:focus, -.m-block.m-danger h4 a:active, -.m-block.m-danger h5 a:hover, -.m-block.m-danger h5 a:focus, -.m-block.m-danger h5 a:active, -.m-block.m-danger h6 a:hover, -.m-block.m-danger h6 a:focus, -.m-block.m-danger h6 a:active { - color: #f60000; -} -.m-block.m-info h3 a:hover, -.m-block.m-info h3 a:focus, -.m-block.m-info h3 a:active, -.m-block.m-info h4 a:hover, -.m-block.m-info h4 a:focus, -.m-block.m-info h4 a:active, -.m-block.m-info h5 a:hover, -.m-block.m-info h5 a:focus, -.m-block.m-info h5 a:active, -.m-block.m-info h6 a:hover, -.m-block.m-info h6 a:focus, -.m-block.m-info h6 a:active { - color: #67cce0; -} -.m-block.m-param h3 a:hover, -.m-block.m-param h3 a:focus, -.m-block.m-param h3 a:active, -.m-block.m-param h4 a:hover, -.m-block.m-param h4 a:focus, -.m-block.m-param h4 a:active, -.m-block.m-param h5 a:hover, -.m-block.m-param h5 a:focus, -.m-block.m-param h5 a:active, -.m-block.m-param h6 a:hover, -.m-block.m-param h6 a:focus, -.m-block.m-param h6 a:active { - color: #9ad36a; -} -div.m-button a, -.m-label { - color: #ffffff; -} -div.m-button.m-flat a { - color: #000000; -} -div.m-button.m-flat a:hover, -div.m-button.m-default a:focus, -div.m-button.m-default a:active { - color: #26a9e0; -} -div.m-button.m-default a, -.m-label:not(.m-flat).m-default { - background-color: #000000; - color: #353535; -} -div.m-button.m-primary a, -.m-label:not(.m-flat).m-primary { - background-color: #31708f; - color: #67cce0; -} -div.m-button.m-success a, -.m-label:not(.m-flat).m-success { - background-color: #9ad36a; - color: #3c763d; -} -div.m-button.m-warning a, -.m-label:not(.m-flat).m-warning { - background-color: #f9cf79; - color: #8a6d3b; -} -div.m-button.m-danger a, -.m-label:not(.m-flat).m-danger { - background-color: #f60000; - color: #920000; -} -div.m-button.m-info a, -.m-label:not(.m-flat).m-info { - background-color: #31708f; - color: #81bcda; -} -div.m-button.m-dim a, -.m-label:not(.m-flat).m-dim { - background-color: #666; - color: #7c7c7c; -} -div.m-button.m-param a, -.m-label:not(.m-flat).m-param { - background-color: #9ad36a; - color: #3c763d; -} -div.m-button.m-default a:hover, -div.m-button.m-default a:focus, -div.m-button.m-default a:active { - background-color: #26a9e0; -} -div.m-button.m-primary a:hover, -div.m-button.m-primary a:focus, -div.m-button.m-primary a:active { - background-color: #31708f; -} -div.m-button.m-success a:hover, -div.m-button.m-success a:focus, -div.m-button.m-success a:active { - background-color: #9ad36a; -} -div.m-button.m-warning a:hover, -div.m-button.m-warning a:focus, -div.m-button.m-warning a:active { - background-color: #f9cf79; -} -div.m-button.m-danger a:hover, -div.m-button.m-danger a:focus, -div.m-button.m-danger a:active { - background-color: #f60000; -} -div.m-button.m-info a:hover, -div.m-button.m-info a:focus, -div.m-button.m-info a:active { - background-color: #67cce0; -} -div.m-button.m-dim a:hover, -div.m-button.m-dim a:focus, -div.m-button.m-dim a:active { - background-color: #c0c0c0; -} -div.m-button.m-param a:hover, -div.m-button.m-param a:focus, -div.m-button.m-param a:active { - background-color: #9ad36a; -} -.m-note.m-default { - background-color: transparent; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-default, -table.m-table tr.m-default td, -table.m-table td.m-default, -table.m-table tr.m-default th, -table.m-table th.m-default, -table.m-table tr.m-default strong, -table.m-table strong.m-default, -table.m-table tr.m-default em, -table.m-table em.m-default { - color: #353535; -} -.m-note.m-default a:hover, -table.m-table tr.m-default td a:hover, -table.m-table td.m-default a:hover, -table.m-table tr.m-default th a:hover, -table.m-table th.m-default a:hover, -.m-note.m-default a:focus, -table.m-table tr.m-default td a:focus, -table.m-table td.m-default a:focus, -table.m-table tr.m-default th a:focus, -table.m-table th.m-default a:focus, -.m-note.m-default a:active, -table.m-table tr.m-default td a:active, -table.m-table td.m-default a:active, -table.m-table tr.m-default th a:active, -table.m-table th.m-default a:active { - color: #26a9e0; -} -.m-note.m-primary { - border-color: #31708f; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-primary a, -table.m-table tr.m-primary td a, -table.m-table td.m-primary a, -table.m-table tr.m-primary th a, -table.m-table th.m-primary a { - color: #26a9e0; -} -.m-note.m-primary, -table.m-table tr.m-primary td, -table.m-table td.m-primary, -table.m-table tr.m-primary th, -table.m-table th.m-primary, -table.m-table tr.m-primary strong, -table.m-table strong.m-primary, -table.m-table tr.m-primary em, -table.m-table em.m-primary { - background-color: transparent; - color: #67cce0; -} -.m-note.m-primary a, -table.m-table tr.m-primary td a, -table.m-table td.m-primary a, -table.m-table tr.m-primary th a, -table.m-table th.m-primary a { - color: #31708f; -} -.m-note.m-primary a:hover, -table.m-table tr.m-primary td a:hover, -table.m-table td.m-primary a:hover, -table.m-table tr.m-primary th a:hover, -table.m-table th.m-primary a:hover, -.m-note.m-primary a:focus, -table.m-table tr.m-primary td a:focus, -table.m-table td.m-primary a:focus, -table.m-table tr.m-primary th a:focus, -table.m-table th.m-primary a:focus, -.m-note.m-primary a:active, -table.m-table tr.m-primary td a:active, -table.m-table td.m-primary a:active, -table.m-table tr.m-primary th a:active, -table.m-table th.m-primary a:active { - color: #31708f; -} -.m-note.m-success { - border-color: #9ad36a; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-success, -table.m-table tr.m-success td, -table.m-table td.m-success, -table.m-table tr.m-success th, -table.m-table th.m-success, -table.m-table tr.m-success strong, -table.m-table strong.m-success, -table.m-table tr.m-success em, -table.m-table em.m-success { - background-color: transparent; - color: #3c763d; -} -.m-note.m-success a, -table.m-table tr.m-success td a, -table.m-table td.m-success a, -table.m-table tr.m-success th a, -table.m-table th.m-success a { - color: #9ad36a; -} -.m-note.m-success a:hover, -table.m-table tr.m-success td a:hover, -table.m-table td.m-success a:hover, -table.m-table tr.m-success th a:hover, -table.m-table th.m-success a:hover, -.m-note.m-success a:focus, -table.m-table tr.m-success td a:focus, -table.m-table td.m-success a:focus, -table.m-table tr.m-success th a:focus, -table.m-table th.m-success a:focus, -.m-note.m-success a:active, -table.m-table tr.m-success td a:active, -table.m-table td.m-success a:active, -table.m-table tr.m-success th a:active, -table.m-table th.m-success a:active { - color: #9ad36a; -} -.m-note.m-warning { - border-color: #f9cf79; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-warning, -table.m-table tr.m-warning td, -table.m-table td.m-warning, -table.m-table tr.m-warning th, -table.m-table th.m-warning, -table.m-table tr.m-warning strong, -table.m-table strong.m-warning, -table.m-table tr.m-warning em, -table.m-table em.m-warning { - background-color: transparent; - color: #8a6d3b; -} -.m-note.m-warning a, -table.m-table tr.m-warning td a, -table.m-table td.m-warning a, -table.m-table tr.m-warning th a, -table.m-table th.m-warning a { - color: #f9cf79; -} -.m-note.m-warning a:hover, -table.m-table tr.m-warning td a:hover, -table.m-table td.m-warning a:hover, -table.m-table tr.m-warning th a:hover, -table.m-table th.m-warning a:hover, -.m-note.m-warning a:focus, -table.m-table tr.m-warning td a:focus, -table.m-table td.m-warning a:focus, -table.m-table tr.m-warning th a:focus, -table.m-table th.m-warning a:focus, -.m-note.m-warning a:active, -table.m-table tr.m-warning td a:active, -table.m-table td.m-warning a:active, -table.m-table tr.m-warning th a:active, -table.m-table th.m-warning a:active { - color: #f9cf79; -} -.m-note.m-danger { - border-color: #f60000; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-danger, -table.m-table tr.m-danger td, -table.m-table td.m-danger, -table.m-table tr.m-danger th, -table.m-table th.m-danger, -table.m-table tr.m-danger strong, -table.m-table strong.m-danger, -table.m-table tr.m-danger em, -table.m-table em.m-danger { - background-color: transparent; - color: #920000; -} -.m-note.m-danger a, -table.m-table tr.m-danger td a, -table.m-table td.m-danger a, -table.m-table tr.m-danger th a, -table.m-table th.m-danger a { - color: #f60000; -} -.m-note.m-danger a:hover, -table.m-table tr.m-danger td a:hover, -table.m-table td.m-danger a:hover, -table.m-table tr.m-danger th a:hover, -table.m-table th.m-danger a:hover, -.m-note.m-danger a:focus, -table.m-table tr.m-danger td a:focus, -table.m-table td.m-danger a:focus, -table.m-table tr.m-danger th a:focus, -table.m-table th.m-danger a:focus, -.m-note.m-danger a:active, -table.m-table tr.m-danger td a:active, -table.m-table td.m-danger a:active, -table.m-table tr.m-danger th a:active, -table.m-table th.m-danger a:active { - color: #f60000; -} -.m-note.m-info { - border-color: #31708f; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-info, -table.m-table tr.m-info td, -table.m-table td.m-info, -table.m-table tr.m-info th, -table.m-table th.m-info, -table.m-table tr.m-info strong, -table.m-table strong.m-info, -table.m-table tr.m-info em, -table.m-table em.m-info { - background-color: transparent; - color: #81bcda; -} -.m-note.m-info a, -table.m-table tr.m-info td a, -table.m-table td.m-info a, -table.m-table tr.m-info th a, -table.m-table th.m-info a { - color: #67cce0; -} -.m-note.m-info a:hover, -table.m-table tr.m-info td a:hover, -table.m-table td.m-info a:hover, -table.m-table tr.m-info th a:hover, -table.m-table th.m-info a:hover, -.m-note.m-info a:focus, -table.m-table tr.m-info td a:focus, -table.m-table td.m-info a:focus, -table.m-table tr.m-info th a:focus, -table.m-table th.m-info a:focus, -.m-note.m-info a:active, -table.m-table tr.m-info td a:active, -table.m-table td.m-info a:active, -table.m-table tr.m-info th a:active, -table.m-table th.m-info a:active { - color: #67cce0; -} -.m-note.m-dim { - border-color: #666; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-dim, -table.m-table tr.m-dim td, -table.m-table td.m-dim, -table.m-table tr.m-dim th, -table.m-table th.m-dim, -table.m-table tr.m-dim strong, -table.m-table strong.m-dim, -table.m-table tr.m-dim em, -table.m-table em.m-dim { - background-color: transparent; - color: #7c7c7c; -} -.m-note.m-dim a, -table.m-table tr.m-dim td a, -table.m-table td.m-dim a, -table.m-table tr.m-dim th a, -table.m-table th.m-dim a { - color: #c0c0c0; -} -.m-note.m-dim a:hover, -table.m-table tr.m-dim td a:hover, -table.m-table td.m-dim a:hover, -table.m-table tr.m-dim th a:hover, -table.m-table th.m-dim a:hover, -.m-note.m-dim a:focus, -table.m-table tr.m-dim td a:focus, -table.m-table td.m-dim a:focus, -table.m-table tr.m-dim th a:focus, -table.m-table th.m-dim a:focus, -.m-note.m-dim a:active, -table.m-table tr.m-dim td a:active, -table.m-table td.m-dim a:active, -table.m-table tr.m-dim th a:active, -table.m-table th.m-dim a:active { - color: #c0c0c0; -} -.m-note.m-param { - border-color: #9ad36a; - border-width: 2px; - border-style: solid; - padding-top: 0; -} -.m-note.m-param, -table.m-table tr.m-param td, -table.m-table td.m-param, -table.m-table tr.m-param th, -table.m-table th.m-param, -table.m-table tr.m-param strong, -table.m-table strong.m-param, -table.m-table tr.m-param em, -table.m-table em.m-param { - background-color: transparent; - color: #3c763d; -} -.m-note.m-param a, -table.m-table tr.m-param td a, -table.m-table td.m-param a, -table.m-table tr.m-param th a, -table.m-table th.m-param a { - color: #9ad36a; -} -.m-note.m-param a:hover, -table.m-table tr.m-param td a:hover, -table.m-table td.m-param a:hover, -table.m-table tr.m-param th a:hover, -table.m-table th.m-param a:hover, -.m-note.m-param a:focus, -table.m-table tr.m-param td a:focus, -table.m-table td.m-param a:focus, -table.m-table tr.m-param th a:focus, -table.m-table th.m-param a:focus, -.m-note.m-param a:active, -table.m-table tr.m-param td a:active, -table.m-table td.m-param a:active, -table.m-table tr.m-param th a:active, -table.m-table th.m-param a:active { - color: #9ad36a; -} -figure.m-figure.m-default::before { - border-color: transparent; -} -figure.m-figure.m-default figcaption { - color: #000000; -} -figure.m-figure.m-primary::before { - border-color: transparent; -} -figure.m-figure.m-primary figcaption { - color: #31708f; -} -figure.m-figure.m-primary figcaption .m-figure-description { - color: #000000; -} -figure.m-figure.m-success::before { - border-color: transparent; -} -figure.m-figure.m-success figcaption { - color: #9ad36a; -} -figure.m-figure.m-success figcaption .m-figure-description { - color: #000000; -} -figure.m-figure.m-warning::before { - border-color: transparent; -} -figure.m-figure.m-warning figcaption { - color: #f9cf79; -} -figure.m-figure.m-warning figcaption .m-figure-description { - color: #000000; -} -figure.m-figure.m-danger::before { - border-color: transparent; -} -figure.m-figure.m-danger figcaption { - color: #f60000; -} -figure.m-figure.m-danger figcaption .m-figure-description { - color: #000000; -} -figure.m-figure.m-info::before { - border-color: transparent; -} -figure.m-figure.m-info figcaption { - color: #31708f; -} -figure.m-figure.m-info figcaption .m-figure-description { - color: #000000; -} -figure.m-figure.m-param::before { - border-color: transparent; -} -figure.m-figure.m-param figcaption { - color: #9ad36a; -} -figure.m-figure.m-dim::before { - border-color: transparent; -} -figure.m-figure.m-dim { - color: #666; -} -figure.m-figure.m-dim a { - color: #949494; -} -figure.m-figure.m-dim a:hover, -figure.m-figure.m-dim a:focus, -figure.m-figure.m-dim a:active { - color: #949494; -} -.m-math { - fill: #000000; -} -.m-math.m-default, -.m-math g.m-default, -.m-math rect.m-default, -div.m-plot svg .m-bar.m-default, -.m-graph g.m-edge polygon, -.m-graph g.m-node:not(.m-flat) ellipse, -.m-graph g.m-node:not(.m-flat) polygon, -.m-graph g.m-edge text, -.m-graph g.m-node.m-flat text, -.m-graph g.m-cluster text, -.m-graph.m-default g.m-edge polygon, -.m-graph.m-default g.m-node:not(.m-flat) ellipse, -.m-graph.m-default g.m-node:not(.m-flat) polygon, -.m-graph.m-default g.m-edge text, -.m-graph.m-default g.m-node.m-flat text, -.m-graph.m-default g.m-cluster text { - fill: #000000; -} -.m-graph g.m-edge polygon, -.m-graph g.m-edge path, -.m-graph g.m-node ellipse, -.m-graph g.m-node polygon, -.m-graph g.m-node polyline, -.m-graph g.m-cluster polygon, -.m-graph.m-default g.m-edge polygon, -.m-graph.m-default g.m-edge path, -.m-graph.m-default g.m-node ellipse, -.m-graph.m-default g.m-node polygon, -.m-graph.m-default g.m-node polyline, -.m-graph.m-default g.m-cluster polygon { - stroke: #000000; -} -.m-math.m-primary, -.m-math g.m-primary, -.m-math rect.m-primary, -div.m-plot svg .m-bar.m-primary, -.m-graph.m-primary g.m-edge polygon, -.m-graph.m-primary g.m-node:not(.m-flat) ellipse, -.m-graph.m-primary g.m-node:not(.m-flat) polygon, -.m-graph.m-primary g.m-edge text, -.m-graph.m-primary g.m-node.m-flat text, -.m-graph.m-primary g.m-cluster text { - fill: #31708f; -} -.m-graph.m-primary g.m-edge polygon, -.m-graph.m-primary g.m-edge path, -.m-graph.m-primary g.m-node ellipse, -.m-graph.m-primary g.m-node polygon, -.m-graph.m-primary g.m-node polyline, -.m-graph.m-primary g.m-cluster polygon { - stroke: #31708f; -} -.m-math.m-success, -.m-math g.m-success, -.m-math rect.m-success, -div.m-plot svg .m-bar.m-success, -.m-graph.m-success g.m-edge polygon, -.m-graph.m-success g.m-node:not(.m-flat) ellipse, -.m-graph.m-success g.m-node:not(.m-flat) polygon, -.m-graph.m-success g.m-edge text, -.m-graph.m-success g.m-node.m-flat text, -.m-graph.m-success g.m-cluster text { - fill: #9ad36a; -} -.m-graph.m-success g.m-edge polygon, -.m-graph.m-success g.m-edge path, -.m-graph.m-success g.m-node ellipse, -.m-graph.m-success g.m-node polygon, -.m-graph.m-success g.m-node polyline, -.m-graph.m-success g.m-cluster polygon { - stroke: #9ad36a; -} -.m-math.m-warning, -.m-math g.m-warning, -.m-math rect.m-warning, -div.m-plot svg .m-bar.m-warning, -.m-graph.m-warning g.m-edge polygon, -.m-graph.m-warning g.m-node:not(.m-flat) ellipse, -.m-graph.m-warning g.m-node:not(.m-flat) polygon, -.m-graph.m-warning g.m-edge text, -.m-graph.m-warning g.m-node.m-flat text, -.m-graph.m-warning g.m-cluster text { - fill: #f9cf79; -} -.m-graph.m-warning g.m-edge polygon, -.m-graph.m-warning g.m-edge path, -.m-graph.m-warning g.m-node ellipse, -.m-graph.m-warning g.m-node polygon, -.m-graph.m-warning g.m-node polyline, -.m-graph.m-warning g.m-cluster polygon { - stroke: #f9cf79; -} -.m-math.m-danger, -.m-math g.m-danger, -.m-math rect.m-danger, -div.m-plot svg .m-bar.m-danger, -.m-graph.m-danger g.m-edge polygon, -.m-graph.m-danger g.m-node:not(.m-flat) ellipse, -.m-graph.m-danger g.m-node:not(.m-flat) polygon, -.m-graph.m-danger g.m-edge text, -.m-graph.m-danger g.m-node.m-flat text, -.m-graph.m-danger g.m-cluster text { - fill: #f60000; -} -.m-graph.m-danger g.m-edge polygon, -.m-graph.m-danger g.m-edge path, -.m-graph.m-danger g.m-node ellipse, -.m-graph.m-danger g.m-node polygon, -.m-graph.m-danger g.m-node polyline, -.m-graph.m-danger g.m-cluster polygon { - stroke: #f60000; -} -.m-math.m-info, -.m-math g.m-info, -.m-math rect.m-info, -div.m-plot svg .m-bar.m-info, -.m-graph.m-info g.m-edge polygon, -.m-graph.m-info g.m-node:not(.m-flat) ellipse, -.m-graph.m-info g.m-node:not(.m-flat) polygon, -.m-graph.m-info g.m-edge text, -.m-graph.m-info g.m-node.m-flat text, -.m-graph.m-info g.m-cluster text { - fill: #31708f; -} -.m-graph.m-info g.m-edge polygon, -.m-graph.m-info g.m-edge path, -.m-graph.m-info g.m-node ellipse, -.m-graph.m-info g.m-node polygon, -.m-graph.m-info g.m-node polyline, -.m-graph.m-info g.m-cluster polygon { - stroke: #31708f; -} -.m-math.m-dim, -.m-math g.m-dim, -.m-math rect.m-dim, -div.m-plot svg .m-bar.m-dim, -.m-graph.m-dim g.m-edge polygon, -.m-graph.m-dim g.m-node:not(.m-flat) ellipse, -.m-graph.m-dim g.m-node:not(.m-flat) polygon, -.m-graph.m-dim g.m-edge text, -.m-graph.m-dim g.m-node.m-flat text, -.m-graph.m-dim g.m-cluster text { - fill: #666; -} -.m-graph.m-dim g.m-edge polygon, -.m-graph.m-dim g.m-edge path, -.m-graph.m-dim g.m-node ellipse, -.m-graph.m-dim g.m-node polygon, -.m-graph.m-dim g.m-node polyline, -.m-graph.m-dim g.m-cluster polygon { - stroke: #666; -} -.m-math.m-param, -.m-math g.m-param, -.m-math rect.m-param, -div.m-plot svg .m-bar.m-param, -.m-graph.m-param g.m-edge polygon, -.m-graph.m-param g.m-node:not(.m-flat) ellipse, -.m-graph.m-param g.m-node:not(.m-flat) polygon, -.m-graph.m-param g.m-edge text, -.m-graph.m-param g.m-node.m-flat text { - fill: #9ad36a; -} -.m-graph.m-param g.m-edge polygon, -.m-graph.m-param g.m-edge path, -.m-graph.m-param g.m-node ellipse, -.m-graph.m-param g.m-node polygon, -.m-graph.m-param g.m-node polyline { - stroke: #9ad36a; -} -.m-graph g.m-edge.m-default polygon, -.m-graph g.m-node.m-default:not(.m-flat) ellipse, -.m-graph g.m-node.m-default:not(.m-flat) polygon, -.m-graph g.m-edge.m-default text, -.m-graph g.m-node.m-default.m-flat text, -.m-graph g.m-cluster.m-default text { - fill: #000000; -} -.m-graph g.m-edge.m-default polygon, -.m-graph g.m-edge.m-default path, -.m-graph g.m-node.m-default ellipse, -.m-graph g.m-node.m-default polygon, -.m-graph g.m-node.m-default polyline, -.m-graph g.m-cluster.m-default polygon { - stroke: #000000; -} -.m-graph g.m-edge.m-primary polygon, -.m-graph g.m-node.m-primary:not(.m-flat) ellipse, -.m-graph g.m-node.m-primary:not(.m-flat) polygon, -.m-graph g.m-edge.m-primary text, -.m-graph g.m-node.m-primary.m-flat text, -.m-graph g.m-cluster.m-primary text { - fill: #31708f; -} -.m-graph g.m-edge.m-primary polygon, -.m-graph g.m-edge.m-primary path, -.m-graph g.m-node.m-primary ellipse, -.m-graph g.m-node.m-primary polygon, -.m-graph g.m-node.m-primary polyline, -.m-graph g.m-cluster.m-primary polygon { - stroke: #31708f; -} -.m-graph g.m-edge.m-success polygon, -.m-graph g.m-node.m-success:not(.m-flat) ellipse, -.m-graph g.m-node.m-success:not(.m-flat) polygon, -.m-graph g.m-edge.m-success text, -.m-graph g.m-node.m-success.m-flat text, -.m-graph g.m-cluster.m-success text { - fill: #9ad36a; -} -.m-graph g.m-edge.m-success polygon, -.m-graph g.m-edge.m-success path, -.m-graph g.m-node.m-success ellipse, -.m-graph g.m-node.m-success polygon, -.m-graph g.m-node.m-success polyline, -.m-graph g.m-cluster.m-success polygon { - stroke: #9ad36a; -} -.m-graph g.m-edge.m-warning polygon, -.m-graph g.m-node.m-warning:not(.m-flat) ellipse, -.m-graph g.m-node.m-warning:not(.m-flat) polygon, -.m-graph g.m-edge.m-warning text, -.m-graph g.m-node.m-warning.m-flat text, -.m-graph g.m-cluster.m-warning text { - fill: #f9cf79; -} -.m-graph g.m-edge.m-warning polygon, -.m-graph g.m-edge.m-warning path, -.m-graph g.m-node.m-warning ellipse, -.m-graph g.m-node.m-warning polygon, -.m-graph g.m-node.m-warning polyline, -.m-graph g.m-cluster.m-warning polygon { - stroke: #f9cf79; -} -.m-graph g.m-edge.m-danger polygon, -.m-graph g.m-node.m-danger:not(.m-flat) ellipse, -.m-graph g.m-node.m-danger:not(.m-flat) polygon, -.m-graph g.m-edge.m-danger text, -.m-graph g.m-node.m-danger.m-flat text, -.m-graph g.m-cluster.m-danger text { - fill: #f60000; -} -.m-graph g.m-edge.m-danger polygon, -.m-graph g.m-edge.m-danger path, -.m-graph g.m-node.m-danger ellipse, -.m-graph g.m-node.m-danger polygon, -.m-graph g.m-node.m-danger polyline, -.m-graph g.m-cluster.m-danger polygon { - stroke: #f60000; -} -.m-graph g.m-edge.m-info polygon, -.m-graph g.m-node.m-info:not(.m-flat) ellipse, -.m-graph g.m-node.m-info:not(.m-flat) polygon, -.m-graph g.m-edge.m-info text, -.m-graph g.m-node.m-info.m-flat text, -.m-graph g.m-cluster.m-info text { - fill: #31708f; -} -.m-graph g.m-edge.m-info polygon, -.m-graph g.m-edge.m-info path, -.m-graph g.m-node.m-info ellipse, -.m-graph g.m-node.m-info polygon, -.m-graph g.m-node.m-info polyline, -.m-graph g.m-cluster.m-info polygon { - stroke: #31708f; -} -.m-graph g.m-edge.m-dim polygon, -.m-graph g.m-node.m-dim:not(.m-flat) ellipse, -.m-graph g.m-node.m-dim:not(.m-flat) polygon, -.m-graph g.m-edge.m-dim text, -.m-graph g.m-node.m-dim.m-flat text, -.m-graph g.m-cluster.m-dim text { - fill: #666; -} -.m-graph g.m-edge.m-dim polygon, -.m-graph g.m-edge.m-dim path, -.m-graph g.m-node.m-dim ellipse, -.m-graph g.m-node.m-dim polygon, -.m-graph g.m-node.m-dim polyline, -.m-graph g.m-cluster.m-dim polygon { - stroke: #666; -} -.m-graph g.m-edge.m-param polygon, -.m-graph g.m-node.m-param:not(.m-flat) ellipse, -.m-graph g.m-node.m-param:not(.m-flat) polygon, -.m-graph g.m-edge.m-param text, -.m-graph g.m-node.m-param.m-flat text { - fill: #9ad36a; -} -.m-graph g.m-edge.m-param polygon, -.m-graph g.m-edge.m-param path, -.m-graph g.m-node.m-param ellipse, -.m-graph g.m-node.m-param polygon, -.m-graph g.m-node.m-param polyline, -.m-graph g.m-cluster.m-param polygon { - stroke: #9ad36a; -} -p, -ul, -ol, -dl, -blockquote, -pre, -.m-code-figure, -.m-console-figure, -hr, -.m-note, -.m-frame, -.m-block, -div.m-button, -div.m-scroll, -table.m-table, -div.m-image, -img.m-image, -svg.m-image, -figure.m-figure, -.m-imagegrid, -div.m-math, -div.m-graph, -div.m-plot { - margin-bottom: 1rem; -} -p:last-child, -p.m-nopadb, -ul:last-child, -ul.m-nopadb, -ol:last-child, -ol.m-nopadb, -dl:last-child, -dl.m-nopadb, -blockquote:last-child, -blockquote.m-nopadb, -pre:last-child, -pre.m-nopadb, -.m-code-figure:last-child, -.m-code-figure.m-nopadb, -.m-console-figure:last-child, -.m-console-figure.m-nopadb, -hr:last-child, -hr.m-nopadb, -.m-note:last-child, -.m-note.m-nopadb, -.m-frame:last-child, -.m-frame.m-nopadb, -.m-block:last-child, -.m-block.m-nopadb, -div.m-button:last-child, -div.m-button.m-nopadb, -div.m-scroll:last-child, -div.m-scroll.m-nopadb, -table.m-table:last-child, -table.m-table.m-nopadb, -img.m-image:last-child, -img.m-image.m-nopadb, -svg.m-image:last-child, -svg.m-image.m-nopadb, -div.m-image:last-child, -div.m-image.m-nopadb, -figure.m-figure:last-child, -figure.m-figure.m-nopadb, -.m-imagegrid:last-child, -.m-imagegrid.m-nopadb, -div.m-math:last-child, -div.m-math.m-nopadb, -div.m-graph:last-child, -div.m-graph.m-nopadb, -div.m-plot:last-child, -div.m-plot.m-nopadb { - margin-bottom: 0; -} -li > p:last-child, -li > blockquote:last-child, -li > pre:last-child, -li > .m-code-figure:last-child, -li > .m-console-figure:last-child, -li > .m-note:last-child, -li > .m-frame:last-child, -li > .m-block:last-child, -li > div.m-button:last-child, -li > div.m-scroll:last-child, -li > table.m-table:last-child, -li > img.m-image:last-child, -li > svg.m-image:last-child, -li > div.m-image:last-child, -li > figure.m-figure:last-child, -li > div.m-math:last-child, -li > div.m-graph:last-child, -li > div.m-plot:last-child { - margin-bottom: 1rem; -} -li:last-child > p:last-child, -li:last-child > p.m-nopadb, -li:last-child > blockquote:last-child, -li:last-child > blockquote.m-nopadb, -li:last-child > pre:last-child, -li:last-child > pre.m-nopadb, -li:last-child > .m-code-figure:last-child, -li:last-child > .m-code-figure.m-nopadb, -li:last-child > .m-console-figure:last-child, -li:last-child > .m-console-figure.m-nopadb, -li:last-child > .m-note:last-child, -li:last-child > .m-note.m-nopadb, -li:last-child > .m-frame:last-child, -li:last-child > .m-frame.m-nopadb, -li:last-child > .m-block:last-child, -li:last-child > .m-block.m-nopadb, -li:last-child > div.m-button:last-child, -li:last-child > div.m-button.m-nopadb, -li:last-child > div.m-scroll:last-child, -li:last-child > div.m-scroll.m-nopadb, -li:last-child > table.m-table:last-child, -li:last-child > table.m-table.m-nopadb, -li:last-child > img.m-image:last-child, -li:last-child > img.m-image.m-nopadb, -li:last-child > svg.m-image:last-child, -li:last-child > svg.m-image.m-nopadb, -li:last-child > div.m-image:last-child, -li:last-child > div.m-image.m-nopadb, -li:last-child > figure.m-figure:last-child, -li:last-child > figure.m-figure.m-nopadb, -li:last-child > div.m-math:last-child, -li:last-child > div.m-math.m-nopadb, -li:last-child > div.m-graph:last-child, -li:last-child > div.m-graph.m-nopadb, -li:last-child > div.m-plot:last-child, -li:last-child > div.m-plot.m-nopadb { - margin-bottom: 0; -} - -body > header > nav { - width: 100%; - background-color: #000000; - min-height: 3rem; - font-size: 16px; -} -body > header > nav.m-navbar-landing, -body > header > nav.m-navbar-cover { - background-color: transparent; - position: relative; -} -body > header > nav.m-navbar-landing { - opacity: 0.8; -} -body > header > nav.m-navbar-cover { - background-color: #000000; - opacity: 1; -} -body > header > nav.m-navbar-landing:hover, -body > header > nav.m-navbar-cover:hover { - background-color: #000000; - opacity: 1; -} -body > header > nav.m-navbar-landing:target, -body > header > nav.m-navbar-cover:target { - background-color: #000000; - opacity: 1; -} -body > header > nav.m-navbar-landing #m-navbar-brand.m-navbar-brand-hidden { - visibility: hidden; -} -body - > header - > nav.m-navbar-landing:target - #m-navbar-brand.m-navbar-brand-hidden { - visibility: visible; -} -body > header > nav { - margin-left: auto; - margin-right: auto; - color: #ffffff; -} -body > header > nav a { - text-decoration: none; - text-transform: none; - display: inline-block; - vertical-align: middle; - line-height: 2.75rem; - color: #ffffff; -} -body > header > nav #m-navbar-brand, -body > header > nav a#m-navbar-show, -body > header > nav a#m-navbar-hide { - font-weight: 300; - font-size: 1.125rem; - padding-left: 1rem; - padding-right: 1rem; -} -body > header > nav a#m-navbar-brand, -body > header > nav #m-navbar-brand a { - text-transform: none; -} -body > header > nav a#m-navbar-brand img, -body > header > nav #m-navbar-brand a img { - height: 5rem; - vertical-align: -22.5%; - margin-right: 0.5rem; -} -body > header > nav #m-navbar-brand a { - padding-left: 0; - padding-right: 0; -} -body > header > nav #m-navbar-brand .m-thin { - font-weight: normal; -} -body > header > nav #m-navbar-brand .m-breadcrumb { - color: #bdbdbd; -} -body > header > nav a#m-navbar-show::before, -body > header > nav a#m-navbar-hide::before { - content: "\2630"; -} -body > header > nav #m-navbar-collapse { - padding-bottom: 1rem; -} -body > header > nav #m-navbar-collapse li { - border-style: solid; - border-color: transparent; - border-width: 0 0 0 0.25rem; - margin-left: -1rem; -} -body > header > nav #m-navbar-collapse li a { - border-style: solid; - border-color: transparent; - line-height: 1.5rem; - margin-left: -0.25rem; - padding-left: 0.75rem; - border-width: 0 1px 1px 1px; - width: 100%; -} -body > header > nav #m-navbar-collapse li ol { - border-color: #ddd; -} -body > header > nav #m-navbar-collapse li a#m-navbar-current { - color: #ffffff; - background-color: #000000; - border-color: #000000; -} -body > header > nav #m-navbar-collapse li ol li a#m-navbar-current { - color: #000000; - background-color: #ffffff; - border-color: #ddd; -} -body > header > nav ol { - list-style-type: none; - margin: 0; -} -body > header > nav ol ol { - padding-left: 1.5rem; -} -body > header > nav .m-row > [class*="m-col-"] { - padding-top: 0; - padding-bottom: 0; -} -body > header > nav a:hover, -body > header > nav a:focus, -body > header > nav a:active { - color: #ffffff; -} -body > header > nav #m-navbar-collapse li:hover { - border-color: #ffffff; -} -body > header > nav #m-navbar-collapse li a:hover, -body > header > nav #m-navbar-collapse li a:focus, -body > header > nav #m-navbar-collapse li a:active { - border-color: #ffffff; - background-color: #000000; -} -body > header > nav.m-navbar-landing #m-navbar-collapse li a:hover, -body > header > nav.m-navbar-cover #m-navbar-collapse li a:hover, -body > header > nav.m-navbar-landing #m-navbar-collapse li a:focus, -body > header > nav.m-navbar-cover #m-navbar-collapse li a:focus, -body > header > nav.m-navbar-landing #m-navbar-collapse li a:active, -body > header > nav.m-navbar-cover #m-navbar-collapse li a:active { - background-color: var(--header-link-active-background-color-semi); -} -body > header > nav #m-navbar-hide { - display: none; -} -body > header > nav:target #m-navbar-collapse { - display: block; -} -body > header > nav:target #m-navbar-show { - display: none; -} -body > header > nav:target #m-navbar-hide { - display: inline-block; -} -@media screen and (min-width: 768px) { - body > header > nav #m-navbar-show, - body > header > nav #m-navbar-hide, - body > header > nav:target #m-navbar-show, - body > header > nav:target #m-navbar-hide { - display: none; - } - body > header > nav #m-navbar-collapse li a { - line-height: 2.75rem; - } - body > header > nav a, - body > header > nav #m-navbar-collapse li a { - margin-left: 0; - padding-left: 1rem; - padding-right: 1rem; - white-space: nowrap; - } - body > header > nav #m-navbar-collapse { - padding-bottom: 0; - } - body > header > nav #m-navbar-collapse li ol { - background-color: #000000; - } - body > header > nav #m-navbar-collapse ol ol li { - margin-left: 0; - padding-left: 0; - border-left-width: 0; - } - body > header > nav #m-navbar-collapse ol ol li a { - padding-left: 0.75rem; - color: #000000; - background-color: #ffffff; - border-color: #ddd; - } - body > header > nav #m-navbar-collapse ol ol li a:active { - padding-left: 0.75rem; - color: #ffffff; - background-color: #353535; - border-color: #ddd; - } - body > header > nav #m-navbar-collapse ol ol li a:hover { - padding-left: 0.75rem; - color: #ffffff; - background-color: #353535; - border-color: #ddd; - } - body > header > nav #m-navbar-collapse > .m-row > ol > li { - margin-left: 0; - border-left-width: 0; - } - body > header > nav #m-navbar-collapse > .m-row > ol > li > a { - border-width: 0.25rem 0 0 0; - } - body > header > nav #m-navbar-collapse ol { - padding-left: 0; - padding-right: 0; - } - body > header > nav #m-navbar-collapse > .m-row > ol, - body > header > nav #m-navbar-collapse > .m-row > ol > li { - float: left; - } - body > header > nav #m-navbar-collapse ol ol { - z-index: 99999; - position: absolute; - visibility: hidden; - } - body > header > nav #m-navbar-collapse li:hover ol { - visibility: visible; - } -} -body > footer { - width: 100%; -} -body > footer > nav { - padding-top: 1rem; - padding-bottom: 1rem; - font-size: 0.85rem; - text-align: center; - color: #777777; - background-color: #353535; -} -body > footer > nav h3, -body > footer > nav h3 a { - text-transform: capitalize; - font-weight: normal; -} -body > footer > nav ul { - list-style-type: none; - padding: 0; - margin: 0; -} -body > footer > nav a { - text-decoration: none; - text-transform: none; - color: #999; -} -body > footer > nav a:hover, -body > footer > nav a:focus, -body > footer > nav a:active { - color: #494949; -} -body > main { - padding-top: 1rem; - padding-bottom: 1rem; -} -article h1 { - font-size: 1.75rem; -} -article h1 .m-breadcrumb { - color: #666; - font-weight: normal; - font-size: 16px; - padding-top: 8px; - padding-bottom: 8px; -} -article h1 .m-breadcrumb a { - color: #26a9e0; -} -article h1 .m-breadcrumb a:hover, -article h1 a:focus, -article h1 a:active { - color: #26a9e0; -} -article hr { - width: 75%; - border-width: 2px 0 0 0; - border-style: solid; - border-color: #92d050; - margin: auto; -} -article section hr { - width: 50%; - border-width: 1px 0 0 0; - border-style: solid; - border-color: #ddd; - margin: auto; - padding-top: 5px; - padding-bottom: 10px; -} -article > header h1 { - font-size: 2rem; - margin-bottom: 0.5rem; -} -article h1 a, -article > header h1, -article > header h1 a, -article section > h2, -article section > h2 a, -article section > h3, -article section > h3 a, -article section > h4, -article section > h4 a, -article section > h5, -article section > h5 a, -article section > h6, -article section > h6 a { - color: #000000; -} -article h1 a:hover, -article > header h1 a:hover, -article > header h1 a:focus, -article > header h1 a:active, -article section > h2 a:hover, -article section > h2 a:focus, -article section > h2 a:active, -article section > h3 a:hover, -article section > h3 a:focus, -article section > h3 a:active, -article section > h4 a:hover, -article section > h4 a:focus, -article section > h4 a:active, -article section > h5 a:hover, -article section > h5 a:focus, -article section > h5 a:active, -article section > h6 a:hover, -article section > h6 a:focus, -article section > h6 a:active { - color: #000000; -} -article > header .m-date { - display: block; - width: 2.5rem; - float: left; - text-align: center; - line-height: 95%; - font-size: 0.75rem; - font-weight: normal; - white-space: nowrap; - border-right-style: solid; - border-right-width: 0.125rem; - border-color: #000000; - padding-right: 0.75rem; - margin-top: -0.1rem; - margin-right: 0.75rem; - margin-bottom: 0.25rem; -} -article > header .m-date-day { - display: block; - font-weight: bold; - padding-top: 0.2rem; - padding-bottom: 0.15rem; - font-size: 1.25rem; -} -article > header p { - color: #7a7a7a; - font-size: 1.125rem; -} -article > header h1::after { - content: " "; - clear: both; - display: table; -} -article > footer { - color: #969696; -} -article > footer p { - font-style: italic; - font-size: 0.85rem; - text-indent: 0; -} -article h1 a, -article > header h1 a, -article section > h2 a, -article section > h3 a, -article section > h4 a, -article section > h5 a, -article section > h6 a { - text-decoration: none; -} -#m-landing-image, -#m-cover-image, -article#m-jumbo > header #m-jumbo-image { - background-size: cover; - background-color: #666666; - background-position: center center; - background-repeat: no-repeat; - margin-top: -4rem; - padding-top: 5rem; -} -#m-landing-image { - color: #ffffff; -} -#m-cover-image { - height: 30rem; - margin-bottom: -26rem; -} -#m-landing-cover h1 { - font-size: 2.8rem; - margin-top: -0.5rem; - padding-left: 1.5rem; - padding-bottom: 1rem; - text-transform: capitalize; -} -#m-landing-cover { - padding-bottom: 10rem; - margin-bottom: -6rem; -} -article#m-jumbo { - margin-top: -1rem; -} -#m-landing-cover, -#m-cover-image > div, -article#m-jumbo > header #m-jumbo-cover { - background: linear-gradient( - transparent 0%, - transparent 50%, - #e8e8e8 100% - ); - width: 100%; - height: 100%; -} -article#m-jumbo > header h1, -article#m-jumbo > header h2 { - text-align: center; - font-weight: bold; -} -article#m-jumbo > header a { - text-decoration: none; -} -article#m-jumbo > header #m-jumbo-cover { - padding-bottom: 5rem; -} -article#m-jumbo > header #m-jumbo-image { - font-size: 2.5vmin; - margin-bottom: -3rem; -} -article#m-jumbo > header h1 { - font-size: 10vmin; -} -article#m-jumbo > header h2 { - font-size: 3vmin; -} -@media screen and (max-height: 640px), screen and (max-width: 640px) { - article#m-jumbo > header h1 { - font-size: 3rem; - } - article#m-jumbo > header #m-jumbo-image, - article#m-jumbo > header h2 { - font-size: 1rem; - } -} -article#m-jumbo > header, -article#m-jumbo > header h1, -article#m-jumbo > header a { - color: #ffffff; -} -article#m-jumbo > header a:hover, -article#m-jumbo > header a:focus, -article#m-jumbo > header a:active { - color: #f0f0f0; -} -article#m-jumbo.m-inverted > header, -article#m-jumbo.m-inverted > header h1, -article#m-jumbo.m-inverted > header a { - color: #000000; -} -article#m-jumbo.m-inverted > header a:hover, -article#m-jumbo.m-inverted > header a:focus, -article#m-jumbo.m-inverted > header a:active { - color: #0f0f0f; -} -.m-landing-news h3 a { - color: #000000; - text-decoration: none; - text-transform: capitalize; -} -.m-landing-news h3 a:hover, -.m-landing-news h3 a:hover, -.m-landing-news h3 a:focus, -.m-landing-news h3 a:active { - color: #000000; -} -.m-landing-news time { - display: inline-block; - margin-left: 1rem; - float: right; -} -.m-article-pagination { - text-align: center; - padding: 1rem; -} -nav.m-navpanel { - text-align: center; -} -nav.m-navpanel h3 { - text-transform: capitalize; - font-weight: normal; -} -nav.m-navpanel ol { - text-transform: capitalize; -} -nav.m-navpanel ol, -nav.m-navpanel ul { - list-style-type: none; - padding: 0; -} -nav.m-navpanel a { - color: #292929; - text-decoration: none; -} -nav.m-navpanel a:hover, -nav.m-navpanel a:focus, -nav.m-navpanel a:active { - color: #cb4b16; -} -ul.m-tagcloud li { - display: inline; -} -ul.m-tagcloud li.m-tag-1 { - font-size: 0.75rem; -} -ul.m-tagcloud li.m-tag-2 { - font-size: 0.825rem; -} -ul.m-tagcloud li.m-tag-3 { - font-size: 1rem; -} -ul.m-tagcloud li.m-tag-4 { - font-size: 1.25rem; -} -ul.m-tagcloud li.m-tag-5 { - font-size: 1.5rem; -} -article section:target figure.m-code-figure, -article section:target figure.m-console-figure { - z-index: 1; -} -article, -article > header, -article section { - margin-bottom: 1rem; -} -article:last-child, -article section:last-child { - margin-bottom: 0; -} -.m-container-inflatable section:target > .m-note, -.m-container-inflatable section:target > .m-frame, -.m-container-inflatable section:target > .m-block, -.m-container-inflatable section:target > pre, -.m-container-inflatable section:target > .m-code-figure > pre:first-child, -.m-container-inflatable section:target > .m-console-figure > pre:first-child, -.m-container-inflatable section:target section > .m-note, -.m-container-inflatable section:target section > .m-frame, -.m-container-inflatable section:target section > .m-block, -.m-container-inflatable section:target section > pre, -.m-container-inflatable - section:target - section - > .m-code-figure - > pre:first-child, -.m-container-inflatable - section:target - section - > .m-console-figure - > pre:first-child, -.m-container-inflatable section:target [class*="m-center-"] > .m-note, -.m-container-inflatable section:target [class*="m-center-"] > .m-frame, -.m-container-inflatable section:target [class*="m-center-"] > .m-block, -.m-container-inflatable section:target [class*="m-center-"] > pre, -.m-container-inflatable - section:target - [class*="m-center-"] - > .m-code-figure - > pre:first-child, -.m-container-inflatable - section:target - [class*="m-center-"] - > .m-console-figure - > pre:first-child, -.m-container-inflatable section:target [class*="m-left-"] > .m-note, -.m-container-inflatable section:target [class*="m-left-"] > .m-frame, -.m-container-inflatable section:target [class*="m-left-"] > .m-block, -.m-container-inflatable section:target [class*="m-left-"] > pre, -.m-container-inflatable - section:target - [class*="m-left-"] - > .m-code-figure - > pre:first-child, -.m-container-inflatable - section:target - [class*="m-left-"] - > .m-console-figure - > pre:first-child, -.m-container-inflatable section:target [class*="m-right-"] > .m-note, -.m-container-inflatable section:target [class*="m-right-"] > .m-frame, -.m-container-inflatable section:target [class*="m-right-"] > .m-block, -.m-container-inflatable section:target [class*="m-right-"] > pre, -.m-container-inflatable - section:target - [class*="m-right-"] - > .m-code-figure - > pre:first-child, -.m-container-inflatable - section:target - [class*="m-right-"] - > .m-console-figure - > pre:first-child, -.m-container-inflatable section:target .m-container-inflate > .m-note, -.m-container-inflatable section:target .m-container-inflate > .m-frame, -.m-container-inflatable section:target .m-container-inflate > .m-block, -.m-container-inflatable section:target .m-container-inflate > pre, -.m-container-inflatable - section:target - .m-container-inflate - > .m-code-figure - > pre:first-child, -.m-container-inflatable - section:target - .m-container-inflate - > .m-console-figure - > pre:first-child { - margin-left: -1rem; - border-left-style: solid; - border-left-width: 0.25rem; - border-top-left-radius: 0; - border-bottom-left-radius: 0; - padding-left: 0.75rem; -} -.m-container-inflatable section:target > .m-code-figure::before, -.m-container-inflatable section:target > .m-console-figure::before, -.m-container-inflatable section:target section > .m-code-figure::before, -.m-container-inflatable section:target section > .m-console-figure::before, -.m-container-inflatable - section:target - [class*="m-center-"] - > .m-code-figure::before, -.m-container-inflatable - section:target - [class*="m-center-"] - > .m-console-figure::before, -.m-container-inflatable - section:target - [class*="m-left-"] - > .m-code-figure::before, -.m-container-inflatable - section:target - [class*="m-left-"] - > .m-console-figure::before, -.m-container-inflatable - section:target - [class*="m-right-"] - > .m-code-figure::before, -.m-container-inflatable - section:target - [class*="m-right-"] - > .m-console-figure::before, -.m-container-inflatable - section:target - .m-container-inflate - > .m-code-figure::before, -.m-container-inflatable - section:target - .m-container-inflate - > .m-console-figure::before { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - border-left-width: 0.25rem; -} -.m-container-inflatable section:target > .m-code-figure > pre.m-nopad, -.m-container-inflatable section:target > .m-console-figure > pre.m-nopad { - margin-left: -0.75rem; - padding-left: -0.75rem; -} -@media screen and (min-width: 576px) { - .m-container-inflatable section:target .m-center-s > .m-note, - .m-container-inflatable section:target .m-center-s > pre, - .m-container-inflatable - section:target - .m-center-s - > figure.m-code-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-center-s - > figure.m-console-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-right-s - > figure.m-code-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-right-s - > figure.m-console-figure - > pre:first-child { - border-left-width: 0; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding-left: 1rem; - } - .m-container-inflatable section:target .m-center-s > .m-block, - .m-container-inflatable section:target .m-right-s > .m-block { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - } - .m-container-inflatable section:target .m-center-s > .m-frame, - .m-container-inflatable section:target .m-right-s > .m-frame { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left-width: 0.125rem; - padding-left: 0.875rem; - } - .m-container-inflatable section:target .m-right-s > .m-block, - .m-container-inflatable section:target .m-right-s > .m-frame { - margin-left: 0; - } - .m-container-inflatable section:target .m-right-s > .m-note, - .m-container-inflatable section:target .m-right-s > pre { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - margin-left: 0; - border-left-width: 0; - padding-left: 1rem; - } - .m-container-inflatable - section:target - .m-center-s - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-center-s - > figure.m-console-figure::before, - .m-container-inflatable - section:target - .m-right-s - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-right-s - > figure.m-console-figure::before { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left-width: 0.125rem; - } -} -@media screen and (min-width: 768px) { - .m-container-inflatable section:target .m-center-m > .m-note, - .m-container-inflatable section:target .m-center-m > pre, - .m-container-inflatable - section:target - .m-center-m - > figure.m-code-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-center-m - > figure.m-console-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-right-m - > figure.m-code-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-right-m - > figure.m-console-figure - > pre:first-child { - border-left-width: 0; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding-left: 1rem; - } - .m-container-inflatable section:target .m-center-m > .m-block, - .m-container-inflatable section:target .m-right-m > .m-block { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - } - .m-container-inflatable section:target .m-center-m > .m-frame, - .m-container-inflatable section:target .m-right-m > .m-frame { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left-width: 0.125rem; - padding-left: 0.875rem; - } - .m-container-inflatable section:target .m-right-m > .m-block, - .m-container-inflatable section:target .m-right-m > .m-frame { - margin-left: 0; - } - .m-container-inflatable section:target .m-right-m > .m-note, - .m-container-inflatable section:target .m-right-m > pre { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - margin-left: 0; - border-left-width: 0; - padding-left: 1rem; - } - .m-container-inflatable - section:target - .m-center-m - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-center-m - > figure.m-console-figure::before, - .m-container-inflatable - section:target - .m-right-m - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-right-m - > figure.m-console-figure::before { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left-width: 0.125rem; - } -} -@media screen and (min-width: 992px) { - .m-container-inflatable section:target .m-center-l > .m-note, - .m-container-inflatable section:target .m-center-l > pre, - .m-container-inflatable - section:target - .m-center-l - > figure.m-code-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-center-l - > figure.m-console-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-right-l - > figure.m-code-figure - > pre:first-child, - .m-container-inflatable - section:target - .m-right-l - > figure.m-console-figure - > pre:first-child { - border-left-width: 0; - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - padding-left: 1rem; - } - .m-container-inflatable section:target .m-center-l > .m-block, - .m-container-inflatable section:target .m-right-l > .m-block { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - } - .m-container-inflatable section:target .m-center-l > .m-frame, - .m-container-inflatable section:target .m-right-l > .m-frame { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left-width: 0.125rem; - padding-left: 0.875rem; - } - .m-container-inflatable section:target .m-right-l > .m-block, - .m-container-inflatable section:target .m-right-l > .m-frame { - margin-left: 0; - } - .m-container-inflatable section:target .m-right-l > .m-note, - .m-container-inflatable section:target .m-right-l > pre { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - margin-left: 0; - border-left-width: 0; - padding-left: 1rem; - } - .m-container-inflatable - section:target - .m-center-l - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-center-l - > figure.m-console-figure::before, - .m-container-inflatable - section:target - .m-right-l - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-right-l - > figure.m-console-figure::before { - border-top-left-radius: 0px; - border-bottom-left-radius: 0px; - border-left-width: 0.125rem; - } -} -.m-container-inflatable section:target > figure.m-code-figure::before, -.m-container-inflatable section:target > figure.m-console-figure::before, -.m-container-inflatable section:target section > figure.m-code-figure::before, -.m-container-inflatable - section:target - section - > figure.m-console-figure::before, -.m-container-inflatable - section:target - [class*="m-center-"] - > figure.m-code-figure::before, -.m-container-inflatable - section:target - [class*="m-center-"] - > figure.m-console-figure::before, -.m-container-inflatable - section:target - [class*="m-left-"] - > figure.m-code-figure::before, -.m-container-inflatable - section:target - [class*="m-left-"] - > figure.m-console-figure::before, -.m-container-inflatable - section:target - [class*="m-right-"] - > figure.m-code-figure::before, -.m-container-inflatable - section:target - [class*="m-right-"] - > figure.m-console-figure::before, -.m-container-inflatable - section:target - .m-container-inflatable - > figure.m-code-figure::before, -.m-container-inflatable - section:target - .m-container-inflatable - > figure.m-console-figure::before { - border-left-color: #ddd; -} -@media screen and (min-width: 576px) { - .m-container-inflatable - section:target - .m-center-s - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-right-s - > figure.m-code-figure::before { - border-color: #f7f7f7; - } - .m-container-inflatable - section:target - .m-center-s - > figure.m-console-figure::before, - .m-container-inflatable - section:target - .m-right-s - > figure.m-console-figure::before { - border-color: #f7f7f7; - } -} -@media screen and (min-width: 768px) { - .m-container-inflatable - section:target - .m-center-m - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-right-m - > figure.m-code-figure::before { - border-color: #f7f7f7; - } - .m-container-inflatable - section:target - .m-center-m - > figure.m-console-figure::before, - .m-container-inflatable - section:target - .m-right-m - > figure.m-console-figure::before { - border-color: #f7f7f7; - } -} -@media screen and (min-width: 992px) { - .m-container-inflatable - section:target - .m-center-l - > figure.m-code-figure::before, - .m-container-inflatable - section:target - .m-right-l - > figure.m-code-figure::before { - border-color: #f7f7f7; - } - .m-container-inflatable - section:target - .m-center-l - > figure.m-console-figure::before, - .m-container-inflatable - section:target - .m-right-l - > figure.m-console-figure::before { - border-color: #f7f7f7; - } -} -.m-container-inflatable section:target pre, -.m-container-inflatable section:target figure.m-code-figure > pre:first-child, -.m-container-inflatable - section:target - figure.m-console-figure - > pre:first-child { - border-color: #ddd; -} -.m-container-inflatable section:target .m-note.m-default { - border-color: #ddd; -} -.m-container-inflatable section:target .m-note.m-primary { - border-color: #31708f; -} -.m-container-inflatable section:target .m-note.m-success { - border-color: #9ad36a; -} -.m-container-inflatable section:target .m-note.m-warning { - border-color: #f9cf79; -} -.m-container-inflatable section:target .m-note.m-danger { - border-color: #f60000; -} -.m-container-inflatable section:target .m-note.m-info { - border-color: #31708f; -} -.m-container-inflatable section:target .m-note.m-dim { - border-color: #666; -} - -.m-code .c { - color: #95a5a6; -} -.m-code .err { - color: #a61717; -} -.m-code .k { - color: #728e00; -} -.m-code .n { - color: #434f54; -} -.m-code .o { - color: #728e00; -} -.m-code .ch { - color: #95a5a6; -} -.m-code .cm { - color: #95a5a6; -} -.m-code .cp { - color: #728e00; -} -.m-code .cpf { - color: #95a5a6; -} -.m-code .c1 { - color: #95a5a6; -} -.m-code .cs { - color: #95a5a6; -} -.m-code .kc { - color: #00979d; -} -.m-code .kd { - color: #728e00; -} -.m-code .kn { - color: #728e00; -} -.m-code .kp { - color: #00979d; -} -.m-code .kr { - color: #00979d; -} -.m-code .kt { - color: #00979d; -} -.m-code .m { - color: #8a7b52; -} -.m-code .s { - color: #7f8c8d; -} -.m-code .na { - color: #434f54; -} -.m-code .nb { - color: #728e00; -} -.m-code .nc { - color: #434f54; -} -.m-code .no { - color: #434f54; -} -.m-code .nd { - color: #434f54; -} -.m-code .ni { - color: #434f54; -} -.m-code .ne { - color: #434f54; -} -.m-code .nf { - color: #d35400; -} -.m-code .nl { - color: #434f54; -} -.m-code .nn { - color: #434f54; -} -.m-code .nx { - color: #728e00; -} -.m-code .py { - color: #434f54; -} -.m-code .nt { - color: #434f54; -} -.m-code .nv { - color: #434f54; -} -.m-code .ow { - color: #728e00; -} -.m-code .mb { - color: #8a7b52; -} -.m-code .mf { - color: #8a7b52; -} -.m-code .mh { - color: #8a7b52; -} -.m-code .mi { - color: #8a7b52; -} -.m-code .mo { - color: #8a7b52; -} -.m-code .sa { - color: #7f8c8d; -} -.m-code .sb { - color: #7f8c8d; -} -.m-code .sc { - color: #7f8c8d; -} -.m-code .dl { - color: #7f8c8d; -} -.m-code .sd { - color: #7f8c8d; -} -.m-code .s2 { - color: #7f8c8d; -} -.m-code .se { - color: #7f8c8d; -} -.m-code .sh { - color: #7f8c8d; -} -.m-code .si { - color: #7f8c8d; -} -.m-code .sx { - color: #7f8c8d; -} -.m-code .sr { - color: #7f8c8d; -} -.m-code .s1 { - color: #7f8c8d; -} -.m-code .ss { - color: #7f8c8d; -} -.m-code .bp { - color: #728e00; -} -.m-code .fm { - color: #d35400; -} -.m-code .vc { - color: #434f54; -} -.m-code .vg { - color: #434f54; -} -.m-code .vi { - color: #434f54; -} -.m-code .vm { - color: #434f54; -} -.m-code .il { - color: #8a7b52; -} - -.m-console .hll { background-color: #ffffcc } -.m-console .g-AnsiBackgroundBlack { background-color: #232627 } -.m-console .g-AnsiBackgroundBlue { background-color: #1d99f3 } -.m-console .g-AnsiBackgroundBrightBlack { background-color: #7f8c8d } -.m-console .g-AnsiBackgroundBrightBlue { background-color: #3daee9 } -.m-console .g-AnsiBackgroundBrightCyan { background-color: #16a085 } -.m-console .g-AnsiBackgroundBrightGreen { background-color: #1cdc9a } -.m-console .g-AnsiBackgroundBrightMagenta { background-color: #8e44ad } -.m-console .g-AnsiBackgroundBrightRed { background-color: #c0392b } -.m-console .g-AnsiBackgroundBrightWhite { background-color: #ffffff } -.m-console .g-AnsiBackgroundBrightYellow { background-color: #fdbc4b } -.m-console .g-AnsiBackgroundCyan { background-color: #1abc9c } -.m-console .g-AnsiBackgroundDefault { background-color: #fcfcfc } -.m-console .g-AnsiBackgroundGreen { background-color: #11d116 } -.m-console .g-AnsiBackgroundMagenta { background-color: #9b59b6 } -.m-console .g-AnsiBackgroundRed { background-color: #ed1515 } -.m-console .g-AnsiBackgroundWhite { background-color: #fcfcfc } -.m-console .g-AnsiBackgroundYellow { background-color: #f67400 } -.m-console .g-AnsiBlack { color: #232627 } -.m-console .g-AnsiBlue { color: #1d99f3 } -.m-console .g-AnsiBrightBlack { color: #7f8c8d; font-weight: bold } -.m-console .g-AnsiBrightBlue { color: #3daee9; font-weight: bold } -.m-console .g-AnsiBrightCyan { color: #16a085; font-weight: bold } -.m-console .g-AnsiBrightDefault { color: #ffffff; font-weight: bold } -.m-console .g-AnsiBrightGreen { color: #1cdc9a; font-weight: bold } -.m-console .g-AnsiBrightMagenta { color: #8e44ad; font-weight: bold } -.m-console .g-AnsiBrightRed { color: #c0392b; font-weight: bold } -.m-console .g-AnsiBrightWhite { color: #ffffff; font-weight: bold } -.m-console .g-AnsiBrightYellow { color: #fdbc4b; font-weight: bold } -.m-console .g-AnsiCyan { color: #1abc9c } -.m-console .g-AnsiDefault { color: #fcfcfc } -.m-console .g-AnsiGreen { color: #11d116 } -.m-console .g-AnsiMagenta { color: #9b59b6 } -.m-console .g-AnsiRed { color: #ed1515 } -.m-console .g-AnsiWhite { color: #fcfcfc } -.m-console .g-AnsiYellow { color: #f67400 } -.m-console .go { color: #fcfcfc } -.m-console .gp { color: #16a085; font-weight: bold } -.m-console .w { color: #fcfcfc } - -a.m-doc, -a.m-doc-self, -a.m-doc-external, -ul.m-doc li.m-doc-expansible > a:first-child, -ul.m-doc li.m-doc-collapsible > a:first-child, -.m-code.m-inverted.m-doc-include > a { - text-decoration: none; -} -a.m-doc, -a.m-doc-self { - font-weight: bold; -} -.m-thin a.m-doc, -.m-thin a.m-doc-self { - font-weight: normal; -} -ul.m-doc li.m-doc-expansible > a:first-child, -ul.m-doc li.m-doc-collapsible > a:first-child, -ul.m-doc li.m-doc-expansible > a:first-child:hover, -ul.m-doc li.m-doc-expansible > a:first-child:focus, -ul.m-doc li.m-doc-expansible > a:first-child:active, -ul.m-doc li.m-doc-collapsible > a:first-child:hover, -ul.m-doc li.m-doc-collapsible > a:first-child:focus, -ul.m-doc li.m-doc-collapsible > a:first-child:active { - color: #000000; -} -a.m-doc-self, -ul.m-doc li.m-doc-expansible > a:first-child::before, -ul.m-doc li.m-doc-collapsible > a:first-child::before { - color: #26a9e0; -} -a.m-doc-self:hover, -a.m-doc-self:focus, -a.m-doc-self:active, -ul.m-doc li.m-doc-expansible > a:first-child:hover::before, -ul.m-doc li.m-doc-expansible > a:first-child:focus::before, -ul.m-doc li.m-doc-expansible > a:first-child:active::before, -ul.m-doc li.m-doc-collapsible > a:first-child:hover::before, -ul.m-doc li.m-doc-collapsible > a:first-child:focus::before, -ul.m-doc li.m-doc-collapsible > a:first-child:active::before { - color: #26a9e0; -} -h3 a.m-doc-external { - font-weight: normal; -} -span.m-doc-wrap-bumper { - margin-right: -1rem; - display: inline-block; - vertical-align: text-top; -} -span.m-doc-wrap { - padding-left: 1rem; - display: inline-block; - vertical-align: text-top; - white-space: pre-line; - max-width: 100%; -} -dl.m-doc dd { - margin-bottom: 0.5rem; -} -dl.m-doc dd { - margin-left: 0; - padding-left: 2.5rem; -} -ul.m-doc { - list-style: none; - margin-left: 1.0375rem; - padding-left: 0.9rem; - border-left-color: #ddd; - border-left-width: 0.0625rem; - border-left-style: solid; -} -ul.m-doc li { - text-indent: -1rem; - padding-left: 1rem; -} -ul.m-doc li.m-doc-expansible > ul { - display: none; -} -ul.m-doc li.m-doc-expansible, -ul.m-doc li.m-doc-collapsible { - padding-left: 0.6rem; -} -ul.m-doc li.m-doc-expansible > ul.m-doc, -ul.m-doc li.m-doc-collapsible > ul.m-doc { - margin-left: 0.5rem; -} -ul.m-doc li.m-doc-expansible > a:first-child::before, -ul.m-doc li.m-doc-collapsible > a:first-child::before { - background-color: #e8e8e8; - display: inline-block; - width: 0.4rem; - font-weight: bold; -} -ul.m-doc li.m-doc-expansible > a:first-child::before { - content: '+'; -} -ul.m-doc li.m-doc-collapsible > a:first-child::before { - content: '-'; -} -h1 .m-doc-template, -h1 .m-doc-include { - font-size: 1.3rem; - font-weight: normal; - float: right; -} -h1 .m-doc-include:last-child { - margin-bottom: -0.5rem; -} -h3 .m-doc-template, -h3 .m-doc-include { - font-size: 1rem; - font-weight: normal; -} -.m-doc-template, -dl.m-doc dd, -ul.m-doc li > span.m-doc { - color: #666; -} -dl.m-doc dd svg.m-math, -ul.m-doc li > span.m-doc svg.m-math { - fill: #666; -} -.m-doc-template a, -dl.m-doc dd a, -ul.m-doc li > span.m-doc a { - color: #949494; -} -.m-doc-template a:hover, -.m-doc-template a:focus, -.m-doc-template a:active, -dl.m-doc dd a:hover, -dl.m-doc dd a:focus, -dl.m-doc dd a:active, -ul.m-doc li > span.m-doc a:hover, -ul.m-doc li > span.m-doc a:focus, -ul.m-doc li > span.m-doc a:active { - color: #949494; -} -.m-code.m-inverted.m-doc-include > a:link, -.m-code.m-inverted.m-doc-include > a:visited { - opacity: 0.6666; -} -.m-code.m-inverted.m-doc-include > a:hover, -.m-code.m-inverted.m-doc-include > a:focus, -.m-code.m-inverted.m-doc-include > a:active { - opacity: 1; -} -article section.m-doc-details > div { - margin-top: 0; - margin-left: 0; - margin-right: 0; - position: relative; - padding: 1rem; -} -article section.m-doc-details > div::before { - position: absolute; - content: ' '; - top: 0; - bottom: 0; - left: 0; - right: 0; - z-index: -1; - border-style: solid; - border-width: 0.125rem; - border-radius: 0px; - border-color: #f7f7f7; -} -article section.m-doc-details > div > h3:first-child { - position: relative; - margin: -1rem -1rem 1rem -1rem; - padding: 0.5rem 1rem; - background-color: #ffffff; - border-top-left-radius: 0px; - border-top-right-radius: 0px; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; - border-style: solid; - border-width: 2px; - border-color: rgba(91, 91, 91, 0.33); -} -article section.m-doc-details:target { - border-color: transparent; -} -article section.m-doc-details:target > div { - z-index: 1; -} -.m-container-inflatable > .m-row > [class*='m-col-'] section.m-doc-details > div { - margin-left: -1rem; - margin-right: -1rem; -} -#m-search-button { - color: #fff; - margin-left: 30px; - cursor: pointer; - font-size: 18px; - line-height: 1; - padding: 30.5px 0; -} -#m-search-button:before { - font-family: 'FontAwesome'; - content: '\f002'; -} -a.m-doc-search-icon { - padding-left: 1rem; - padding-right: 1rem; -} -a.m-doc-search-icon svg { - fill: #ffffff; -} -body > header > nav #m-navbar-collapse a.m-doc-search-icon svg { - vertical-align: -5%; -} -a.m-doc-search-icon:focus svg, -a.m-doc-search-icon:hover svg, -a.m-doc-search-icon:active svg { - fill: #ffffff; -} -.m-doc-search { - display: none; - z-index: 10; - position: fixed; - left: 0; - right: 0; - top: 110px; - bottom: 0; - background-color: #e8e8e8; -} -.m-doc-search:target { - display: block; -} -.m-doc-search > a { - display: block; - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; -} -.m-doc-search-header { - margin-top: 2.5rem; - padding: 0.5rem 1rem; - height: 2rem; -} -.m-doc-search-header > div:first-child { - float: right; -} -.m-doc-search-content { - background-color: #ffffff; - border-radius: 0px; - padding: 1rem; -} -.m-doc-search input { - width: 100%; - height: 3rem; - font-size: 1.2rem; - border-width: 0; - color: #000000; - background-color: #e8e8e8; - border-radius: 0px; - margin-bottom: 1rem; - padding: 0 1rem; -} -.m-doc-search #search-notfound { - display: none; -} -.m-doc-search ul#search-results { - list-style-type: none; - padding-left: 0; - max-height: calc(100vh - 12.5rem); - overflow-y: auto; - display: none; -} -.m-doc-search ul#search-results li a { - display: block; - padding-left: 1rem; - padding-right: 1rem; - text-decoration: none; - width: 100%; - line-height: 1.5rem; - color: #000000; -} -.m-doc-search ul#search-results li a > div { - white-space: nowrap; - overflow: hidden; -} -.m-doc-search ul#search-results li a > div:not(.m-doc-search-alias) { - direction: rtl; -} -.m-doc-search ul#search-results li a .m-label { - float: right; - line-height: 1rem; - margin-top: 0.1rem; - margin-left: 0.25rem; -} -.m-doc-search ul#search-results li a .m-label.m-flat { - margin-right: -0.75rem; -} -.m-doc-search ul#search-results li#search-current a { - background-color: transparent; -} -.m-doc-search ul#search-results li#search-current.m-doc-search-copied a { - background-color: transparent; -} -.m-doc-search-typed { - color: #26a9e0; -} -.m-doc-search input[type='search'] { - -webkit-appearance: textfield; -} -.m-doc-search input[type='search']::-webkit-search-decoration, -.m-doc-search input[type='search']::-webkit-search-cancel-button, -.m-doc-search input[type='search']::-webkit-search-results-button, -.m-doc-search input[type='search']::-webkit-search-results-decoration { - display: none; -} diff --git a/docs/markdown_prefilter.py b/docs/markdown_prefilter.py deleted file mode 100644 index 2ab05e26f..000000000 --- a/docs/markdown_prefilter.py +++ /dev/null @@ -1,355 +0,0 @@ -#!/usr/bin/env python -#%% -import enum -import fileinput -import re -import sys -import string - -# a helper function to go from snake back to camel -def snake_to_camel(snake_str): - components = snake_str.strip().split("_") - # We capitalize the first letter of each component except the first one - # with the 'title' method and join them together. - camel_str = components[0] + "".join(x.title() for x in components[1:]) - if camel_str.startswith("_"): - return camel_str[1:] - else: - return camel_str - - -def camel_to_snake(name): - name = name.strip().replace(" ", "_") - name = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name.strip()) - return re.sub("([a-z0-9])([A-Z])", r"\1_\2", name).lower() - - -def github_slugify(name): - return ( - name.strip() - .lower() - .replace( - "-", " " - ) # convert dashes to spaces so they don't get lost with other punctuation - .translate(str.maketrans("", "", string.punctuation)) - .replace(" ", " ") - .replace(" ", " ") - .replace(" ", "-") - ) - - -# Add a start comment to make the entire markdown file function as a comment block -# Without this doxygen sometimes recognizes its own special commands, but mostly doesn't -# Not needed anymore with doxygen 1.9.3? -# try: -# sys.stdout.buffer.write("\n/**\n".encode("utf-8")) -# except Exception as e: -# print("\n*/\n\n") - -#%% -print_me = True -skip_me = False -i = 1 - -# when testing use: -# with fileinput.FileInput("..\\ChangeLog.md", -# openhook=fileinput.hook_encoded("utf-8", "surrogateescape") -# ) as input: - -with fileinput.FileInput( - openhook=fileinput.hook_encoded("utf-8", "surrogateescape") -) as input: - for line in input: - if input.isfirstline(): - # Get the file name and directory - # We'll use this to create the section id comment - file_name_dir = input.filename() - if "\\" in file_name_dir: - seper = "\\" - else: - seper = "/" - # sys.stdout.buffer.write("Separator: '{}'\n".format(seper).encode("utf-8")) - file_dir = file_name_dir.rsplit(sep=seper, maxsplit=1)[0] - file_name_ext = file_name_dir.rsplit(sep=seper, maxsplit=1)[1] - file_name = file_name_ext.rsplit(sep=".", maxsplit=1)[0] - file_ext = file_name_ext.rsplit(sep=".", maxsplit=1)[1] - # sys.stdout.buffer.write( - # "File Directory: {}, File Name: {}, File Extension: {}\n".format( - # file_dir, file_name, file_ext - # ).encode("utf-8") - # ) - # For the example walk-throughs, written in the ReadMe files, - # we want the example name, which is part of the directory. - if "examples" in file_dir and file_name == "ReadMe": - file_name = "example_" + file_dir.rsplit(sep=seper, maxsplit=1)[-1] - - # print(i, print_me, skip_me, line) - - # I'm using these comments to fence off content that is only intended for - # github mardown rendering - if "[//]: # ( Start GitHub Only )" in line: - print_me = False - - # copy the original line to work with - massaged_line = line - # Convert markdown comment tags to c++/dox style comment tags - massaged_line = re.sub(r"\[//\]: # \( @(\w+?.*) \)", r"@\1", massaged_line) - # allow thank you tags - massaged_line = massaged_line.replace("thanks to @", r"thanks to \@") - - # Convert GitHub pages url's to refs - # I'm putting the long URL in the markdown because I want the links there to - # work and go to the pages. But when feeding it to Doxygen, I want them to be - # ref's so Doxygen will both check the existence of the refs and create new - # links for them. - - # For links to sections, doxygen cuts off the first letter of the section name - # in the examples (UGH), so some acrobatics to find them - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/[\w/-]+\.html#enu_walk_(?P[\w/-]+)", - r"@ref menu_walk_\g", - massaged_line, - ) - # for classes, we need to switch camel and snake cases - class_link = re.search( - r"https://envirodiy.github.io/ModularSensors/(?:class)(?P[\w/-]+)\.html", - massaged_line, - ) - if class_link is not None: - camel_link = snake_to_camel(class_link.group("class_link")) - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/(?:class)(?P[\w/-]+)\.html", - r"@ref #" + camel_link, - massaged_line, - ) - # for groups, we need to clean out extra underscores - group_link = re.search( - r"https://envirodiy.github.io/ModularSensors/(?:group__)(?P[\w/-]+)\.html", - massaged_line, - ) - if group_link is not None: - camel_link = group_link.group("group_link").replace("__", "_") - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/(?:group__)(?P[\w/-]+)\.html", - r"@ref #" + camel_link, - massaged_line, - ) - # for examples, we need to clean out extra underscores - example_link = re.search( - r"https://envirodiy.github.io/ModularSensors/(?P[\w/-]+)_8ino-example\.html", - massaged_line, - ) - if example_link is not None: - camel_link = snake_to_camel(example_link.group("example_name")) - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/(?P[\w/-]+)_8ino-example\.html", - "@ref " + snake_to_camel(example_link.group("example_name")) + ".ino", - massaged_line, - ) - - # If it's the index itself, we want to replace with a reference to the mainpage - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/index.html#(?P[\w/-]+)", - r"@ref \g", - massaged_line, - ) - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/index.html", - "@ref mainpage", - massaged_line, - ) - - # for anything other link to the docs, we the text as it is and hope it - # lines up with a real reference - massaged_line = re.sub( - r"https://envirodiy.github.io/ModularSensors/(?P[\w/-]+)\.html", - r"@ref \g", - massaged_line, - ) - - # Add a PHP Markdown Extra style header id to the end of header sections - # use the GitHub anchor plus the file name as the section id. - # GitHub anchors for headers are the text, stripped of punctuation, - # with the spaces replaced by hyphens. - markdown_header = re.match( - r"(?P#{1,6})\s+(?P[^<>\{\}\#]+)", - massaged_line, - ) - php_extra_header_label = re.search(r"\{#(.+)\}", massaged_line) - anchor_header = re.search( - r"\w+)\">", massaged_line - ) - if ( - file_name is not None - and file_name != "ChangeLog" - and markdown_header is not None - and php_extra_header_label is None - and anchor_header is None - ): - massaged_line = ( - markdown_header.group("heading_pounds") - + " " - + markdown_header.group("section_name").strip() - + " {#" - + camel_to_snake(file_name) - + "_" - + github_slugify(markdown_header.group("section_name")) - + "}\n" - ) - - elif ( - file_name is not None - and file_name != "ChangeLog" - and markdown_header is not None - and php_extra_header_label is not None - ): - # unhide PHP Markdown Extra header id's hidding in GitHub flavored markdown comments - massaged_line = re.sub(r"", r"{#\1}", massaged_line,) - # if input.isfirstline(): - # else: - # massaged_line = ( - # markdown_header.group("heading_pounds") - # + " " - # + markdown_header.group("section_name").strip() - # + " {#" - # + camel_to_snake(file_name) - # + "_" - # + github_slugify(markdown_header.group("section_name")) - # + "}\n" - # ) - - elif ( - file_name is not None - and file_name != "ChangeLog" - and markdown_header is not None - and anchor_header is not None - ): - # convert anchors to section names - massaged_line = re.sub( - r"\w+)\">", - r"{#\g}", - massaged_line, - ) - - # Special work-arounds for the change log - if file_name is not None and file_name == "ChangeLog": - if line.startswith("# ChangeLog"): - massaged_line = "# ChangeLog {#change_log}\n" - version_re = re.match( - r"#{2}\s+(?P\[(?P[^\{\}\#]+?)\])(?P.*)", - massaged_line, - ) - version_action_re = re.match( - r"#{3}\s+(?P(?:Changed)|(?:Added)|(?:Removed)|(?:Fixed)|(?:Known Issues))", - massaged_line, - ) - if version_re is not None: - change_log_version = ( - version_re.group("version_number").strip().lower().replace(".", "-") - ) - change_log_link = version_re.group("changelog_link") - massaged_line = ( - "@section " - + camel_to_snake(file_name) - + "_" - + change_log_version - + " " - + version_re.group("version_number") - + version_re.group("version_info") - + "\n" - + "GitHub Release: " - + change_log_link - # + "\n" #NOTE: Adding the new line here would offset all doxygen line numbers - ) - if version_action_re is not None: - massaged_line = ( - massaged_line.rstrip() - + " {#" - + camel_to_snake(file_name) - + "_" - + change_log_version - + "_" - + camel_to_snake(version_action_re.group("section_name")) - + "}\n" - ) - - # convert internal hash-tag links to reference links - internal_hash_link = re.search( - r"\]\(#(?P[\w/-]+)\)", massaged_line, - ) - if internal_hash_link is not None: - massaged_line = re.sub( - r"\]\(#(?P[\w/-]+)\)", - "](@ref " - + camel_to_snake(file_name) - + "_" - + github_slugify(internal_hash_link.group("internal_anchor")) - + ")", - massaged_line, - ) - - # finally replace code blocks with doxygen's prefered code block - massaged_line = ( - massaged_line.replace("```ini", "@code{.ini}") - .replace("```cpp", "@code{.cpp}") - .replace("```", "@endcode") - ) - - # hide lines that are not printed or skipped - # write out an empty comment line to keep the line numbers identical - if skip_me or not print_me: - massaged_line = "\n" - - if ( - massaged_line.count("\n") != line.count("\n") - or line.count("\n") != 1 - or massaged_line.count("\n") != 1 - ): - raise Exception( - '\n\nNot exactly one new lines\nFile:{}\nLine Number:{}\nNew Lines in Original: {}\nOriginal Line:\n"{}"\nNew Lines after Massage: {}\nMassaged Line:\n"{}"\n\n'.format( - input.filename(), - input.filelineno(), - line.count("\n"), - line, - massaged_line.count("\n"), - massaged_line, - ) - ) - - # write out the result - try: - sys.stdout.buffer.write(massaged_line.encode("utf-8")) - except Exception as e: - print(massaged_line, end="") - - # using skip_me to skip single lines, so unset it after reading a line - if skip_me: - skip_me = False - - # a page, section, subsection, or subsubsection commands followed - # immediately with by a markdown header leads to that section appearing - # twice in the doxygen html table of contents. - # I'm putting the section markers right above the header and then will skip the header. - if re.match(r"\[//\]: # \( @mainpage", line) is not None: - skip_me = True - if re.match(r"\[//\]: # \( @page", line) is not None: - skip_me = True - if re.match(r"\[//\]: # \( @.*section", line) is not None: - skip_me = True - if re.match(r"\[//\]: # \( @paragraph", line) is not None: - skip_me = True - - # I'm using these comments to fence off content that is only intended for - # github mardown rendering - if "[//]: # ( End GitHub Only )" in line: - print_me = True - - i += 1 - -#%% -# Close the comment for doxygen -# Not needed anymore with doxygen 1.9.3? -# try: -# sys.stdout.buffer.write("\n*/\n\n".encode("utf-8")) -# except Exception as e: -# print("\n*/\n\n") From 8ecaa7f009b4554e328973cd4b3182101dae3bc1 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 12:58:06 -0400 Subject: [PATCH 07/24] Reorder example headers Signed-off-by: Sara Damiano --- ChangeLog.md | 6 +++--- examples/DRWI_2G/DRWI_2G.ino | 14 ++++---------- examples/DRWI_DigiLTE/DRWI_DigiLTE.ino | 14 ++++---------- examples/DRWI_Mayfly1/DRWI_Mayfly1.ino | 16 +++++----------- examples/DRWI_Mayfly1_WiFi/DRWI_Mayfly1_WiFi.ino | 16 +++++----------- examples/DRWI_NoCellular/DRWI_NoCellular.ino | 14 ++++---------- examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino | 16 +++++----------- .../baro_rho_correction/baro_rho_correction.ino | 14 ++++---------- examples/data_saving/data_saving.ino | 14 ++++---------- examples/double_logger/double_logger.ino | 14 ++++---------- examples/logging_to_MMW/logging_to_MMW.ino | 14 ++++---------- .../logging_to_ThingSpeak.ino | 14 ++++---------- examples/menu_a_la_carte/menu_a_la_carte.ino | 14 ++++---------- examples/simple_logging/simple_logging.ino | 14 ++++---------- .../simple_logging_LearnEnviroDIY.ino | 14 ++++---------- examples/single_sensor/single_sensor.ino | 14 ++++---------- 16 files changed, 66 insertions(+), 156 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 54f53cbc7..02115b910 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,9 +1,9 @@ # ChangeLog All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) -and its stricter, better defined, brother [Common Changelog](https://common-changelog.org/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and its stricter, better defined, brother [Common Changelog](https://common-changelog.org/). + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). *** diff --git a/examples/DRWI_2G/DRWI_2G.ino b/examples/DRWI_2G/DRWI_2G.ino index f87e4d531..c901f66bb 100644 --- a/examples/DRWI_2G/DRWI_2G.ino +++ b/examples/DRWI_2G/DRWI_2G.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file DRWI_2G.ino - * @brief Example for DRWI CitSci 2G sites. - * - * @author Sara Geleskie Damiano + * @example{lineno} DRWI_2G.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example for DRWI CitSci 2G sites. * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino b/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino index c051cf25f..49f6e8890 100644 --- a/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino +++ b/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file DRWI_DigiLTE.ino - * @brief Example for DRWI CitSci LTE sites. - * - * @author Sara Geleskie Damiano + * @example{lineno} DRWI_DigiLTE.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example for DRWI CitSci LTE sites. * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino b/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino index 469752715..02cff99de 100644 --- a/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino +++ b/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino @@ -1,5 +1,9 @@ /** ========================================================================= - * @file DRWI_Mayfly1.ino + * @example{lineno} DRWI_Mayfly1.ino + * @copyright Stroud Water Research Center + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano + * * @brief Example for DRWI CitSci LTE sites. * * This example shows proper settings for the following configuration: @@ -7,16 +11,6 @@ * Mayfly v1.0 board * EnviroDIY SIM7080 LTE module (with Hologram SIM card) * Hydros21 CTD sensor - * - * @author Sara Geleskie Damiano - * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger - * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_Mayfly1_WiFi/DRWI_Mayfly1_WiFi.ino b/examples/DRWI_Mayfly1_WiFi/DRWI_Mayfly1_WiFi.ino index 5ca4cb510..022cc0638 100644 --- a/examples/DRWI_Mayfly1_WiFi/DRWI_Mayfly1_WiFi.ino +++ b/examples/DRWI_Mayfly1_WiFi/DRWI_Mayfly1_WiFi.ino @@ -1,5 +1,9 @@ /** ========================================================================= - * @file DRWI_Mayfly1_WiFi.ino + * @example{lineno} DRWI_Mayfly1_WiFi.ino + * @copyright Stroud Water Research Center + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano + * * @brief Example for DRWI CitSci LTE sites. * * This example shows proper settings for the following configuration: @@ -7,16 +11,6 @@ * Mayfly v1.x board * EnviroDIY ESP32 Wifi Bee module * Hydros21 CTD sensor - * - * @author Sara Geleskie Damiano - * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger - * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_NoCellular/DRWI_NoCellular.ino b/examples/DRWI_NoCellular/DRWI_NoCellular.ino index e5928cedb..ec301d231 100644 --- a/examples/DRWI_NoCellular/DRWI_NoCellular.ino +++ b/examples/DRWI_NoCellular/DRWI_NoCellular.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file DRWI_NoCellular.ino - * @brief Example for DRWI CitSci without cellular service. - * - * @author Sara Geleskie Damiano + * @example{lineno} DRWI_NoCellular.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example for DRWI CitSci without cellular service. * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino b/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino index 3b08000e3..bb1d48a69 100644 --- a/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino +++ b/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino @@ -1,5 +1,9 @@ /** ========================================================================= - * @file DRWI_SIM7080LTE.ino + * @example{lineno} DRWI_SIM7080LTE.ino + * @copyright Stroud Water Research Center + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano + * * @brief Example for DRWI CitSci LTE sites. * * This example shows proper settings for the following configuration: @@ -8,16 +12,6 @@ * EnviroDIY SIM7080 LTE module (with Hologram SIM card) * Hydros21 CTD sensor * Campbell Scientific OBS3+ Turbidity sensor - * - * @author Sara Geleskie Damiano - * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger - * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. * ======================================================================= */ // ========================================================================== diff --git a/examples/baro_rho_correction/baro_rho_correction.ino b/examples/baro_rho_correction/baro_rho_correction.ino index 929f08184..a41c31317 100644 --- a/examples/baro_rho_correction/baro_rho_correction.ino +++ b/examples/baro_rho_correction/baro_rho_correction.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file baro_rho_correction.ino - * @brief Example demonstrating calculated variables. - * - * @author Sara Geleskie Damiano + * @example{lineno} baro_rho_correction.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example demonstrating calculated variables. * ======================================================================= */ // ========================================================================== diff --git a/examples/data_saving/data_saving.ino b/examples/data_saving/data_saving.ino index ce4e179ac..0878f2e2d 100644 --- a/examples/data_saving/data_saving.ino +++ b/examples/data_saving/data_saving.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file data_saving.ino - * @brief Example publishing only a portion of the logged variables. - * - * @author Sara Geleskie Damiano + * @example{lineno} data_saving.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example publishing only a portion of the logged variables. * ======================================================================= */ // ========================================================================== diff --git a/examples/double_logger/double_logger.ino b/examples/double_logger/double_logger.ino index 85f7f2f63..c9bfef8ee 100644 --- a/examples/double_logger/double_logger.ino +++ b/examples/double_logger/double_logger.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file double_logger.ino - * @brief Example logging at two different timing intervals - * - * @author Sara Geleskie Damiano + * @example{lineno} double_logger.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example logging at two different timing intervals * ======================================================================= */ // ========================================================================== diff --git a/examples/logging_to_MMW/logging_to_MMW.ino b/examples/logging_to_MMW/logging_to_MMW.ino index d48d98046..18620f659 100644 --- a/examples/logging_to_MMW/logging_to_MMW.ino +++ b/examples/logging_to_MMW/logging_to_MMW.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file logging_to_MMW.ino - * @brief Example logging data and publishing to Monitor My Watershed. - * - * @author Sara Geleskie Damiano + * @example{lineno} logging_to_MMW.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example logging data and publishing to Monitor My Watershed. * ======================================================================= */ // ========================================================================== diff --git a/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino b/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino index 7a0044662..d490ad05a 100644 --- a/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino +++ b/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file logging_to_ThingSpeak.ino - * @brief Example logging data and publishing to ThingSpeak. - * - * @author Sara Geleskie Damiano + * @example{lineno} logging_to_ThingSpeak.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example logging data and publishing to ThingSpeak. * ======================================================================= */ // ========================================================================== diff --git a/examples/menu_a_la_carte/menu_a_la_carte.ino b/examples/menu_a_la_carte/menu_a_la_carte.ino index 89ceb7e85..63a951df3 100644 --- a/examples/menu_a_la_carte/menu_a_la_carte.ino +++ b/examples/menu_a_la_carte/menu_a_la_carte.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file menu_a_la_carte.ino - * @brief Example with all possible functionality. - * - * @author Sara Geleskie Damiano + * @example{lineno} menu_a_la_carte.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief Example with all possible functionality. * ======================================================================= */ // ========================================================================== diff --git a/examples/simple_logging/simple_logging.ino b/examples/simple_logging/simple_logging.ino index a31804449..f6332d89f 100644 --- a/examples/simple_logging/simple_logging.ino +++ b/examples/simple_logging/simple_logging.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file simple_logging.ino - * @brief A simple data logging example. - * - * @author Sara Geleskie Damiano + * @example{lineno} simple_logging.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief A simple data logging example. * ======================================================================= */ // ========================================================================== diff --git a/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino b/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino index 5edeaa3ab..6b0cfd4c6 100644 --- a/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino +++ b/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file simple_logging_LearnEnviroDIY.ino - * @brief A data logging example for the Learn EnviroDIY tutorial. - * - * @author Sara Geleskie Damiano + * @example{lineno} simple_logging_LearnEnviroDIY.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief A data logging example for the Learn EnviroDIY tutorial. * ======================================================================= */ // ========================================================================== diff --git a/examples/single_sensor/single_sensor.ino b/examples/single_sensor/single_sensor.ino index 76d3863df..d33d755bb 100644 --- a/examples/single_sensor/single_sensor.ino +++ b/examples/single_sensor/single_sensor.ino @@ -1,16 +1,10 @@ /** ========================================================================= - * @file single_sensor.ino - * @brief An example using only sensor functions and no logging. - * - * @author Sara Geleskie Damiano + * @example{lineno} single_sensor.ino * @copyright Stroud Water Research Center - * This example is published under the BSD-3 license. - * - * Build Environment: Visual Studio Code with PlatformIO - * Hardware Platform: EnviroDIY Mayfly Arduino Datalogger + * @license This example is published under the BSD-3 license. + * @author Sara Geleskie Damiano * - * DISCLAIMER: - * THIS CODE IS PROVIDED "AS IS" - NO WARRANTY IS GIVEN. + * @brief An example using only sensor functions and no logging. * ======================================================================= */ // ========================================================================== From da58b30256458a64037cfaf062b803a3c51b7551 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 13:28:52 -0400 Subject: [PATCH 08/24] Remove redundant example docs Signed-off-by: Sara Damiano --- docs/Doxyfile | 6 +- examples/DRWI_2G/DRWI_2G.ino | 4 + examples/DRWI_DigiLTE/DRWI_DigiLTE.ino | 5 ++ examples/DRWI_Mayfly1/DRWI_Mayfly1.ino | 5 ++ examples/DRWI_NoCellular/DRWI_NoCellular.ino | 5 ++ examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino | 5 ++ .../baro_rho_correction.ino | 4 + examples/data_saving/data_saving.ino | 5 ++ examples/double_logger/double_logger.ino | 5 ++ examples/examples.dox | 74 ------------------- examples/logging_to_MMW/logging_to_MMW.ino | 4 + .../logging_to_ThingSpeak.ino | 5 ++ examples/menu_a_la_carte/menu_a_la_carte.ino | 4 + examples/simple_logging/simple_logging.ino | 5 ++ .../simple_logging_LearnEnviroDIY.ino | 5 ++ examples/single_sensor/single_sensor.ino | 5 ++ 16 files changed, 70 insertions(+), 76 deletions(-) diff --git a/docs/Doxyfile b/docs/Doxyfile index 3b2217a8f..cd9b07517 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -547,13 +547,13 @@ EXTRACT_ALL = NO # be included in the documentation. # The default value is: NO. -EXTRACT_PRIVATE = YES +EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. -EXTRACT_PRIV_VIRTUAL = YES +EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. @@ -1059,6 +1059,8 @@ EXCLUDE = ../src/ReadMe.md \ ../examples/logger_test \ ../examples/logger_test_nonew \ ../examples/YosemitechDO \ + ../examples/DRWI_2024_CTDandClarivue_LTE_20240724 \ + ../examples/DRWI_Mayfly1_Wifi_5tm_ds18b20_1 \ ../src/sensors/table.md \ ../lib \ ../boards \ diff --git a/examples/DRWI_2G/DRWI_2G.ino b/examples/DRWI_2G/DRWI_2G.ino index c901f66bb..60b5aaab0 100644 --- a/examples/DRWI_2G/DRWI_2G.ino +++ b/examples/DRWI_2G/DRWI_2G.ino @@ -5,6 +5,10 @@ * @author Sara Geleskie Damiano * * @brief Example for DRWI CitSci 2G sites. + * + * See [the walkthrough page](@ref example_drwi_2g) for detailed instructions. + * + * @m_examplenavigation{example_drwi_2g,} * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino b/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino index 49f6e8890..10d18f5ee 100644 --- a/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino +++ b/examples/DRWI_DigiLTE/DRWI_DigiLTE.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief Example for DRWI CitSci LTE sites. + * + * See [the walkthrough page](@ref example_drwi_digilte) for detailed + * instructions. + * + * @m_examplenavigation{example_drwi_digilte,} * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino b/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino index 02cff99de..da12af231 100644 --- a/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino +++ b/examples/DRWI_Mayfly1/DRWI_Mayfly1.ino @@ -11,6 +11,11 @@ * Mayfly v1.0 board * EnviroDIY SIM7080 LTE module (with Hologram SIM card) * Hydros21 CTD sensor + * + * See [the walkthrough page](@ref example_drwi_mayfly1) for detailed + * instructions. + * + * @m_examplenavigation{example_drwi_mayfly1,} * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_NoCellular/DRWI_NoCellular.ino b/examples/DRWI_NoCellular/DRWI_NoCellular.ino index ec301d231..e132cf530 100644 --- a/examples/DRWI_NoCellular/DRWI_NoCellular.ino +++ b/examples/DRWI_NoCellular/DRWI_NoCellular.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief Example for DRWI CitSci without cellular service. + * + * See [the walkthrough page](@ref example_drwi_no_cell) for detailed + * instructions. + * + * @m_examplenavigation{example_drwi_no_cell,} * ======================================================================= */ // ========================================================================== diff --git a/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino b/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino index bb1d48a69..b0bddb992 100644 --- a/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino +++ b/examples/DRWI_SIM7080LTE/DRWI_SIM7080LTE.ino @@ -12,6 +12,11 @@ * EnviroDIY SIM7080 LTE module (with Hologram SIM card) * Hydros21 CTD sensor * Campbell Scientific OBS3+ Turbidity sensor + * + * See [the walkthrough page](@ref example_drwi_ediylte) for detailed + * instructions. + * + * @m_examplenavigation{example_drwi_ediylte,} * ======================================================================= */ // ========================================================================== diff --git a/examples/baro_rho_correction/baro_rho_correction.ino b/examples/baro_rho_correction/baro_rho_correction.ino index a41c31317..790ac9b94 100644 --- a/examples/baro_rho_correction/baro_rho_correction.ino +++ b/examples/baro_rho_correction/baro_rho_correction.ino @@ -5,6 +5,10 @@ * @author Sara Geleskie Damiano * * @brief Example demonstrating calculated variables. + * + * See [the walkthrough page](@ref example_baro_rho) for detailed instructions. + * + * @m_examplenavigation{example_baro_rho,} * ======================================================================= */ // ========================================================================== diff --git a/examples/data_saving/data_saving.ino b/examples/data_saving/data_saving.ino index 0878f2e2d..e6f445415 100644 --- a/examples/data_saving/data_saving.ino +++ b/examples/data_saving/data_saving.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief Example publishing only a portion of the logged variables. + * + * See [the walkthrough page](@ref example_data_saving) for detailed + * instructions. + * + * @m_examplenavigation{example_data_saving,} * ======================================================================= */ // ========================================================================== diff --git a/examples/double_logger/double_logger.ino b/examples/double_logger/double_logger.ino index c9bfef8ee..d202fe2c4 100644 --- a/examples/double_logger/double_logger.ino +++ b/examples/double_logger/double_logger.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief Example logging at two different timing intervals + * + * See [the walkthrough page](@ref example_double_log) for detailed + * instructions. + * + * @m_examplenavigation{example_double_log,} * ======================================================================= */ // ========================================================================== diff --git a/examples/examples.dox b/examples/examples.dox index 864fcf6be..a7397cfa4 100644 --- a/examples/examples.dox +++ b/examples/examples.dox @@ -7,22 +7,6 @@ * @m_innerpage{example_simple_logging} * @m_innerpage{example_learn_envirodiy} */ -/** - * @example{lineno} single_sensor.ino @m_examplenavigation{example_single_sensor,} @m_footernavigation - * @brief An example using only sensor functions and no logging. - * See [the walkthrough page](@ref example_single_sensor) for detailed instructions. - */ -/** - * @example{lineno} simple_logging.ino @m_examplenavigation{example_simple_logging,} @m_footernavigation - * @brief A simple data logging example. - * See [the walkthrough page](@ref example_simple_logging) for detailed instructions. - */ -/** - * @example{lineno} simple_logging_LearnEnviroDIY.ino @m_examplenavigation{example_learn_envirodiy,} @m_footernavigation - * @brief A data logging example for the Learn EnviroDIY tutorial. - * See [the walkthrough page](@ref example_learn_envirodiy) for detailed instructions. - */ - /** * @page page_the_examples @@ -32,17 +16,6 @@ * @m_innerpage{example_mmw} * @m_innerpage{example_thingspeak} */ -/** - * @example{lineno} logging_to_MMW.ino @m_examplenavigation{example_mmw,} @m_footernavigation - * @brief Example logging data and publishing to Monitor My Watershed. - * See [the walkthrough page](@ref example_mmw) for detailed instructions. - */ -/** - * @example{lineno} logging_to_ThingSpeak.ino @m_examplenavigation{example_thingspeak,} @m_footernavigation - * @brief Example logging data and publishing to ThingSpeak. - * See [the walkthrough page](@ref example_thingspeak) for detailed instructions. - */ - /** * @page page_the_examples @@ -53,22 +26,6 @@ * @m_innerpage{example_double_log} * @m_innerpage{example_data_saving} */ -/** - * @example{lineno} baro_rho_correction.ino @m_examplenavigation{example_baro_rho,} @m_footernavigation - * @brief Example demonstrating calculated variables. - * See [the walkthrough page](@ref example_baro_rho) for detailed instructions. - */ -/** - * @example{lineno} double_logger.ino @m_examplenavigation{example_double_log,} @m_footernavigation - * @brief Example logging at two different timing intervals - * See [the walkthrough page](@ref example_double_log) for detailed instructions. - */ -/** - * @example{lineno} data_saving.ino @m_examplenavigation{example_data_saving,} @m_footernavigation - * @brief Example publishing only a portion of the logged variables. - * See [the walkthrough page](@ref example_data_saving) for detailed instructions. - */ - /** * @page page_the_examples @@ -81,32 +38,6 @@ * @m_innerpage{example_drwi_2g} * @m_innerpage{example_drwi_no_cell} */ -/** - * @example{lineno} DRWI_Mayfly1.ino @m_examplenavigation{example_drwi_mayfly1,} @m_footernavigation - * @brief Example for DRWI CitSci LTE sites with a Mayfly 1.x utilizing on-board sensors. - * See [the walkthrough page](@ref example_drwi_mayfly1) for detailed instructions. - */ -/** - * @example{lineno} DRWI_SIM7080LTE.ino @m_examplenavigation{example_drwi_ediylte,} @m_footernavigation - * @brief Example for DRWI CitSci LTE sites. - * See [the walkthrough page](@ref example_drwi_ediylte) for detailed instructions. - */ -/** - * @example{lineno} DRWI_DigiLTE.ino @m_examplenavigation{example_drwi_digilte,} @m_footernavigation - * @brief Example for DRWI CitSci LTE sites. - * See [the walkthrough page](@ref example_drwi_digilte) for detailed instructions. - */ -/** - * @example{lineno} DRWI_2G.ino @m_examplenavigation{example_drwi_2g,} @m_footernavigation - * @brief Example for DRWI CitSci 2G sites. - * See [the walkthrough page](@ref example_drwi_2g) for detailed instructions. - */ -/** - * @example{lineno} DRWI_NoCellular.ino @m_examplenavigation{example_drwi_no_cell,} @m_footernavigation - * @brief Example for DRWI CitSci without cellular service. - * See [the walkthrough page](@ref example_drwi_no_cell) for detailed instructions. - */ - /** * @page page_the_examples @@ -115,8 +46,3 @@ * [Everything at Once - a la carte](@ref examples_everything) * @m_innerpage{example_menu} */ -/** - * @example{lineno} menu_a_la_carte.ino @m_examplenavigation{example_menu,} @m_footernavigation - * @brief Example with all possible functionality. - * See [the walkthrough page](@ref example_menu) for detailed instructions. - */ diff --git a/examples/logging_to_MMW/logging_to_MMW.ino b/examples/logging_to_MMW/logging_to_MMW.ino index 18620f659..eece23667 100644 --- a/examples/logging_to_MMW/logging_to_MMW.ino +++ b/examples/logging_to_MMW/logging_to_MMW.ino @@ -5,6 +5,10 @@ * @author Sara Geleskie Damiano * * @brief Example logging data and publishing to Monitor My Watershed. + * + * See [the walkthrough page](@ref example_mmw) for detailed instructions. + * + * @m_examplenavigation{example_mmw,} * ======================================================================= */ // ========================================================================== diff --git a/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino b/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino index d490ad05a..e61adb42c 100644 --- a/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino +++ b/examples/logging_to_ThingSpeak/logging_to_ThingSpeak.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief Example logging data and publishing to ThingSpeak. + * + * See [the walkthrough page](@ref example_thingspeak) for detailed + * instructions. + * + * @m_examplenavigation{example_thingspeak,} * ======================================================================= */ // ========================================================================== diff --git a/examples/menu_a_la_carte/menu_a_la_carte.ino b/examples/menu_a_la_carte/menu_a_la_carte.ino index 63a951df3..28a888ea2 100644 --- a/examples/menu_a_la_carte/menu_a_la_carte.ino +++ b/examples/menu_a_la_carte/menu_a_la_carte.ino @@ -5,6 +5,10 @@ * @author Sara Geleskie Damiano * * @brief Example with all possible functionality. + * + * See [the walkthrough page](@ref example_menu) for detailed instructions. + * + * @m_examplenavigation{example_menu,} * ======================================================================= */ // ========================================================================== diff --git a/examples/simple_logging/simple_logging.ino b/examples/simple_logging/simple_logging.ino index f6332d89f..36fe79d8e 100644 --- a/examples/simple_logging/simple_logging.ino +++ b/examples/simple_logging/simple_logging.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief A simple data logging example. + * + * See [the walkthrough page](@ref example_simple_logging) for detailed + * instructions. + * + * @m_examplenavigation{example_simple_logging,} * ======================================================================= */ // ========================================================================== diff --git a/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino b/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino index 6b0cfd4c6..4cb6db5d9 100644 --- a/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino +++ b/examples/simple_logging_LearnEnviroDIY/simple_logging_LearnEnviroDIY.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief A data logging example for the Learn EnviroDIY tutorial. + * + * See [the walkthrough page](@ref example_learn_envirodiy) for detailed + * instructions. + * + * @m_examplenavigation{example_learn_envirodiy,} * ======================================================================= */ // ========================================================================== diff --git a/examples/single_sensor/single_sensor.ino b/examples/single_sensor/single_sensor.ino index d33d755bb..acfb50978 100644 --- a/examples/single_sensor/single_sensor.ino +++ b/examples/single_sensor/single_sensor.ino @@ -5,6 +5,11 @@ * @author Sara Geleskie Damiano * * @brief An example using only sensor functions and no logging. + * + * See [the walkthrough page](@ref example_single_sensor) for detailed + * instructions. + * + * @m_examplenavigation{example_single_sensor,} * ======================================================================= */ // ========================================================================== From 186b5bf6efacbaa032b4ad133e4c1d63e1380218 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 13:59:01 -0400 Subject: [PATCH 09/24] Remove files redundant with workflow repo, update doxy fil Signed-off-by: Sara Damiano --- .../beautify_arduino_lint_log.py | 42 -------- .../build-install-doxygen.sh | 61 ----------- docs/Doxyfile | 7 +- docs/copyFunctions.py | 101 ------------------ docs/mcss-Doxyfile | 8 +- 5 files changed, 10 insertions(+), 209 deletions(-) delete mode 100644 continuous_integration/beautify_arduino_lint_log.py delete mode 100644 continuous_integration/build-install-doxygen.sh delete mode 100644 docs/copyFunctions.py diff --git a/continuous_integration/beautify_arduino_lint_log.py b/continuous_integration/beautify_arduino_lint_log.py deleted file mode 100644 index 726f573bc..000000000 --- a/continuous_integration/beautify_arduino_lint_log.py +++ /dev/null @@ -1,42 +0,0 @@ -#%% -import json -import os - -in_json = open(os.environ["GITHUB_WORKSPACE"] + "/arduino_lint.json") -arduino_lint_results = json.load(in_json) - -out_md = open(os.environ["GITHUB_WORKSPACE"] + "/arduino_lint.md", "w+") - -out_md.write("## Results of testing examples\n\n") -out_md.write(" | Path | Project Type | Result | Problems | \n") -out_md.write(" | --- | --- | --- | --- | \n") -for project in arduino_lint_results["projects"]: - fail_list = "
    " - for failed_rule in project["rules"]: - if failed_rule["result"] != "pass": - fail_list += "
  • {}{}
      ".format( - failed_rule["ID"], - " - {}".format(failed_rule["brief"]) - if failed_rule["brief"] != "" - else "", - ) - fail_list += "
    • **{}**{}
    • ".format( - failed_rule["level"], - " - {}".format(failed_rule["message"].replace("\n", "

      ")) - if failed_rule["message"] != "" - else "", - ) - fail_list += "
  • " - fail_list += "
" - out_md.write( - " | {} | {} | {} | {} | \n".format( - project["path"] - .replace(os.environ.get("GITHUB_WORKSPACE"), "") - .replace("examples\\", ""), - project["projectType"], - ":white_check_mark:" if project["summary"]["pass"] else ":x:", - fail_list, - ) - ) - -#%% diff --git a/continuous_integration/build-install-doxygen.sh b/continuous_integration/build-install-doxygen.sh deleted file mode 100644 index f67d8cd51..000000000 --- a/continuous_integration/build-install-doxygen.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/bash - -# Makes the bash script print out every command before it is executed, except echo -trap '[[ $BASH_COMMAND != echo* ]] && echo $BASH_COMMAND' DEBUG - -# Exit with nonzero exit code if anything fails -set -e - -# install all the dependencies for make for Doxygen and m.css -sudo apt-get update -sudo apt-get -y install build-essential -sudo apt-get -y install flex -sudo apt-get -y install bison - -# install TeX Live for LaTeX formula rendering -sudo apt-get -y install texlive-base -sudo apt-get -y install texlive-latex-extra -sudo apt-get -y install texlive-fonts-extra -sudo apt-get -y install texlive-fonts-recommended - -echo "\e[32m\n\n\nCurrent TeX version...\e[0m" -tex --version -echo "\n\n\n" - -# install Graphviz for DOT class diagrams -sudo apt-get -y install graphviz - -echo "\e[32m\n\n\nCurrent graphviz version...\e[0m" -dot -v -echo "\n\n\n" - -cd $GITHUB_WORKSPACE - -if [ ! -f $GITHUB_WORKSPACE/doxygen-src/build/bin/doxygen ]; then - - # Build instructions from: https://www.stack.nl/~dimitri/doxygen/download.html - echo "\e[32mCloning doxygen repository...\e[0m" - git clone https://github.com/doxygen/doxygen.git doxygen-src --branch $DOXYGEN_VERSION --depth 1 - - cd doxygen-src - - echo "\e[32mCreate build folder...\e[0m" - mkdir build - cd build - - echo "\e[32mMake...\e[0m" - cmake -G "Unix Makefiles" .. - make - echo "\e[32mDone building doxygen.\e[0m" - echo "\e[32mdoxygen path: \e[0m" $(pwd) -fi - -echo "\e[32m\n\n\nCurrent Doxygen version...\e[0m" -$GITHUB_WORKSPACE/doxygen-src/build/bin/doxygen -v -echo "\n\n\n" - -# echo "\e[32mMove Doxygen to working directory" -# cp $GITHUB_WORKSPACE/doxygen-src/build/bin/* $GITHUB_WORKSPACE/code_docs/ModularSensors -# #make install - -cd $GITHUB_WORKSPACE/code_docs/ModularSensors diff --git a/docs/Doxyfile b/docs/Doxyfile index cd9b07517..f1c5914d1 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -74,7 +74,7 @@ PROJECT_ICON = enviroDIY_Favicon.png # entered, it will be relative to the location where Doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = ../../ModularSensorsDoxygen +OUTPUT_DIRECTORY = ../../ModularSensors_Doxygen # If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -1064,7 +1064,8 @@ EXCLUDE = ../src/ReadMe.md \ ../src/sensors/table.md \ ../lib \ ../boards \ - ../variants + ../variants \ + ../continuous_integration_artifacts # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -1347,7 +1348,7 @@ IGNORE_PREFIX = # If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output # The default value is: YES. -GENERATE_HTML = NO +GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of diff --git a/docs/copyFunctions.py b/docs/copyFunctions.py deleted file mode 100644 index 3e0c64f56..000000000 --- a/docs/copyFunctions.py +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/env python -import fileinput -import re -import os -import glob -import xml.etree.ElementTree as ET -from html.parser import HTMLParser -from bs4 import BeautifulSoup - -fileDir = os.path.dirname(os.path.realpath("__file__")) -# print("Program Directory: {}".format(fileDir)) -relative_dir = "../../ModularSensorsDoxygen/m.css/" -abs_file_path = os.path.join(fileDir, relative_dir) -abs_file_path = os.path.abspath(os.path.realpath(abs_file_path)) -# print("XML Directory: {}".format(fileDir)) - -all_files = [ - f - for f in os.listdir(abs_file_path) - if os.path.isfile(os.path.join(abs_file_path, f)) - and f.endswith(".html") - and not f.endswith("fixed") -] - - -def get_section_to_paste(match: re.Match) -> str: - source_file = match.group("copy_source_file") - # print(source_file) - source_section = match.group("copy_section_id") - # print(source_section) - with open(os.path.join(abs_file_path, source_file), encoding="utf8") as fp: - soup = BeautifulSoup(fp, "html.parser") - details = soup.find(id=source_section) - # print("Details:", details, "\n\n") - link = details.find("a", class_="m-doc-self") - # print("Link:", link, "\n\n") - link["href"] = source_file + "#" + source_section - # print("Link:", link, "\n\n") - # print("Details:", details, "\n\n") - return str(details) - - # tree = ET.parse() - # root = tree.getroot() - - # for definition in root.iter("compounddef"): - # # print(definition.attrib) - # compound_id = definition.attrib["id"] - # # print(compound_id) - # # print("---") - - -# {{ AOSongAM2315_Humidity::AOSongAM2315_Humidity }} -files_to_copy_to = [] -for filename in all_files: - abs_in = os.path.join(abs_file_path, filename) - abs_out = os.path.join(abs_file_path, filename + "_fixed") - copy_paste_needed = False - # with open(os.path.join(abs_file_path, filename)) as fp: - # soup = BeautifulSoup(fp, "html.parser") - # for find in soup.find_all(string=[re.compile("\{\{")]): - # print(find.find_parent("p").a.get("href")) - - with open(abs_in, "r", encoding="utf8") as in_file: # open in readonly mode - lines = in_file.readlines() - i = 0 - new_lines = [] - for line in lines: - i += 1 - new_line = line - match = re.search( - r'{{ @endxmlonly" \ "m_enum_values_as_keywords=@xmlonly@endxmlonly" \ "m_since{2}=@since @m_class{m-label m-success m-flat} @ref changelog-\1-\2 \"since v\1.\2\"" \ - "m_deprecated_since{3}=@since deprecated in v\1.\2.\3 @deprecated" \ No newline at end of file + "m_deprecated_since{3}=@since deprecated in v\1.\2.\3 @deprecated" + +HAVE_DOT = NO +DOT_FONTNAME = Source Sans Pro +DOT_FONTSIZE = 16 From 1144626d9c99807e16c36ecf7d2db7839c98ddc9 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 14:03:36 -0400 Subject: [PATCH 10/24] Add example dependency file Signed-off-by: Sara Damiano --- .github/workflows/verify_library_structure.yaml | 2 +- examples/example_dependencies.json | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/verify_library_structure.yaml b/.github/workflows/verify_library_structure.yaml index bf9958771..9c72b21cf 100644 --- a/.github/workflows/verify_library_structure.yaml +++ b/.github/workflows/verify_library_structure.yaml @@ -13,5 +13,5 @@ jobs: if: ${{ ! contains(github.event.head_commit.message, 'ci skip') }} uses: EnviroDIY/workflows/.github/workflows/verify_library_structure.yaml@main with: - library-manager: 'update' + library-manager: 'submit' library-compliance: 'strict' diff --git a/examples/example_dependencies.json b/examples/example_dependencies.json index 787d94b4d..d547bf4f4 100644 --- a/examples/example_dependencies.json +++ b/examples/example_dependencies.json @@ -21,6 +21,11 @@ { "name": "SoftwareSerial_ExternalInts", "version": "https://github.com/EnviroDIY/SoftwareSerial_ExternalInts.git" + }, + { + "name": "SDI-12_ExtInts", + "owner": "envirodiy", + "version": "https://github.com/EnviroDIY/Arduino-SDI-12#ExtInts" } ] } From 477192b702f90973ccb35d5f56e46d9983f680f5 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 14:15:45 -0400 Subject: [PATCH 11/24] Fix example env names Signed-off-by: Sara Damiano --- .github/workflows/build_examples.yaml | 2 +- continuous_integration/generate_job_matrix.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_examples.yaml b/.github/workflows/build_examples.yaml index ec772ba06..b7432716c 100644 --- a/.github/workflows/build_examples.yaml +++ b/.github/workflows/build_examples.yaml @@ -13,5 +13,5 @@ jobs: if: ${{ ! contains(github.event.head_commit.message, 'ci skip') }} uses: EnviroDIY/workflows/.github/workflows/build_examples.yaml@main with: - boards_to_build: 'mayfly,megaatmega2560,zeroUSB,adafruit_feather_m0' + boards_to_build: 'mayfly,mega,zero,feather_m0' secrets: inherit diff --git a/continuous_integration/generate_job_matrix.py b/continuous_integration/generate_job_matrix.py index b8c12ebde..f2cd322d6 100644 --- a/continuous_integration/generate_job_matrix.py +++ b/continuous_integration/generate_job_matrix.py @@ -28,6 +28,7 @@ workspace_path = os.path.abspath(os.path.realpath(workspace_dir)) print(f"Workspace Path: {workspace_path}") +# %% # The examples directory examples_dir = "./examples/" examples_path = os.path.join(workspace_dir, examples_dir) @@ -652,7 +653,7 @@ def extend_pio_config(added_envs): # %% # Tack on a few more extra build configurations for the software serial libraries -for pio_env in ["Mayfly"]: +for pio_env in ["mayfly"]: arduino_serial_commands = [ start_job_commands, # 'echo "## [Extra Serials on {} with the Arduino CLI](https://github.com/EnviroDIY/ModularSensors/runs/$ACTION_RUN_ID?check_suite_focus=true#step:10:1)" >> $GITHUB_STEP_SUMMARY'.format( From 34ef181010d34ef6cbe82dfb2432d41ac6614993 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Thu, 15 Aug 2024 14:18:24 -0400 Subject: [PATCH 12/24] revert build_examples.yaml Signed-off-by: Sara Damiano --- .github/workflows/build_examples.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_examples.yaml b/.github/workflows/build_examples.yaml index b7432716c..ec772ba06 100644 --- a/.github/workflows/build_examples.yaml +++ b/.github/workflows/build_examples.yaml @@ -13,5 +13,5 @@ jobs: if: ${{ ! contains(github.event.head_commit.message, 'ci skip') }} uses: EnviroDIY/workflows/.github/workflows/build_examples.yaml@main with: - boards_to_build: 'mayfly,mega,zero,feather_m0' + boards_to_build: 'mayfly,megaatmega2560,zeroUSB,adafruit_feather_m0' secrets: inherit From 746c2ef657c88b18ed70a85cb02da19a12a128ed Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 23 Aug 2024 14:14:14 -0400 Subject: [PATCH 13/24] Fix extra flags evn name Signed-off-by: Sara Damiano --- continuous_integration/platformio_extra_flags.ini | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/continuous_integration/platformio_extra_flags.ini b/continuous_integration/platformio_extra_flags.ini index 2215cf110..e623e5d8a 100644 --- a/continuous_integration/platformio_extra_flags.ini +++ b/continuous_integration/platformio_extra_flags.ini @@ -9,7 +9,7 @@ ; http://docs.platformio.org/page/projectconf.html [env:software_wire] -extends = env:Mayfly +extends = env:mayfly build_flags = -D SDI12_EXTERNAL_PCINT -D MS_PALEOTERRA_SOFTWAREWIRE @@ -18,19 +18,19 @@ lib_deps = https://github.com/Testato/SoftwareWire.git#v1.5.1 [env:ads1015] -extends = env:Mayfly +extends = env:mayfly build_flags = -D SDI12_EXTERNAL_PCINT -D MS_USE_ADS1015 [env:sdi12_non_concurrent] -extends = env:Mayfly +extends = env:mayfly build_flags = -D SDI12_EXTERNAL_PCINT -D MS_SDI12_NON_CONCURRENT [env:AltSoftSerial] -extends = env:Mayfly +extends = env:mayfly build_flags = -D SDI12_EXTERNAL_PCINT -D BUILD_TEST_ALTSOFTSERIAL @@ -38,7 +38,7 @@ lib_deps = https://github.com/PaulStoffregen/AltSoftSerial.git [env:NeoSWSerial] -extends = env:Mayfly +extends = env:mayfly build_flags = -D SDI12_EXTERNAL_PCINT -D NEOSWSERIAL_EXTERNAL_PCINT @@ -47,7 +47,7 @@ lib_deps = https://github.com/SRGDamia1/NeoSWSerial.git [env:SoftwareSerial] -extends = env:Mayfly +extends = env:mayfly build_flags = -D SDI12_EXTERNAL_PCINT -D BUILD_TEST_SOFTSERIAL From 9b684b4a7e3a35f592696e99c64e0765877db1cc Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 23 Aug 2024 14:19:38 -0400 Subject: [PATCH 14/24] Update changelog Signed-off-by: Sara Damiano --- ChangeLog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 02115b910..fc8f7d2ec 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,6 +12,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Changed +- Switched to reusable workflows for CI + ### Added ### Removed From e34e87b471632cac11fd244ced03fc123546a99b Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 23 Aug 2024 17:09:58 -0400 Subject: [PATCH 15/24] Watch-dog and sleep changes based on sleepy dog Signed-off-by: Sara Damiano --- src/LoggerBase.cpp | 74 +++++++++++++++++++++------------- src/LoggerBase.h | 72 +++++++++++++++++++++++++++++++-- src/WatchDogs/WatchDogAVR.cpp | 31 ++++++++------ src/WatchDogs/WatchDogSAMD.cpp | 18 ++++----- 4 files changed, 143 insertions(+), 52 deletions(-) diff --git a/src/LoggerBase.cpp b/src/LoggerBase.cpp index cfe4db7bc..6da0472a3 100644 --- a/src/LoggerBase.cpp +++ b/src/LoggerBase.cpp @@ -36,6 +36,7 @@ volatile bool Logger::isTestingNow = false; volatile bool Logger::startTesting = false; // Initialize the RTC for the SAMD boards using build in RTC +// Needed for static instances #if not defined(MS_SAMD_DS3231) && defined(ARDUINO_ARCH_SAMD) RTCZero Logger::zero_sleep_rtc; #endif @@ -56,10 +57,6 @@ Logger::Logger(const char* loggerID, uint16_t loggingIntervalMinutes, isTestingNow = false; startTesting = false; - // Set the initial pin values - // NOTE: Only setting values here, not the pin mode. - // The pin mode can only be set at run time, not here at compile time. - // Clear arrays for (uint8_t i = 0; i < MAX_NUMBER_SENDERS; i++) { dataPublishers[i] = nullptr; @@ -428,7 +425,6 @@ int8_t Logger::getTZOffset(void) { // This gets the current epoch time (unix time, ie, the number of seconds // from January 1, 1970 00:00:00 UTC) and corrects it to the specified time zone - uint32_t Logger::getNowEpoch(void) { // Depreciated in 0.33.0, left in for compatiblity return getNowLocalEpoch(); @@ -523,14 +519,14 @@ bool Logger::setRTClock(uint32_t UTCEpochSeconds) { // the user uint32_t set_logTZ = UTCEpochSeconds + ((uint32_t)getLoggerTimeZone()) * 3600; - MS_DBG(F(" Time for Logger supplied by NIST:"), set_logTZ, F("->"), + MS_DBG(F(" Time for Logger supplied as input:"), set_logTZ, F("->"), formatDateTime_ISO8601(set_logTZ)); // Check the current RTC time uint32_t cur_logTZ = getNowLocalEpoch(); MS_DBG(F(" Current Time on RTC:"), cur_logTZ, F("->"), formatDateTime_ISO8601(cur_logTZ)); - MS_DBG(F(" Offset between NIST and RTC:"), abs(set_logTZ - cur_logTZ)); + MS_DBG(F(" Offset between input and RTC:"), abs(set_logTZ - cur_logTZ)); // NOTE: Because we take the time to do some UTC/Local conversions and // print stuff out, the clock might end up being set up to a few @@ -762,29 +758,44 @@ void Logger::systemSleep(void) { // Disable the watch-dog timer watchDogTimer.disableWatchDog(); - // Sleep code from ArduinoLowPowerClass::sleep() - bool restoreUSBDevice = false; - // if (SERIAL_PORT_USBVIRTUAL) - // { - // USBDevice.standby(); - // } - // else - // { #ifndef USE_TINYUSB + // Detach the USB, iff not using TinyUSB + MS_DEEP_DBG(F("USBDevice.detach")); USBDevice.detach(); + MS_DEEP_DBG(F("USBDevice.end")); + USBDevice.end(); + USBDevice.standby(); #endif - restoreUSBDevice = true; - // } + +#if defined(__SAMD51__) + // PM_SLEEPCFG_SLEEPMODE_BACKUP = 0x4 + PM->SLEEPCFG.bit.SLEEPMODE = 0x4; + while (PM->SLEEPCFG.bit.SLEEPMODE != 0x4) + ; // Wait for it to take +#else // Disable systick interrupt: See // https://www.avrfreaks.net/forum/samd21-samd21e16b-sporadically-locks-and-does-not-wake-standby-sleep-mode + // Due to a hardware bug on the SAMD21, the SysTick interrupts become active + // before the flash has powered up from sleep, causing a hard fault. To + // prevent this the SysTick interrupts are disabled before entering sleep + // mode. SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; // Now go to sleep SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; - __DSB(); - __WFI(); +#endif + + __DSB(); // Data sync to ensure outgoing memory accesses complete + __WFI(); // Wait for interrupt (places device in sleep mode) #elif defined ARDUINO_ARCH_AVR +// Disable USB if it exists +#ifdef USBCON + USBCON |= _BV(FRZCLK); // freeze USB clock + PLLCSR &= ~_BV(PLLE); // turn off USB PLL + USBCON &= ~_BV(USBE); // disable USB +#endif + // Set the sleep mode // In the avr/sleep.h file, the call names of these 5 sleep modes are: // SLEEP_MODE_IDLE -the least power savings @@ -839,18 +850,16 @@ void Logger::systemSleep(void) { // -- The portion below this happens on wake up, after any wake ISR's -- #if defined ARDUINO_ARCH_SAMD +#if (SAMD20_SERIES || SAMD21_SERIES) // Reattach the USB after waking // Enable systick interrupt SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; - if (restoreUSBDevice) { +#endif + // Reattach the USB #ifndef USE_TINYUSB - USBDevice.attach(); + USBDevice.init(); + USBDevice.attach(); #endif - uint32_t startTimer = millis(); - while (!SERIAL_PORT_USBVIRTUAL && ((millis() - startTimer) < 1000L)) { - // wait - } - } #endif #if defined ARDUINO_ARCH_AVR @@ -1323,8 +1332,19 @@ void Logger::begin() { MS_DBG(F("Logger is set to record at"), _loggingIntervalMinutes, F("minute intervals.")); +#if defined(ARDUINO_ARCH_SAMD) + MS_DBG(F("Disabling the USB on stnadby to lower sleep current")); + USB->DEVICE.CTRLA.bit.ENABLE = 0; // Disable the USB peripheral + while (USB->DEVICE.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + USB->DEVICE.CTRLA.bit.RUNSTDBY = 0; // Deactivate run on standby + USB->DEVICE.CTRLA.bit.ENABLE = 1; // Enable the USB peripheral + while (USB->DEVICE.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization +#endif + MS_DBG(F( - "Setting up a watch-dog timer to fire after 5 minutes of inactivity")); + "Setting up a watch-dog timer to fire after 15 minutes of inactivity")); watchDogTimer.setupWatchDog((uint32_t)(5 * 60 * 3)); // Enable the watchdog watchDogTimer.enableWatchDog(); diff --git a/src/LoggerBase.h b/src/LoggerBase.h index 57556b40e..295190924 100644 --- a/src/LoggerBase.h +++ b/src/LoggerBase.h @@ -679,9 +679,6 @@ class Logger { */ static int8_t getTZOffset(void); -// This gets the current epoch time (unix time, ie, the number of seconds -// from January 1, 1970 00:00:00 UTC) and corrects it for the specified time -// zone #if (defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_SAMD_ZERO)) && \ not defined(MS_SAMD_DS3231) /** @@ -853,6 +850,75 @@ class Logger { * @anchor logger_sleep * @name Clock and Timezones * Public Functions for sleeping the logger + * + * # AVR Sleep modes + * + * In the avr/sleep.h file, the call names of these 5 sleep modes are: + * SLEEP_MODE_IDLE - the least power savings + * SLEEP_MODE_ADC + * SLEEP_MODE_PWR_SAVE + * SLEEP_MODE_STANDBY + * SLEEP_MODE_PWR_DOWN - the most power savings + * + * # SAMD21 Sleep Modes + * + * > The SAM D21/DA1 have two software-selectable sleep modes, Idle and + * > Stand-by. + * > In Idle mode, the CPU is stopped while all other functions can be kept + * > running. + * > In Stand-by mode, all clocks and functions are stopped, expect those + * > selected to continue running. + * > The device supports SleepWalking. + * > This feature allows the peripheral to wake up from sleep based on + * > predefined conditions, and thus allows the CPU to wake up only when + * > needed, e.g., when a threshold is crossed or a result is ready. + * > The Event System supports synchronous and asynchronous events, allowing + * > peripherals to receive, react to and send events even in Stand-by mode. + * + * # SAMD51 Sleep Modes + * + * > The device can be set in a sleep mode. In sleep mode, the CPU is + * > stopped and the peripherals are either active or idle, according to the + * > sleep mode depth: + * > + * > - Idle sleep mode: + * > - The CPU is stopped. + * > - Synchronous clocks are stopped except when requested. + * > - The logic is retained. + * > - Standby sleep mode: + * > - The CPU is stopped as well as the peripherals. + * > - The logic is retained, and power domain gating can be used to + * > fully or partially turn off the PDSYSRAM power domain. + * > - Hibernate sleep mode: + * > - PDCORESW power domain is turned OFF. + * > - The backup power domain is kept powered to allow few features to + * > run (RTC, 32KHz clock sources, and wake-up from external pins). + * > - The PDSYSRAM power domain can be retained according to software + * > configuration. + * > - Backup sleep mode: + * > - Only the backup domain is kept powered to allow few features to + * > run (RTC, 32KHz clock sources, and wake-up from external pins). + * > - The PDBKUPRAM power domain can be retained according to software + * > configuration. + * > - Off sleep mode: + * > - The entire device is powered off. + * + * ## Bit Settings + * | Value | Name | Definition | + * |:-----:|:---------:|:------------------------------------------:| + * | 0x0 | Reserved | - | + * | 0x1 | Reserved | - | + * | 0x2 | IDLE | CPU, AHBx, and APBx clocks are OFF | + * | 0x3 | Reserved | Reserved | + * | 0x4 | STANDBY | All Clocks are OFF | + * | 0x5 | HIBERNATE | Backup domain is ON as well as some PDRAMs | + * | 0x6 | BACKUP | Only Backup domain is powered ON | + * | 0x7 | OFF | All power domains are powered OFF | + * + * @note For the SAMD51, hibernate, backup, and off modes cause a full + * system reset on wake. Because we don't want to fully reset the device + * (and go back to the setup) on wake, the lowest power mode we can use is + * standby. */ /**@{*/ // ===================================================================== // diff --git a/src/WatchDogs/WatchDogAVR.cpp b/src/WatchDogs/WatchDogAVR.cpp index b3614b88f..ade6956a6 100644 --- a/src/WatchDogs/WatchDogAVR.cpp +++ b/src/WatchDogs/WatchDogAVR.cpp @@ -39,26 +39,28 @@ void extendedWatchDogAVR::setupWatchDog(uint32_t resetTime_s) { void extendedWatchDogAVR::enableWatchDog() { MS_DBG(F("Enabling watch dog...")); - cli(); // disable interrupts - - MCUSR = 0; // reset status register flags + // The next section is timing critical so interrupts are disabled. + cli(); + // First clear any previous watchdog reset. + MCUSR &= ~(1 << WDRF); // Put timer in interrupt-only mode: // WDTCSR - Watchdog Timer Control Register + + // Set WDCE and WDE to enable changes. + // If changes aren't enabled, we cannot change the prescaler WDTCSR |= 0b00011000; // Set Bit 4 – WDCE: Watchdog Change Enable // Set Bit 3 – WDE: Watchdog System Reset Enable // bitwise OR assignment (leaves other bits unchanged) - // Need to set the change and reset enables before changing the prescaler - WDTCSR = 0b01100001; // Set Bit 6 – WDIE: Watchdog Interrupt Enable - // Unset Bit 4 – WDCE: Watchdog Change Enable - // Unset Bit 3 – WDE: Watchdog System Reset Enable - // Set Bit 5 - WDP[3] and Bit 0 – WDP[0]: - // Watchdog Timer Prescalers 3 and 0 - 1024K cycles = 8.0s - // bitwise OR assignment (leaves other bits unchanged) - - sei(); // re-enable interrupts - // wdt_reset(); // this is not needed...timer starts without it + // Now can set the full register including the prescaler + WDTCSR = 0b01100001; + // Bit 7: WDIF (Watchdog Interrupt Flag) - 0 (Read only) + // Bit 6: WDIE (Watchdog Interrupt Enable) - 1 (Enabled) + // Bit 5: WDP3 (Watchdog Timer Prescaler) - see delay interval patterns + // Bit 4: WDCE (Watchdog Change Enable) - 0 (disable further changes) + // Bit 3: WDE (Watchdog System Reset Enable) - 0 (Clear?) + // Bits 2:0 Watchdog timer prescaler [WDP2:0] - see delay interval patterns // delay interval patterns: // 16 ms: 0bxx0xx000 @@ -68,6 +70,9 @@ void extendedWatchDogAVR::enableWatchDog() { // 4 seconds: 0bxx1xx000 // 8 seconds: 0bxx1xx001 + sei(); // re-enable interrupts + // wdt_reset(); // this is not needed...timer starts without it + extendedWatchDogAVR::_barksUntilReset = _resetTime_s / 8; MS_DBG(F("The watch dog is enabled in interrupt-only mode.")); MS_DBG(F("The interrupt will fire"), extendedWatchDogAVR::_barksUntilReset, diff --git a/src/WatchDogs/WatchDogSAMD.cpp b/src/WatchDogs/WatchDogSAMD.cpp index ff63e78bd..7163ac823 100644 --- a/src/WatchDogs/WatchDogSAMD.cpp +++ b/src/WatchDogs/WatchDogSAMD.cpp @@ -33,12 +33,6 @@ void extendedWatchDogSAMD::setupWatchDog(uint32_t resetTime_s) { extendedWatchDogSAMD::_barksUntilReset, F("times before the reset.")); - // Enable WDT early-warning interrupt - NVIC_DisableIRQ(WDT_IRQn); - NVIC_ClearPendingIRQ(WDT_IRQn); - NVIC_SetPriority(WDT_IRQn, 1); // Priority behind RTC! - NVIC_EnableIRQ(WDT_IRQn); - // Disable watchdog for config #if defined(__SAMD51__) WDT->CTRLA.reg = 0; @@ -97,27 +91,33 @@ void extendedWatchDogSAMD::setupWatchDog(uint32_t resetTime_s) { #endif + // Enable WDT early-warning interrupt + NVIC_DisableIRQ(WDT_IRQn); + NVIC_ClearPendingIRQ(WDT_IRQn); + NVIC_SetPriority(WDT_IRQn, 1); // Priority behind RTC! + NVIC_EnableIRQ(WDT_IRQn); + // Set up the watch dog control parameters #if defined(__SAMD51__) WDT->CTRLA.bit.WEN = 0; // Disable window mode #else WDT->CTRL.bit.WEN = 0; // Disable window mode #endif - waitForWDTBitSync(); // ?? Needed here ?? + waitForWDTBitSync(); #if defined(__SAMD51__) WDT->CTRLA.bit.ALWAYSON = 0; // NOT always on! #else WDT->CTRL.bit.ALWAYSON = 0; // NOT always on! #endif - waitForWDTBitSync(); // ?? Needed here ?? + waitForWDTBitSync(); WDT->CONFIG.bit.PER = 0xB; // Period = 16384 clockcycles @ 1024hz = 16 seconds WDT->EWCTRL.bit.EWOFFSET = 0xA; // Early Warning Interrupt Time Offset 0xA // = 8192 clockcycles @ 1024hz = 8 seconds WDT->INTENSET.bit.EW = 1; // Enable early warning interrupt - waitForWDTBitSync(); // ?? Needed here ?? + waitForWDTBitSync(); /*In normal mode, the Early Warning interrupt generation is defined by the Early Warning Offset in the Early Warning Control register From f36e83b25dc764411f6cbacde3de981f5dd3ac50 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 23 Aug 2024 17:10:44 -0400 Subject: [PATCH 16/24] Move board definition, fix define for Feather M0 Signed-off-by: Sara Damiano --- src/sensors/ProcessorStats.cpp | 107 +++++---------------------------- src/sensors/ProcessorStats.h | 84 ++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 92 deletions(-) diff --git a/src/sensors/ProcessorStats.cpp b/src/sensors/ProcessorStats.cpp index 2a964fadd..eb149027d 100644 --- a/src/sensors/ProcessorStats.cpp +++ b/src/sensors/ProcessorStats.cpp @@ -10,99 +10,17 @@ #include "ProcessorStats.h" -// EnviroDIY boards -#if defined(ARDUINO_AVR_ENVIRODIY_MAYFLY) -/// @brief Pretty text for the board name derived from the board's compiler -/// define. -#define BOARD "EnviroDIY Mayfly" - -// Sodaq boards -#elif defined(ARDUINO_SODAQ_EXPLORER) -#define BOARD "SODAQ ExpLoRer" -#elif defined(ARDUINO_SODAQ_AUTONOMO) -#define BOARD "SODAQ Autonomo" -#elif defined(ARDUINO_SODAQ_ONE_BETA) -#define BOARD "SODAQ ONE Beta" -#elif defined(ARDUINO_SODAQ_ONE) -#define BOARD "SODAQ ONE" -#elif defined(ARDUINO_AVR_SODAQ_MBILI) -#define BOARD "SODAQ Mbili" -#elif defined(ARDUINO_AVR_SODAQ_NDOGO) -#define BOARD "SODAQ Ndogo" -#elif defined(ARDUINO_AVR_SODAQ_TATU) -#define BOARD "SODAQ Tatu" -#elif defined(ARDUINO_AVR_SODAQ_MOJA) -#define BOARD "SODAQ Moja" - -// Adafruit boards -#elif defined(ARDUINO_AVR_FEATHER32U4) -#define BOARD "Feather 32u4" -#elif defined(ARDUINO_SAMD_FEATHER_M0) -#define BOARD "Feather M0" -#elif defined(ARDUINO_SAMD_FEATHER_M0_EXPRESS) -#define BOARD "Feather M0 Express" - -// Arduino boards -#elif defined(ARDUINO_AVR_ADK) -#define BOARD "Mega Adk" -#elif defined(ARDUINO_AVR_BT) // Bluetooth -#define BOARD "Bt" -#elif defined(ARDUINO_AVR_DUEMILANOVE) -#define BOARD "Duemilanove" -#elif defined(ARDUINO_AVR_ESPLORA) -#define BOARD "Esplora" -#elif defined(ARDUINO_AVR_ETHERNET) -#define BOARD "Ethernet" -#elif defined(ARDUINO_AVR_FIO) -#define BOARD "Fio" -#elif defined(ARDUINO_AVR_GEMMA) -#define BOARD "Gemma" -#elif defined(ARDUINO_AVR_LEONARDO) -#define BOARD "Leonardo" -#elif defined(ARDUINO_AVR_LILYPAD) -#define BOARD "Lilypad" -#elif defined(ARDUINO_AVR_LILYPAD_USB) -#define BOARD "Lilypad Usb" -#elif defined(ARDUINO_AVR_MEGA) -#define BOARD "Mega" -#elif defined(ARDUINO_AVR_MEGA2560) -#define BOARD "Mega 2560" -#elif defined(ARDUINO_AVR_MICRO) -#define BOARD "Micro" -#elif defined(ARDUINO_AVR_MINI) -#define BOARD "Mini" -#elif defined(ARDUINO_AVR_NANO) -#define BOARD "Nano" -#elif defined(ARDUINO_AVR_NG) -#define BOARD "NG" -#elif defined(ARDUINO_AVR_PRO) -#define BOARD "Pro" -#elif defined(ARDUINO_AVR_ROBOT_CONTROL) -#define BOARD "Robot Ctrl" -#elif defined(ARDUINO_AVR_ROBOT_MOTOR) -#define BOARD "Robot Motor" -#elif defined(ARDUINO_AVR_UNO) -#define BOARD "Uno" -#elif defined(ARDUINO_AVR_YUN) -#define BOARD "Yun" -#elif defined(ARDUINO_SAMD_ZERO) -#define BOARD "Zero" - -#else -#define BOARD "Unknown" -#endif - - // Need to know the Mayfly version because the battery resistor depends on it ProcessorStats::ProcessorStats(const char* version) - : Sensor(BOARD, PROCESSOR_NUM_VARIABLES, PROCESSOR_WARM_UP_TIME_MS, + : Sensor(LOGGER_BOARD, PROCESSOR_NUM_VARIABLES, PROCESSOR_WARM_UP_TIME_MS, PROCESSOR_STABILIZATION_TIME_MS, PROCESSOR_MEASUREMENT_TIME_MS, -1, -1, 1, PROCESSOR_INC_CALC_VARIABLES), _version(version) { #if defined(ARDUINO_AVR_ENVIRODIY_MAYFLY) || defined(ARDUINO_AVR_SODAQ_MBILI) _batteryPin = A6; #elif defined(ARDUINO_AVR_FEATHER32U4) || defined(ARDUINO_SAMD_FEATHER_M0) || \ - defined(ARDUINO_SAMD_FEATHER_M0_EXPRESS) + defined(SAMD_FEATHER_M0) || defined(ARDUINO_SAMD_FEATHER_M0_EXPRESS) || \ + defined(SAMD_FEATHER_M0_EXPRESS) _batteryPin = 9; #elif defined(ARDUINO_SODAQ_ONE) || defined(ARDUINO_SODAQ_ONE_BETA) || \ defined(ARDUINO_AVR_SODAQ_NDOGO) @@ -121,7 +39,7 @@ ProcessorStats::~ProcessorStats() {} String ProcessorStats::getSensorLocation(void) { - return BOARD; + return LOGGER_BOARD; } @@ -140,6 +58,7 @@ bool ProcessorStats::addSingleMeasurementResult(void) { MS_DBG(F("Getting battery voltage from pin"), _batteryPin); float sensorValue_battery = -9999; + analogRead(_batteryPin); // priming reading #if defined(ARDUINO_AVR_ENVIRODIY_MAYFLY) if (strcmp(_version, "v0.3") == 0 || strcmp(_version, "v0.4") == 0) { @@ -166,6 +85,7 @@ bool ProcessorStats::addSingleMeasurementResult(void) { #elif defined(ARDUINO_AVR_FEATHER32U4) || defined(ARDUINO_SAMD_FEATHER_M0) || \ defined(ARDUINO_SAMD_FEATHER_M0_EXPRESS) + analogRead(_batteryPin); // priming reading float measuredvbat = analogRead(_batteryPin); measuredvbat *= 2; // we divided by 2, so multiply back measuredvbat *= 3.3; // Multiply by 3.3V, our reference voltage @@ -175,22 +95,25 @@ bool ProcessorStats::addSingleMeasurementResult(void) { #elif defined(ARDUINO_SODAQ_ONE) || defined(ARDUINO_SODAQ_ONE_BETA) if (strcmp(_version, "v0.1") == 0) { // Get the battery voltage + analogRead(_batteryPin); // priming reading float rawBattery = analogRead(_batteryPin); MS_DBG(F("Raw battery pin reading in bits:"), rawBattery); sensorValue_battery = (3.3 / 1023.) * 2 * rawBattery; MS_DBG(F("Battery in Volts:"), sensorValue_battery); } - if (strcmp(_version, "v0.2") == 0) { - // Get the battery voltage - float rawBattery = analogRead(_batteryPin); - MS_DBG(F("Raw battery pin reading in bits:"), rawBattery); - sensorValue_battery = (3.3 / 1023.) * 1.47 * rawBattery; - MS_DBG(F("Battery in Volts:"), sensorValue_battery); + if (strcmp(_version, "v0.2") == 0) + analogRead(_batteryPin); // priming reading{ + // Get the battery voltage + float rawBattery = analogRead(_batteryPin); + MS_DBG(F("Raw battery pin reading in bits:"), rawBattery); + sensorValue_battery = (3.3 / 1023.) * 1.47 * rawBattery; + MS_DBG(F("Battery in Volts:"), sensorValue_battery); } #elif defined(ARDUINO_AVR_SODAQ_NDOGO) || defined(ARDUINO_SODAQ_AUTONOMO) || \ defined(ARDUINO_AVR_SODAQ_MBILI) // Get the battery voltage + analogRead(_batteryPin); // priming reading float rawBattery = analogRead(_batteryPin); MS_DBG(F("Raw battery pin reading in bits:"), rawBattery); sensorValue_battery = (3.3 / 1023.) * 1.47 * rawBattery; diff --git a/src/sensors/ProcessorStats.h b/src/sensors/ProcessorStats.h index 34b4d95ff..ec9eb68d0 100644 --- a/src/sensors/ProcessorStats.h +++ b/src/sensors/ProcessorStats.h @@ -192,6 +192,90 @@ /**@}*/ +// EnviroDIY boards +#if defined(ARDUINO_AVR_ENVIRODIY_MAYFLY) +/// @brief Pretty text for the board name derived from the board's compiler +/// define. +#define LOGGER_BOARD "EnviroDIY Mayfly" + +// Sodaq boards +#elif defined(ARDUINO_SODAQ_EXPLORER) +#define LOGGER_BOARD "SODAQ ExpLoRer" +#elif defined(ARDUINO_SODAQ_AUTONOMO) +#define LOGGER_BOARD "SODAQ Autonomo" +#elif defined(ARDUINO_SODAQ_ONE_BETA) +#define LOGGER_BOARD "SODAQ ONE Beta" +#elif defined(ARDUINO_SODAQ_ONE) +#define LOGGER_BOARD "SODAQ ONE" +#elif defined(ARDUINO_AVR_SODAQ_MBILI) +#define LOGGER_BOARD "SODAQ Mbili" +#elif defined(ARDUINO_AVR_SODAQ_NDOGO) +#define LOGGER_BOARD "SODAQ Ndogo" +#elif defined(ARDUINO_AVR_SODAQ_TATU) +#define LOGGER_BOARD "SODAQ Tatu" +#elif defined(ARDUINO_AVR_SODAQ_MOJA) +#define LOGGER_BOARD "SODAQ Moja" + +// Adafruit boards +#elif defined(ARDUINO_AVR_FEATHER32U4) +#define LOGGER_BOARD "Feather 32u4" +#elif defined(ARDUINO_SAMD_FEATHER_M0_EXPRESS) || \ + defined(ADAFRUIT_FEATHER_M0_EXPRESS) +#define LOGGER_BOARD "Feather M0 Express" +#elif defined(ARDUINO_SAMD_FEATHER_M0) || defined(ADAFRUIT_FEATHER_M0) +#define LOGGER_BOARD "Feather M0" + +// Arduino boards +#elif defined(ARDUINO_AVR_ADK) +#define LOGGER_BOARD "Mega Adk" +#elif defined(ARDUINO_AVR_BT) // Bluetooth +#define LOGGER_BOARD "Bt" +#elif defined(ARDUINO_AVR_DUEMILANOVE) +#define LOGGER_BOARD "Duemilanove" +#elif defined(ARDUINO_AVR_ESPLORA) +#define LOGGER_BOARD "Esplora" +#elif defined(ARDUINO_AVR_ETHERNET) +#define LOGGER_BOARD "Ethernet" +#elif defined(ARDUINO_AVR_FIO) +#define LOGGER_BOARD "Fio" +#elif defined(ARDUINO_AVR_GEMMA) +#define LOGGER_BOARD "Gemma" +#elif defined(ARDUINO_AVR_LEONARDO) +#define LOGGER_BOARD "Leonardo" +#elif defined(ARDUINO_AVR_LILYPAD) +#define LOGGER_BOARD "Lilypad" +#elif defined(ARDUINO_AVR_LILYPAD_USB) +#define LOGGER_BOARD "Lilypad Usb" +#elif defined(ARDUINO_AVR_MEGA) +#define LOGGER_BOARD "Mega" +#elif defined(ARDUINO_AVR_MEGA2560) +#define LOGGER_BOARD "Mega 2560" +#elif defined(ARDUINO_AVR_MICRO) +#define LOGGER_BOARD "Micro" +#elif defined(ARDUINO_AVR_MINI) +#define LOGGER_BOARD "Mini" +#elif defined(ARDUINO_AVR_NANO) +#define LOGGER_BOARD "Nano" +#elif defined(ARDUINO_AVR_NG) +#define LOGGER_BOARD "NG" +#elif defined(ARDUINO_AVR_PRO) +#define LOGGER_BOARD "Pro" +#elif defined(ARDUINO_AVR_ROBOT_CONTROL) +#define LOGGER_BOARD "Robot Ctrl" +#elif defined(ARDUINO_AVR_ROBOT_MOTOR) +#define LOGGER_BOARD "Robot Motor" +#elif defined(ARDUINO_AVR_UNO) +#define LOGGER_BOARD "Uno" +#elif defined(ARDUINO_AVR_YUN) +#define LOGGER_BOARD "Yun" +#elif defined(ARDUINO_SAMD_ZERO) +#define LOGGER_BOARD "Zero" + +#else +#define LOGGER_BOARD "Unknown" +#endif + + // The main class for the Processor // Only need a sleep and wake since these DON'T use the default of powering // up and down From cdff86720cdc0c485c49a3b61ca75fe5fcd3178f Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Fri, 23 Aug 2024 17:48:01 -0400 Subject: [PATCH 17/24] Made ds3231 default for SAMD21 Signed-off-by: Sara Damiano --- src/LoggerBase.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/LoggerBase.h b/src/LoggerBase.h index 295190924..31902dd30 100644 --- a/src/LoggerBase.h +++ b/src/LoggerBase.h @@ -18,6 +18,9 @@ // Debugging Statement // #define MS_LOGGERBASE_DEBUG +// Set default clock for SAMD21 as DS3231 instead of built-in RTC +#define MS_SAMD_DS3231 + #ifdef MS_LOGGERBASE_DEBUG #define MS_DEBUGGING_STD "LoggerBase" #endif From b5fdb543eabfe152b694ab90cea249bc4f9f06e7 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Sun, 25 Aug 2024 23:25:56 -0400 Subject: [PATCH 18/24] Save wake pin mode Signed-off-by: Sara Damiano --- src/LoggerBase.cpp | 11 +++++++++-- src/LoggerBase.h | 9 +++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/LoggerBase.cpp b/src/LoggerBase.cpp index 6da0472a3..303730ce3 100644 --- a/src/LoggerBase.cpp +++ b/src/LoggerBase.cpp @@ -167,7 +167,8 @@ void Logger::setSDCardPins(int8_t SDCardSSPin, int8_t SDCardPowerPin) { // Sets up the wake up pin for an RTC interrupt // NOTE: This sets the pin mode but does NOT enable the interrupt! void Logger::setRTCWakePin(int8_t mcuWakePin, uint8_t wakePinMode) { - _mcuWakePin = mcuWakePin; + _mcuWakePin = mcuWakePin; + _wakePinMode = wakePinMode; if (_mcuWakePin >= 0) { pinMode(_mcuWakePin, wakePinMode); MS_DBG(F("Pin"), _mcuWakePin, F("set as RTC wake up pin")); @@ -687,6 +688,9 @@ void Logger::systemSleep(void) { return; } + // Send a message that we're getting ready + MS_DBG(F("Preparing processor for sleep. ZZzzz...")); + #if defined(MS_SAMD_DS3231) || not defined(ARDUINO_ARCH_SAMD) // Unfortunately, because of the way the alarm on the DS3231 is set up, it @@ -703,7 +707,10 @@ void Logger::systemSleep(void) { rtc.clearINTStatus(); // Set up a pin to hear clock interrupt and attach the wake ISR to it - pinMode(_mcuWakePin, INPUT_PULLUP); + MS_DBG(F("Enabling interrupts on pin"), _mcuWakePin); + // Set the pin mode, although this shouldn't really need to be re-set here + pinMode(_mcuWakePin, _wakePinMode); + // attach the interrupt enableInterrupt(_mcuWakePin, wakeISR, CHANGE); #elif defined ARDUINO_ARCH_SAMD diff --git a/src/LoggerBase.h b/src/LoggerBase.h index 31902dd30..22463960b 100644 --- a/src/LoggerBase.h +++ b/src/LoggerBase.h @@ -413,6 +413,15 @@ class Logger { * deep-sleep. */ int8_t _mcuWakePin = -1; + /** + * @brief The pin mode used for wake up on the clock alert pin. + * + * Must be either `INPUT` OR `INPUT_PULLUP` with an AVR board. On a SAM/D + * board `INPUT_PULLDOWN` is also an option. Optional with a default value + * of `INPUT_PULLUP`. The DS3231 has an active low interrupt, so the + * pull-up resistors should be enabled. + */ + uint8_t _wakePinMode = INPUT_PULLUP; /** * @brief Digital pin number on the mcu used to output an alert that the * logger is measuring. From f683dd8b58861e3d884c9fc6a49aeb6f2742433f Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Sun, 25 Aug 2024 23:26:28 -0400 Subject: [PATCH 19/24] Only actualy use Enable Interrupt for AVR. It's just a macro re-write for others. Signed-off-by: Sara Damiano --- src/ModSensorInterrupts.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ModSensorInterrupts.h b/src/ModSensorInterrupts.h index cb3650f81..dbb89c7cf 100644 --- a/src/ModSensorInterrupts.h +++ b/src/ModSensorInterrupts.h @@ -14,9 +14,7 @@ #ifndef SRC_MODSENSORINTERRUPTS_H_ #define SRC_MODSENSORINTERRUPTS_H_ -#if defined(__AVR__) || defined(ARDUINO_ARCH_AVR) || defined __SAM3U4E__ || \ - defined __SAM3X8E__ || defined __SAM3X8H__ || defined ARDUINO_SAMD_ZERO || \ - defined __SAMD21G18A__ || defined __SAMD21J18A__ +#if defined(__AVR__) // #define LIBCALL_ENABLEINTERRUPT // To prevent compiler/linker crashes #include // To handle external and pin change interrupts #else From ea7449ef3ad17aac19bf2141c1dc5997e4b3c510 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Sun, 25 Aug 2024 23:30:32 -0400 Subject: [PATCH 20/24] Re-wrote SAMD clock configs Signed-off-by: Sara Damiano --- src/LoggerBase.cpp | 101 +++++++++++++++-------- src/WatchDogs/WatchDogSAMD.cpp | 143 ++++++++++++++++++++++++++++----- 2 files changed, 192 insertions(+), 52 deletions(-) diff --git a/src/LoggerBase.cpp b/src/LoggerBase.cpp index 303730ce3..0d4ff60de 100644 --- a/src/LoggerBase.cpp +++ b/src/LoggerBase.cpp @@ -713,6 +713,26 @@ void Logger::systemSleep(void) { // attach the interrupt enableInterrupt(_mcuWakePin, wakeISR, CHANGE); +#if defined ARDUINO_ARCH_SAMD && not defined(__SAMD51__) + // Reconfigure the clock after attaching the interrupt + // This is needed because the attachInterrupt function will reconfigure the + // clock source for the EIC to GCLK0 every time a new interrupt is attached + // - and after being detached, reattaching the same interrupt is just like a + // new one). We need to switch the EIC source back to our configured GCLK2. + Serial.println(F("Re-attaching the EIC to GCLK2")); + GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(2) | // Select generic clock 2 + GCLK_CLKCTRL_CLKEN | // Enable the generic clock clontrol + GCLK_CLKCTRL_ID(GCM_EIC); // Feed the GCLK to the EIC + while (GCLK->STATUS.bit.SYNCBUSY) { + // Wait for synchronization + } + + // get the interrupt number associated with the pin + EExt_Interrupts in = g_APinDescription[_mcuWakePin].ulExtInt; + // Enable wakeup capability on pin in case being used during sleep + EIC->WAKEUP.reg |= (1 << in); +#endif // defined ARDUINO_ARCH_SAMD && not defined(__SAMD51__) + #elif defined ARDUINO_ARCH_SAMD // Make sure interrupts are enabled for the clock @@ -729,22 +749,11 @@ void Logger::systemSleep(void) { zero_sleep_rtc.setAlarmSeconds(59); zero_sleep_rtc.enableAlarm(zero_sleep_rtc.MATCH_SS); -#endif - - // Send one last message before shutting down serial ports - MS_DBG(F("Putting processor to sleep. ZZzzz...")); +#endif // defined(MS_SAMD_DS3231) || not defined(ARDUINO_ARCH_SAMD) -// Wait until the serial ports have finished transmitting -// This does not clear their buffers, it just waits until they are finished -// TODO(SRGDamia1): Make sure can find all serial ports -#if defined(STANDARD_SERIAL_OUTPUT) - STANDARD_SERIAL_OUTPUT.flush(); // for debugging -#endif -#if defined DEBUGGING_SERIAL_OUTPUT - DEBUGGING_SERIAL_OUTPUT.flush(); // for debugging -#endif // Stop any I2C connections + MS_DEEP_DBG(F("Ending I2C")); // This function actually disables the two-wire pin functionality and // turns off the internal pull-up resistors. Wire.end(); @@ -760,37 +769,65 @@ void Logger::systemSleep(void) { digitalWrite(SCL, LOW); #endif -#if defined ARDUINO_ARCH_SAMD - // Disable the watch-dog timer + MS_DEEP_DBG(F("Disabling the watchdog")); watchDogTimer.disableWatchDog(); -#ifndef USE_TINYUSB +// Wait until the serial ports have finished transmitting +// This does not clear their buffers, it just waits until they are finished +// TODO(SRGDamia1): Make sure can find all serial ports +#if defined(STANDARD_SERIAL_OUTPUT) + STANDARD_SERIAL_OUTPUT.flush(); // for debugging +#endif +#if defined DEBUGGING_SERIAL_OUTPUT + DEBUGGING_SERIAL_OUTPUT.flush(); // for debugging +#endif + +#if defined ARDUINO_ARCH_SAMD + +#ifndef USE_TINYUSB&& defined(USBCON) // Detach the USB, iff not using TinyUSB - MS_DEEP_DBG(F("USBDevice.detach")); + MS_DEEP_DBG(F("Detaching USB")); + Serial.flush(); // wait for any outgoing messages on Serial = USB USBDevice.detach(); - MS_DEEP_DBG(F("USBDevice.end")); USBDevice.end(); USBDevice.standby(); #endif + // Copied from Adafruit SleepDog + // Enable standby sleep mode (deepest sleep) and activate. + // Insights from Atmel ASF library. + + // NOTE: The macros SAMD20_SERIES and SAMD21_SERIES capture all of the MCU + // defines for all processors in that series. + #if defined(__SAMD51__) + // Set the sleep config // PM_SLEEPCFG_SLEEPMODE_BACKUP = 0x4 PM->SLEEPCFG.bit.SLEEPMODE = 0x4; while (PM->SLEEPCFG.bit.SLEEPMODE != 0x4) ; // Wait for it to take #else - // Disable systick interrupt: See - // https://www.avrfreaks.net/forum/samd21-samd21e16b-sporadically-locks-and-does-not-wake-standby-sleep-mode + // Don't fully power down flash when in sleep + // Adafruit SleepDog and ArduinoLowPower both do this. + // TODO: Figure out if this is really necessary + // NVMCTRL->CTRLB.bit.SLEEPPRM = NVMCTRL_CTRLB_SLEEPPRM_DISABLED_Val; + + // Disable systick interrupt // Due to a hardware bug on the SAMD21, the SysTick interrupts become active // before the flash has powered up from sleep, causing a hard fault. To // prevent this the SysTick interrupts are disabled before entering sleep // mode. SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; - // Now go to sleep + // Set the sleep config + // SCB = System Control Space Base Address + // SCR = System Control Register + // SCB_SCR_SLEEPDEEP_Msk = (1UL << 2U), the position of the deep sleep bit + // in the system control register SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; #endif + // Actually sleep __DSB(); // Data sync to ensure outgoing memory accesses complete __WFI(); // Wait for interrupt (places device in sleep mode) @@ -812,9 +849,6 @@ void Logger::systemSleep(void) { // SLEEP_MODE_PWR_DOWN -the most power savings set_sleep_mode(SLEEP_MODE_PWR_DOWN); - // Disable the watch-dog timer - watchDogTimer.disableWatchDog(); - // Temporarily disables interrupts, so no mistakes are made when writing // to the processor registers noInterrupts(); @@ -857,13 +891,12 @@ void Logger::systemSleep(void) { // -- The portion below this happens on wake up, after any wake ISR's -- #if defined ARDUINO_ARCH_SAMD -#if (SAMD20_SERIES || SAMD21_SERIES) - // Reattach the USB after waking +#if not defined(__SAMD51__) // Enable systick interrupt SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; #endif // Reattach the USB -#ifndef USE_TINYUSB +#ifndef USE_TINYUSB&& defined(USBCON) USBDevice.init(); USBDevice.attach(); #endif @@ -891,10 +924,15 @@ void Logger::systemSleep(void) { #endif + // Wake-up message + MS_DBG(F("\n\n\n... zzzZZ Processor is now awake!")); + // Re-enable the watch-dog timer + MS_DEEP_DBG(F("Re-enabling the watchdog")); watchDogTimer.enableWatchDog(); -// Re-start the I2C interface + // Re-start the I2C interface + MS_DEEP_DBG(F("Restarting I2C")); #ifdef SDA pinMode(SDA, INPUT_PULLUP); // set as input with the pull-up on #endif @@ -915,17 +953,16 @@ void Logger::systemSleep(void) { // Stop the clock from sending out any interrupts while we're awake. // There's no reason to waste thought on the clock interrupt if it // happens while the processor is awake and doing other things. + MS_DEEP_DBG(F("Unsetting the alarm on the DS2321")); rtc.disableInterrupts(); // Detach the from the pin disableInterrupt(_mcuWakePin); #elif defined ARDUINO_ARCH_SAMD + MS_DEEP_DBG(F("Unsetting the alarm on the built in RTC")); zero_sleep_rtc.disableAlarm(); #endif - // Wake-up message - MS_DBG(F("\n\n\n... zzzZZ Processor is now awake!")); - // The logger will now start the next function after the systemSleep // function in either the loop or setup } @@ -1340,7 +1377,7 @@ void Logger::begin() { F("minute intervals.")); #if defined(ARDUINO_ARCH_SAMD) - MS_DBG(F("Disabling the USB on stnadby to lower sleep current")); + MS_DBG(F("Disabling the USB on standby to lower sleep current")); USB->DEVICE.CTRLA.bit.ENABLE = 0; // Disable the USB peripheral while (USB->DEVICE.SYNCBUSY.bit.ENABLE) ; // Wait for synchronization diff --git a/src/WatchDogs/WatchDogSAMD.cpp b/src/WatchDogs/WatchDogSAMD.cpp index 7163ac823..4c176ad8f 100644 --- a/src/WatchDogs/WatchDogSAMD.cpp +++ b/src/WatchDogs/WatchDogSAMD.cpp @@ -34,6 +34,7 @@ void extendedWatchDogSAMD::setupWatchDog(uint32_t resetTime_s) { F("times before the reset.")); // Disable watchdog for config + MS_DEEP_DBG(F("Disabling the watchdog for configuration.")); #if defined(__SAMD51__) WDT->CTRLA.reg = 0; #else @@ -44,47 +45,149 @@ void extendedWatchDogSAMD::setupWatchDog(uint32_t resetTime_s) { #if defined(__SAMD51__) // SAMD51 WDT uses OSCULP32k as input clock now // section: 20.5.3 + MS_DEEP_DBG(F("Configuring the output of the ultra-low power internal 32k " + "oscillator for the watchdog.")); OSC32KCTRL->OSCULP32K.bit.EN1K = 1; // Enable out 1K (for WDT) OSC32KCTRL->OSCULP32K.bit.EN32K = 0; // Disable out 32K - waitForWDTBitSync(); - USB->DEVICE.CTRLA.bit.ENABLE = 0; // Disable the USB peripheral + MS_DEEP_DBG(F("Making sure the the USB will be disabled on standby.")); + USB->DEVICE.CTRLA.bit.ENABLE = 0; // Disable the USB peripheral for config while (USB->DEVICE.SYNCBUSY.bit.ENABLE) { // Wait for synchronization } USB->DEVICE.CTRLA.bit.RUNSTDBY = 0; // Deactivate run on standby - USB->DEVICE.CTRLA.bit.ENABLE = 1; // Enable the USB peripheral + USB->DEVICE.CTRLA.bit.ENABLE = 1; // Re-enable the USB peripheral while (USB->DEVICE.SYNCBUSY.bit.ENABLE) { // Wait for synchronization } #else // SAMD21 - // We're going to use generic clock generator *5* - // Many watch-dog examples use 2, but this conflicts with RTC-zero - // Generic clock generator 5, divisor = 32 (2^(DIV+1)) = 4 - GCLK->GENDIV.reg = GCLK_GENDIV_ID(5) | // Select Generic Clock Generator 5 + // Within the SAMD core for the SAMD21 + // SystemInit() in startup.c configures these clocks: + // 1) Enable XOSC32K clock (External on-board 32.768Hz oscillator) or + // OSC32K (if crystalless). + // - This will be used as DFLL48M reference. + // 2) Put XOSC32K as source of Generic Clock Generator 1 + // 3) Put Generic Clock Generator 1 as source for Generic Clock Multiplexer + // 0 (DFLL48M reference) + // 4) Enable DFLL48M clock + // 5) Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. + // 6) Modify PRESCaler value of OSCM to have 8MHz + // 7) Put OSC8M as source for Generic Clock Generator 3 + // See: + // https://github.com/adafruit/ArduinoCore-samd/blob/ce20340620bfd9c545649ee5c4873888ee0475d0/cores/arduino/startup.c#L311 + + // The ZeroPowerManager library changes clocks (including the main clock + // source, GCLK_MAIN, which is always sourced from GCLKGEN[0]) to reduce + // power draw. Changing the GCLK_MAIN configuration will cause some + // functions like delay() to operate incorrectly. See: + // https://github.com/ee-quipment/ZeroPowerManager/blob/master/ZeroPowerManager.c#L170 + // To avoid any confusing with delay(), we're not going to change anything + // with GCLK0. This means we won't be in the lowest power state like that + // offered by ZeroPowerManager + // TODO: Revisit this decision + + // After a power-on reset, the clock generators for peripherals default to: + // RTC: GCLK0 + // WDT: GCLK2 + // Anything else: GCLK0 + + // We're going to configure generic clock generator 2, which is the default + // for the watchdog. RTCZero uses the same clock for the RTC. Because we're + // using identical divisors and prescalers, we can share the clock + // generator. We will also use the very same generator for the external + // nterrupt controller (EIC). + + // The watchdog must be attached to a clock source so it can tell how much + // time has passed and whether it needs to bite. + + // The external interrupt controller must be attached to a on clock to tell + // the difference between rising and falling interrupts. If the external + // interupt controller is not attached to a running clock, then interrupts + // will not work! Thus, if the clock source for interrupts is not running in + // standby, the interrupts will not be able to wake the device. In + // WInterrupts.c in the Adafruit SAMD core, generic clock generator 0 (ie + // GCLK_MAIN) is used for the EIC peripheral. See: + // https://github.com/adafruit/ArduinoCore-samd/blob/ce20340620bfd9c545649ee5c4873888ee0475d0/cores/arduino/WInterrupts.c#L56 + // We'll shift the interrupts to clock 2, configured to our liking. + + // Configure the generic clock generator divisor for generator 2 + // The divisor register must be configured before generator control register + // Generic clock generator 2, divisor = 32 (2^(DIV+1)) = 4 + GCLK->GENDIV.reg = GCLK_GENDIV_ID(2) | // Select Generic Clock Generator 5 GCLK_GENDIV_DIV(4); // Divide the clock source by 32 while (GCLK->STATUS.bit.SYNCBUSY) { // Wait for synchronization } - // Enable clock generator 5 using low-power 32.768kHz oscillator. - // With /32 divisor above, this yields 1024Hz clock. - GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(5) | // Select GCLK5 - GCLK_GENCTRL_GENEN | // Enable the generic clock clontrol - GCLK_GENCTRL_SRC_OSCULP32K | // Select the ultra-low power oscillator - GCLK_GENCTRL_IDC | // Set the duty cycle to 50/50 HIGH/LOW +// Configure the generic clock generator 2 to use the 32.768kHz external or +// internal oscillator and the divisor above. +// With /32 divisor above, this yields 1024Hz clock. +// By default, the XOSC32K is stopped in standby, while the default for the +// OSCULP32K is to run in standby. +// NOTE: there is also a generic XOSC which can be attached to crystal of any +// frequency from 0.4-32MHz, but we're only supporting a 32.768kHz crystal. +#ifndef CRYSTALLESS + // If there is an external 32.768 kHz crystal, use it + + // configure the settings for the oscillator + + MS_DEEP_DBG(F("Configuring the external 32k oscillator.")); + SYSCTRL->XOSC32K.reg = + SYSCTRL_XOSC32K_ONDEMAND | // run only when demanded by a peripheral + SYSCTRL_XOSC32K_RUNSTDBY | // run the external oscillator in standby + // (iff demanded by peripheral) + SYSCTRL_XOSC32K_EN32K | // enable the 32kHz output + SYSCTRL_XOSC32K_XTALEN | // specify that the crystal is connected + // between XIN32/XOUT32 + SYSCTRL_XOSC32K_STARTUP(6) | // set the start up to 0x6 (??) + SYSCTRL_XOSC32K_ENABLE; // enable the oscillator + + // source GCLK2 from the external oscillator + MS_DEEP_DBG(F("Setting the external 32k oscillator as the clock source for " + "the generic clock generator 2.")); + GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(2) | // Select GCLK2 + GCLK_GENCTRL_GENEN | // Enable the generic clock clontrol + GCLK_GENCTRL_SRC_XOSC32K | // Select the external crystal + GCLK_GENCTRL_RUNSTDBY | // DO run in standby GCLK_GENCTRL_DIVSEL; // Select to divide clock by the prescaler above - while (GCLK->STATUS.bit.SYNCBUSY) { - // Wait for synchronization - } - // Feed GCLK5 to WDT (Watchdog Timer) - GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN_GCLK5 | // Select generic clock 5 - GCLK_CLKCTRL_CLKEN | // Enable the generic clock clontrol - GCLK_CLKCTRL_ID_WDT; // Feed the GCLK to the WDT +#else + // If there isn't an external crystal, use the built-in ultra-low power + // internal 32.768kHz oscillator. + + // NOTE: There are no settings we need to configure for ultra-low power + // internal oscillator (OSCULP32K). The only things that can be configured + // are the write lock and over-writing the factory calibration. We don't + // want to do either of those. + + // source GCLK2 from the external oscillator + MS_DEEP_DBG(F("Setting the ultra-low power internal 32k oscillator as the " + "clock source for the generic clock generator 2.")); + GCLK->GENCTRL.reg = GCLK_GENCTRL_ID(2) | // Select GCLK2 + GCLK_GENCTRL_GENEN | // Enable the generic clock clontrol + GCLK_GENCTRL_SRC_OSCULP32K | // built-in ultra-low power internal + // oscillator + GCLK_GENCTRL_RUNSTDBY | // DO run in standby + GCLK_GENCTRL_DIVSEL; // Select to divide clock by + // the prescaler above +#endif + while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) + ; // Wait for synchronization + + GCLK->GENCTRL.bit.RUNSTDBY = 1; // run standby + while (GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY) + ; // Wait for synchronization + + // Feed configured GCLK2 to WDT (Watchdog Timer) **AND** the EIC (external + // interrupt controller) + MS_DEEP_DBG(F("Feeding configured GCLK2 to WDT and EIC")); + GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(2) | // Select generic clock 2 + GCLK_CLKCTRL_CLKEN | // Enable the generic clock clontrol + GCLK_CLKCTRL_ID(GCM_WDT) | // Feed the GCLK to the WDT + GCLK_CLKCTRL_ID(GCM_EIC); // Feed the GCLK to the EIC while (GCLK->STATUS.bit.SYNCBUSY) { // Wait for synchronization } From 37ee8019077ac1b1d7d7dc9e007b9deecbad07fe Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Sun, 25 Aug 2024 23:39:34 -0400 Subject: [PATCH 21/24] Update changelog, bump version Signed-off-by: Sara Damiano --- ChangeLog.md | 22 +++++++++++++++++++--- VERSION | 2 +- docs/Doxyfile | 2 +- library.json | 2 +- library.properties | 2 +- src/LoggerBase.cpp | 2 +- src/ModularSensors.h | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index fc8f7d2ec..f28d4a38e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,8 +12,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Changed -- Switched to reusable workflows for CI - ### Added ### Removed @@ -23,6 +21,21 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm *** +## [0.35.1] + +### Changed + +- **BREAKING** Switched default clock for SAMD21 from the built-in 32bit RTC to the DS3231. +*This is not be a permanent change.* +- Switched to reusable workflows for CI + +### Fixed + +Fixed clock configuration for SAMD21 + +*** + + ## [0.35.0] ### Changed @@ -831,7 +844,10 @@ Our first release of the modular sensors library to support easily logging data *** -[Unreleased]: https://github.com/EnviroDIY/ModularSensors/compare/v0.33.4...HEAD +[Unreleased]: https://github.com/EnviroDIY/ModularSensors/compare/v0.35.1...HEAD +[0.35.1]: https://github.com/EnviroDIY/ModularSensors/releases/tag/v0.35.1 +[0.35.0]: https://github.com/EnviroDIY/ModularSensors/releases/tag/v0.35.0 +[0.34.0]: https://github.com/EnviroDIY/ModularSensors/releases/tag/v0.34.0 [0.33.4]: https://github.com/EnviroDIY/ModularSensors/releases/tag/v0.33.4 [0.33.3]: https://github.com/EnviroDIY/ModularSensors/releases/tag/v0.33.3 [0.33.2]: https://github.com/EnviroDIY/ModularSensors/releases/tag/v0.33.2 diff --git a/VERSION b/VERSION index 7b52f5e51..731b95d7f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.35.0 +0.35.1 diff --git a/docs/Doxyfile b/docs/Doxyfile index f1c5914d1..2a6aa481d 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -48,7 +48,7 @@ PROJECT_NAME = ModularSensors # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 0.35.0 +PROJECT_NUMBER = 0.35.1 # 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 diff --git a/library.json b/library.json index 687ebf63a..a964d33f7 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "EnviroDIY_ModularSensors", - "version": "0.35.0", + "version": "0.35.1", "description": "A library that allows access to multiple sensors through a unified interface. This allows the user to simply access many sensors to log the data or send the data to data repositories like the EnviroDIY data portal.", "keywords": "modular, sensor, sensors, datalogger, logger, low power, sleeping, EnviroDIY, ModularSensors, Mayfly, WikiWatershed, Monitor My Watershed, ThingSpeak", "platforms": "atmelavr, atmelsam", diff --git a/library.properties b/library.properties index 8fd05ee5d..755fd5d22 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=ModularSensors -version=0.35.0 +version=0.35.1 author=Sara Damiano , Shannon Hicks maintainer=Sara Damiano sentence=A library that allows access to multiple sensors through a unified interface. diff --git a/src/LoggerBase.cpp b/src/LoggerBase.cpp index 0d4ff60de..3c8564458 100644 --- a/src/LoggerBase.cpp +++ b/src/LoggerBase.cpp @@ -719,7 +719,7 @@ void Logger::systemSleep(void) { // clock source for the EIC to GCLK0 every time a new interrupt is attached // - and after being detached, reattaching the same interrupt is just like a // new one). We need to switch the EIC source back to our configured GCLK2. - Serial.println(F("Re-attaching the EIC to GCLK2")); + MS_DEEP_DBG(F("Re-attaching the EIC to GCLK2")); GCLK->CLKCTRL.reg = GCLK_CLKCTRL_GEN(2) | // Select generic clock 2 GCLK_CLKCTRL_CLKEN | // Enable the generic clock clontrol GCLK_CLKCTRL_ID(GCM_EIC); // Feed the GCLK to the EIC diff --git a/src/ModularSensors.h b/src/ModularSensors.h index 313cb58cd..6b07cc4c5 100644 --- a/src/ModularSensors.h +++ b/src/ModularSensors.h @@ -19,7 +19,7 @@ * A pre-release version will always be indicated as slightly ahead of the * EnviroDIY branch that it is based on. */ -#define MODULAR_SENSORS_VERSION "0.35.0" +#define MODULAR_SENSORS_VERSION "0.35.1" // To support interrupts #include "ModSensorInterrupts.h" From dd729449b5ac1f93c7e34b2cb38fd489c6c539d5 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Mon, 26 Aug 2024 00:53:19 -0400 Subject: [PATCH 22/24] Don't attempt bad version of KellerModbus Signed-off-by: Sara Damiano --- continuous_integration/dependencies.json | 112 +++++++++++++++++------ library.json | 6 +- 2 files changed, 87 insertions(+), 31 deletions(-) diff --git a/continuous_integration/dependencies.json b/continuous_integration/dependencies.json index 874230ccb..a59eeceec 100644 --- a/continuous_integration/dependencies.json +++ b/continuous_integration/dependencies.json @@ -1,14 +1,17 @@ { - "action_cache_version": 18, + "action_cache_version": 19, "dependencies": [ { "name": "EnviroDIY_DS3231", "owner": "envirodiy", "library id": "2079", "url": "https://github.com/EnviroDIY/Sodaq_DS3231", - "version": "~1.3.4", + "version": "~1.3.5", "note": "An Arduino library for the DS3231 RTC (Real Time Clock), based off of the Sodaq_DS3231 library.", - "authors": ["Kees Bakker", "Sara Damiano"], + "authors": [ + "Kees Bakker", + "Sara Damiano" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -19,7 +22,9 @@ "url": "https://github.com/arduino-libraries/RTCZero", "version": "~1.6.0", "note": "Functions for using the processor real time clock in SAMD21 processors", - "authors": ["Arduino"], + "authors": [ + "Arduino" + ], "frameworks": "arduino", "platforms": "atmelsam" }, @@ -30,7 +35,9 @@ "url": "https://github.com/GreyGnome/EnableInterrupt", "version": "~1.1.0", "note": "GreyGnome's EnableInterrupt - Assign an interrupt to any supported pin on all Arduinos", - "authors": ["Mike 'GreyGnome' Schwager"], + "authors": [ + "Mike 'GreyGnome' Schwager" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -41,7 +48,9 @@ "url": "https://github.com/greiman/SdFat", "version": "~2.2.3", "note": "SdFat - FAT16/FAT32 file system for SD cards.", - "authors": ["Bill Greiman"], + "authors": [ + "Bill Greiman" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -50,7 +59,10 @@ "owner": "vshymanskyy", "version": "~0.11.7", "note": "A small Arduino library for GPRS modules.", - "authors": ["Volodymyr Shymanskyy", "Sara Damiano"], + "authors": [ + "Volodymyr Shymanskyy", + "Sara Damiano" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -59,9 +71,11 @@ "owner": "knolleary", "library id": "89", "url": "https://github.com/knolleary/pubsubclient", - "version": "~2.8", + "version": "~2.8.0", "note": "A client library for MQTT messaging.", - "authors": ["Nick O'Leary"] + "authors": [ + "Nick O'Leary" + ] }, { "name": "Adafruit BusIO", @@ -70,7 +84,9 @@ "url": "https://github.com/adafruit/Adafruit_BusIO", "version": "~1.16.0", "note": "Adafruit BusIO, a dependency of other Adafruit libraries", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -81,7 +97,9 @@ "url": "https://github.com/adafruit/Adafruit_Sensor", "version": "~1.1.14", "note": "Adafruit's unified sensor library is used by their other libraries", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -91,7 +109,9 @@ "version_note": "=1.2.0", "version": "https://github.com/soligen2010/Adafruit_ADS1X15.git#7d67b451f739e9a63f40f2d6d139ab582258572b", "note": "Driver for TI's ADS1015: 12-bit Differential or Single-Ended ADC with PGA and Comparator. This fork removes bugs in the Adafruit original library.", - "authors_note": ["soligen2010"], + "authors_note": [ + "soligen2010" + ], "frameworks_note": "arduino", "platforms_note": "*" }, @@ -102,7 +122,9 @@ "url": "https://github.com/adafruit/Adafruit_AM2315", "version": "~2.2.3", "note": "AOSong AM2315 I2C Temp/Humidity Sensor Library by Adafruit", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -113,7 +135,9 @@ "url": "https://github.com/adafruit/Adafruit_BME280_Library", "version": "~2.2.4", "note": "Bosch BME280 Temp/Humidity/Pressure Sensor Library by Adafruit", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -122,7 +146,9 @@ "owner": "MartinL1", "version": "~1.0.11", "note": "An Arduino compatible, non-blocking, I2C/SPI library for the Bosch BMP388 barometer.", - "authors": ["Martin Lindupp"], + "authors": [ + "Martin Lindupp" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -133,7 +159,9 @@ "url": "https://github.com/adafruit/DHT-sensor-library", "version": "~1.4.6", "note": "AOSong DHT Sensor Library by Adafruit", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -144,7 +172,9 @@ "url": "https://github.com/adafruit/Adafruit_INA219", "version": "~1.2.3", "note": "This is a library for the Adafruit INA219 high side DC current sensor boards", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -155,7 +185,9 @@ "url": "https://github.com/adafruit/Adafruit_MPL115A2", "version": "~2.0.2", "note": "MPL115A2 Barometer Library by Adafruit", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino" }, { @@ -165,7 +197,9 @@ "url": "https://github.com/adafruit/Adafruit_SHT4X", "version": "~1.0.4", "note": "Sensirion SHT4x Library by Adafruit", - "authors": ["Adafruit"], + "authors": [ + "Adafruit" + ], "frameworks": "arduino" }, { @@ -199,7 +233,12 @@ "url": "https://github.com/milesburton/Arduino-Temperature-Control-Library", "version": "~3.11.0", "note": "DallasTemperature - Arduino Library for Dallas Temperature ICs (DS18B20, DS18S20, DS1822, DS1820)", - "authors": ["Guil Barros", "Miles Burton", "Rob Tillart", "Tim Nuewsome"], + "authors": [ + "Guil Barros", + "Miles Burton", + "Rob Tillart", + "Tim Nuewsome" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -226,14 +265,22 @@ "url": "https://github.com/NorthernWidget/MS5803", "version": "~0.1.2", "note": "General interface to MS5803-series pressure transducers", - "authors": ["Bobby Schulz", "Andrew Wickert", "Chad Sandell", "Sara Damiano"] + "authors": [ + "Bobby Schulz", + "Andrew Wickert", + "Chad Sandell", + "Sara Damiano" + ] }, { "name": "Tally_Library_I2C", "version": "https://github.com/EnviroDIY/Tally_Library.git#Dev_I2C", "version_note": "Uses `Dev_I2C` feature branch", "note": "An Arduino library for interfacing to the Project Tally Event counter from NorthernWidget.", - "authors": ["Bobby Schulz", "Anthony Aufdenkampe"], + "authors": [ + "Bobby Schulz", + "Anthony Aufdenkampe" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -244,7 +291,9 @@ "url": "https://github.com/EnviroDIY/SensorModbusMaster", "version": "~0.6.8", "note": "EnviroDIY SensorModbusMaster - Arduino library for communicating via modbus with the Arduino acting as the modbus master.", - "authors": ["Sara Damiano"], + "authors": [ + "Sara Damiano" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -253,9 +302,11 @@ "owner": "envirodiy", "library id": "5439", "url": "https://github.com/EnviroDIY/KellerModbus", - "version": "~0.2.2", + "version": "~0.2.3", "note": "Arduino library for communication with Keller pressure and water level sensors via Modbus.", - "authors": ["Anthony Aufdenkampe"] + "authors": [ + "Anthony Aufdenkampe" + ] }, { "name": "YosemitechModbus", @@ -264,7 +315,10 @@ "url": "https://github.com/EnviroDIY/YosemitechModbus", "version": "~0.4.1", "note": "Arduino library for communication with Yosemitech sensors via Modbus.", - "authors": ["Sara Damiano", "Anthony Aufdenkampe"], + "authors": [ + "Sara Damiano", + "Anthony Aufdenkampe" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" }, @@ -274,9 +328,11 @@ "url": "https://github.com/EnviroDIY/GroPointModbus.git", "version": "~0.1.0", "note": "A library to use an Arduino as a master to control and communicate via modbus with GroPoint soil moisture sensors. ", - "authors": ["Anthony Aufdenkampe"], + "authors": [ + "Anthony Aufdenkampe" + ], "frameworks": "arduino", "platforms": "atmelavr, atmelsam" } ] -} +} \ No newline at end of file diff --git a/library.json b/library.json index a964d33f7..a8518e866 100644 --- a/library.json +++ b/library.json @@ -67,7 +67,7 @@ "owner": "envirodiy", "library id": "2079", "url": "https://github.com/EnviroDIY/Sodaq_DS3231", - "version": "~1.3.4", + "version": "~1.3.5", "note": "An Arduino library for the DS3231 RTC (Real Time Clock), based off of the Sodaq_DS3231 library.", "authors": ["Kees Bakker", "Sara Damiano"], "frameworks": "arduino", @@ -120,7 +120,7 @@ "owner": "knolleary", "library id": "89", "url": "https://github.com/knolleary/pubsubclient", - "version": "~2.8", + "version": "~2.8.0", "note": "A client library for MQTT messaging.", "authors": ["Nick O'Leary"] }, @@ -314,7 +314,7 @@ "owner": "envirodiy", "library id": "5439", "url": "https://github.com/EnviroDIY/KellerModbus", - "version": "~0.2.2", + "version": "~0.2.3", "note": "Arduino library for communication with Keller pressure and water level sensors via Modbus.", "authors": ["Anthony Aufdenkampe"] }, From a3f5dada096dfec5f74a79f37d8fceedb3c468c6 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Mon, 26 Aug 2024 01:13:10 -0400 Subject: [PATCH 23/24] Fix release inputs Signed-off-by: Sara Damiano --- .github/workflows/prepare_release.yaml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prepare_release.yaml b/.github/workflows/prepare_release.yaml index 62f618b3e..6bcf69a7e 100644 --- a/.github/workflows/prepare_release.yaml +++ b/.github/workflows/prepare_release.yaml @@ -6,6 +6,12 @@ on: paths: - 'VERSION' # Push events when the VERSION file changes workflow_dispatch: + inputs: + include_dependencies: + description: 'True to include a zip file with dependencies in the release' + required: false + type: boolean + default: true name: Create a New Release @@ -45,5 +51,4 @@ jobs: uses: EnviroDIY/workflows/.github/workflows/prepare_release.yaml@main secrets: inherit with: - library-manager: 'update' - library-compliance: 'strict' + include_dependencies: ${{ ( true ) || (github.event_name == 'workflow_dispatch' && github.event.inputs.publish == 'true') }} From eb03a690fed68ec5fc3a2e35fb335656351f5ec4 Mon Sep 17 00:00:00 2001 From: Sara Damiano Date: Mon, 26 Aug 2024 02:24:24 -0400 Subject: [PATCH 24/24] Fixed define check Signed-off-by: Sara Damiano --- src/LoggerBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LoggerBase.cpp b/src/LoggerBase.cpp index 3c8564458..07078d116 100644 --- a/src/LoggerBase.cpp +++ b/src/LoggerBase.cpp @@ -785,7 +785,7 @@ void Logger::systemSleep(void) { #if defined ARDUINO_ARCH_SAMD -#ifndef USE_TINYUSB&& defined(USBCON) +#if not defined(USE_TINYUSB) && defined(USBCON) // Detach the USB, iff not using TinyUSB MS_DEEP_DBG(F("Detaching USB")); Serial.flush(); // wait for any outgoing messages on Serial = USB @@ -896,7 +896,7 @@ void Logger::systemSleep(void) { SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; #endif // Reattach the USB -#ifndef USE_TINYUSB&& defined(USBCON) +#if not defined(USE_TINYUSB) && defined(USBCON) USBDevice.init(); USBDevice.attach(); #endif