1
mirror of https://github.com/flipperdevices/flipperzero-firmware.git synced 2025-12-12 20:59:50 +04:00

fbt: doxygen target (#3510)

* fbt: doxygen target
* github: adjustments for doxygen
* github: always generate docs, only upload for dev
* doxygen: fixed exclusion path for awesome-css
* github: stricter check for push ref
* github: bumped action version to fix node.js deprecation
* github: added PVS report url to workflow summary
* github: pvs: reworked report URL handling
* github: added size report to summary
* docs: added `doxygen` target
* fbt: common naming scheme for COMSTR
* Documentation: fix warnings and errors
* Doxygen: stricter warning checks
* fbt: "doxy" target, opens generated doxygen documentation in browser
* github: doxygen: now using edge (1.10) version

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
hedger
2024-03-20 20:32:53 +04:00
committed by GitHub
parent 558f75672f
commit ee36c66572
16 changed files with 1021 additions and 680 deletions

View File

@@ -129,7 +129,7 @@ jobs:
- name: 'Find previous comment' - name: 'Find previous comment'
if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }} if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }}
uses: peter-evans/find-comment@v2 uses: peter-evans/find-comment@v3
id: find-comment id: find-comment
with: with:
issue-number: ${{ github.event.pull_request.number }} issue-number: ${{ github.event.pull_request.number }}
@@ -138,7 +138,7 @@ jobs:
- name: 'Create or update comment' - name: 'Create or update comment'
if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }} if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }}
uses: peter-evans/create-or-update-comment@v3 uses: peter-evans/create-or-update-comment@v4
with: with:
comment-id: ${{ steps.find-comment.outputs.comment-id }} comment-id: ${{ steps.find-comment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }} issue-number: ${{ github.event.pull_request.number }}
@@ -147,6 +147,7 @@ jobs:
- [📦 Update package](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz) - [📦 Update package](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz)
- [📥 DFU file](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-full-${{steps.names.outputs.suffix}}.dfu) - [📥 DFU file](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-full-${{steps.names.outputs.suffix}}.dfu)
- [☁️ Web/App updater](https://lab.flipper.net/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}}) - [☁️ Web/App updater](https://lab.flipper.net/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}})
- [📊 Size report](https://fw-reports.flipp.dev/?branch=${{steps.names.outputs.branch_name}})
edit-mode: replace edit-mode: replace
- name: 'SDK submission to staging catalog' - name: 'SDK submission to staging catalog'

View File

@@ -4,6 +4,7 @@ on:
push: push:
branches: branches:
- dev - dev
pull_request:
env: env:
TARGETS: f7 TARGETS: f7
@@ -37,12 +38,17 @@ jobs:
python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE"
- name: 'Generate documentation' - name: 'Generate documentation'
uses: mattnotmitt/doxygen-action@v1.9.8 uses: mattnotmitt/doxygen-action@edge
env:
DOXY_SRC_ROOT: "${{ github.workspace }}"
DOXY_CONFIG_DIR: "${{ github.workspace }}/documentation/doxygen"
DOXY_OUTPUT_DIR: "${{ github.workspace }}/documentation/doxygen/build"
with: with:
working-directory: 'documentation/' working-directory: 'documentation/'
doxyfile-path: './doxygen/Doxyfile-awesome.cfg' doxyfile-path: './doxygen/Doxyfile-awesome.cfg'
- name: 'Upload documentation' - name: 'Upload documentation'
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/dev' }}
uses: jakejarvis/s3-sync-action@v0.5.1 uses: jakejarvis/s3-sync-action@v0.5.1
env: env:
AWS_S3_BUCKET: "${{ secrets.FW_DOCS_AWS_BUCKET }}" AWS_S3_BUCKET: "${{ secrets.FW_DOCS_AWS_BUCKET }}"

View File

@@ -48,6 +48,9 @@ jobs:
WARNINGS=0 WARNINGS=0
./fbt COMPACT=1 PVSNOBROWSER=1 firmware_pvs || WARNINGS=1 ./fbt COMPACT=1 PVSNOBROWSER=1 firmware_pvs || WARNINGS=1
echo "warnings=${WARNINGS}" >> $GITHUB_OUTPUT echo "warnings=${WARNINGS}" >> $GITHUB_OUTPUT
if [[ $WARNINGS -ne 0 ]]; then
echo "report-url=https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html" >> $GITHUB_OUTPUT
fi
- name: 'Upload report' - name: 'Upload report'
if: ${{ !github.event.pull_request.head.repo.fork && (steps.pvs-warn.outputs.warnings != 0) }} if: ${{ !github.event.pull_request.head.repo.fork && (steps.pvs-warn.outputs.warnings != 0) }}
@@ -62,7 +65,7 @@ jobs:
- name: 'Find Previous Comment' - name: 'Find Previous Comment'
if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }} if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }}
uses: peter-evans/find-comment@v2 uses: peter-evans/find-comment@v3
id: fc id: fc
with: with:
issue-number: ${{ github.event.pull_request.number }} issue-number: ${{ github.event.pull_request.number }}
@@ -71,18 +74,19 @@ jobs:
- name: 'Create or update comment' - name: 'Create or update comment'
if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }} if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }}
uses: peter-evans/create-or-update-comment@v1 uses: peter-evans/create-or-update-comment@v4
with: with:
comment-id: ${{ steps.fc.outputs.comment-id }} comment-id: ${{ steps.fc.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }} issue-number: ${{ github.event.pull_request.number }}
body: | body: |
**PVS-Studio report for commit `${{steps.names.outputs.commit_sha}}`:** **PVS-Studio report for commit `${{steps.names.outputs.commit_sha}}`:**
- [Report](https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html) - [Report](${{ steps.pvs-warn.outputs.report-url }})
edit-mode: replace edit-mode: replace
- name: 'Raise exception' - name: 'Raise exception'
if: ${{ steps.pvs-warn.outputs.warnings != 0 }} if: ${{ steps.pvs-warn.outputs.warnings != 0 }}
run: | run: |
echo "Please fix all PVS warnings before merge" echo "Please fix all PVS warnings before merge"
echo "Report: ${{ steps.pvs-warn.outputs.report-url }}"
echo "[PVS report](${{ steps.pvs-warn.outputs.report-url }})" >> $GITHUB_STEP_SUMMARY
exit 1 exit 1

View File

@@ -7,7 +7,7 @@
# construction of certain targets behind command-line options. # construction of certain targets behind command-line options.
import os import os
from fbt.util import path_as_posix from fbt.util import path_as_posix, open_browser_action
DefaultEnvironment(tools=[]) DefaultEnvironment(tools=[])
@@ -42,6 +42,7 @@ distenv = coreenv.Clone(
"openocd", "openocd",
"blackmagic", "blackmagic",
"jflash", "jflash",
"doxygen",
], ],
ENV=os.environ, ENV=os.environ,
UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}", UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}",
@@ -419,3 +420,18 @@ distenv.PhonyTarget(
"env", "env",
"@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)", "@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)",
) )
doxy_build = distenv.DoxyBuild(
"documentation/doxygen/build/html/index.html",
"documentation/doxygen/Doxyfile-awesome.cfg",
doxy_env_variables={
"DOXY_SRC_ROOT": Dir(".").abspath,
"DOXY_BUILD_DIR": Dir("documentation/doxygen/build").abspath,
"DOXY_CONFIG_DIR": "documentation/doxygen",
},
)
distenv.Alias("doxygen", doxy_build)
distenv.AlwaysBuild(doxy_build)
# Open generated documentation in browser
distenv.PhonyTarget("doxy", open_browser_action, source=doxy_build)

View File

@@ -94,8 +94,9 @@ void view_holder_start(ViewHolder* view_holder);
void view_holder_stop(ViewHolder* view_holder); void view_holder_stop(ViewHolder* view_holder);
/** View Update Handler /** View Update Handler
* @param view, View Instance *
* @param context, ViewHolder instance * @param view View Instance
* @param context ViewHolder instance
*/ */
void view_holder_update(View* view, void* context); void view_holder_update(View* view, void* context);

View File

@@ -1,11 +1,10 @@
@INCLUDE = doxygen/Doxyfile.cfg @INCLUDE = $(DOXY_CONFIG_DIR)/Doxyfile.cfg
GENERATE_TREEVIEW = YES # required! GENERATE_TREEVIEW = YES # required!
DISABLE_INDEX = NO DISABLE_INDEX = NO
FULL_SIDEBAR = NO FULL_SIDEBAR = NO
HTML_EXTRA_STYLESHEET = doxygen/doxygen-awesome-css/doxygen-awesome.css \ HTML_EXTRA_STYLESHEET = $(DOXY_CONFIG_DIR)/doxygen-awesome-css/doxygen-awesome.css \
doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only.css \ $(DOXY_CONFIG_DIR)/doxygen-awesome-css/doxygen-awesome-sidebar-only.css \
doxygen/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css $(DOXY_CONFIG_DIR)/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css
HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5 HTML_COLORSTYLE = LIGHT # required with Doxygen >= 1.9.5
HTML_HEADER = doxygen/header.html HTML_HEADER = $(DOXY_CONFIG_DIR)/header.html
HTML_EXTRA_FILES = doxygen/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js HTML_EXTRA_FILES = $(DOXY_CONFIG_DIR)/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js

View File

@@ -1,4 +1,4 @@
# Doxyfile 1.9.2 # Doxyfile 1.10.0
# This file describes the settings to be used by the documentation system # 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.
@@ -12,6 +12,16 @@
# For lists, items can also be appended using: # For lists, items can also be appended using:
# TAG += value [value, ...] # TAG += value [value, ...]
# Values that contain spaces should be placed between quotes (\" \"). # Values that contain spaces should be placed between quotes (\" \").
#
# Note:
#
# 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
# configuration file without replacing the environment variables or CMake type
# replacement variables:
# doxygen -x_noenv [configFile]
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Project related configuration options # Project related configuration options
@@ -51,30 +61,43 @@ PROJECT_BRIEF =
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory. # the logo to the output directory.
PROJECT_LOGO = doxygen/logo.png PROJECT_LOGO = $(DOXY_CONFIG_DIR)/logo.png
# With the PROJECT_ICON tag one can specify an icon that is included in the tabs # 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. # when the HTML document is shown. Doxygen will copy the logo to the output
# directory.
PROJECT_ICON = doxygen/favicon.ico PROJECT_ICON = $(DOXY_CONFIG_DIR)/favicon.ico
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # 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 # 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. # left blank the current directory will be used.
OUTPUT_DIRECTORY = doxygen/build OUTPUT_DIRECTORY = $(DOXY_CONFIG_DIR)/build
# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
# directories (in 2 levels) under the output directory of each output format and # sub-directories (in 2 levels) under the output directory of each output format
# will distribute the generated files over these directories. Enabling this # 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 # putting all generated files in the same directory would otherwise causes
# performance problems for the file system. # performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
# control the number of sub-directories.
# The default value is: NO. # The default value is: NO.
CREATE_SUBDIRS = NO CREATE_SUBDIRS = NO
# Controls the number of sub-directories that will be created when
# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
# level increment doubles the number of directories, resulting in 4096
# directories at level 8 which is the default and also the maximum value. The
# sub-directories are organized in 2 levels, the first level always has a fixed
# number of 16 directories.
# Minimum value: 0, maximum value: 8, default value: 8.
# This tag requires that the tag CREATE_SUBDIRS is set to YES.
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 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 # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
@@ -86,14 +109,14 @@ ALLOW_UNICODE_NAMES = NO
# The OUTPUT_LANGUAGE tag is used to specify the language in which all # 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. # information to generate all constant output in the proper language.
# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # English messages), Korean, Korean-en (Korean with English messages), Latvian,
# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
# Ukrainian and Vietnamese. # Swedish, Turkish, Ukrainian and Vietnamese.
# The default value is: English. # The default value is: English.
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = English
@@ -346,6 +369,17 @@ MARKDOWN_SUPPORT = YES
TOC_INCLUDE_HEADINGS = 5 TOC_INCLUDE_HEADINGS = 5
# 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 = DOXYGEN
# When enabled doxygen tries to link words that correspond to documented # When enabled doxygen tries to link words that correspond to documented
# classes, or namespaces to their corresponding documentation. Such a link can # 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 # be prevented in individual cases by putting a % sign in front of the word or
@@ -457,7 +491,7 @@ TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0 LOOKUP_CACHE_SIZE = 0
# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use # 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 # 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 # 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 # than 0 to get more control over the balance between CPU load and processing
@@ -470,6 +504,14 @@ LOOKUP_CACHE_SIZE = 0
NUM_PROC_THREADS = 4 NUM_PROC_THREADS = 4
# 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 = NO
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Build related configuration options # Build related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -551,7 +593,8 @@ 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 # 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 # to NO, these classes will be included in the various overviews. This option
# has no effect if EXTRACT_ALL is enabled. # will also hide undocumented C++ concepts if enabled. This option has no effect
# if EXTRACT_ALL is enabled.
# The default value is: NO. # The default value is: NO.
HIDE_UNDOC_CLASSES = NO HIDE_UNDOC_CLASSES = NO
@@ -582,14 +625,15 @@ INTERNAL_DOCS = NO
# filesystem is case sensitive (i.e. it supports files in the same directory # 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 # whose names only differ in casing), the option must be set to YES to properly
# deal with such files in case they appear in the input. For filesystems that # deal with such files in case they appear in the input. For filesystems that
# are not case sensitive the option should be be set to NO to properly deal with # are not case sensitive the option should be set to NO to properly deal with
# output files written for symbols that only differ in casing, such as for two # 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 # 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 # 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 # to NO, whereas on Linux or other Unix flavors it should typically be set to
# YES. # YES.
# The default value is: system dependent. # Possible values are: SYSTEM, NO and YES.
# The default value is: SYSTEM.
CASE_SENSE_NAMES = NO CASE_SENSE_NAMES = NO
@@ -798,7 +842,7 @@ CITE_BIB_FILES =
# messages are off. # messages are off.
# The default value is: NO. # The default value is: NO.
QUIET = NO QUIET = YES
# The WARNINGS tag can be used to turn on/off the warning messages that are # 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
@@ -814,7 +858,7 @@ WARNINGS = YES
# will automatically be disabled. # will automatically be disabled.
# The default value is: YES. # The default value is: YES.
WARN_IF_UNDOCUMENTED = YES WARN_IF_UNDOCUMENTED = NO
# 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 # potential errors in the documentation, such as documenting some parameters in
@@ -839,16 +883,31 @@ WARN_IF_INCOMPLETE_DOC = YES
# WARN_IF_INCOMPLETE_DOC # WARN_IF_INCOMPLETE_DOC
# The default value is: NO. # The default value is: NO.
WARN_NO_PARAMDOC = NO 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
# 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 = NO
# 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 # 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 # 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. # at the end of the doxygen process doxygen will return with a non-zero status.
# Possible values are: NO, YES and FAIL_ON_WARNINGS. # 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. # The default value is: NO.
WARN_AS_ERROR = 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 # can produce. The string should contain the $file, $line, and $text tags, which
@@ -856,13 +915,27 @@ WARN_AS_ERROR = NO
# and the warning text. Optionally the format may contain $version, which will # and the warning text. Optionally the format may contain $version, which will
# be replaced by the version of the file (if it could be obtained via # be replaced by the version of the file (if it could be obtained via
# FILE_VERSION_FILTER) # FILE_VERSION_FILTER)
# See also: WARN_LINE_FORMAT
# The default value is: $file:$line: $text. # The default value is: $file:$line: $text.
WARN_FORMAT = "$file:$line: $text" 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.
# Example:
# WARN_LINE_FORMAT = "'vi $file +$line'"
# See also: WARN_FORMAT
# The default value is: at line $line of file $file.
WARN_LINE_FORMAT = "at line $line of file $file"
# The WARN_LOGFILE tag can be used to specify a file to which warning and error # The WARN_LOGFILE tag can be used to specify a file to which warning and error
# messages should be written. If left blank the output is written to standard # messages should be written. If left blank the output is written to standard
# error (stderr). # error (stderr). In case the file specified cannot be opened for writing the
# warning and error messages are written to standard error. When as file - is
# specified the warning and error messages are written to standard output
# (stdout).
WARN_LOGFILE = WARN_LOGFILE =
@@ -876,23 +949,34 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched. # Note: If this tag is empty the current directory is searched.
INPUT = ../applications \ INPUT = $(DOXY_SRC_ROOT)/applications \
../documentation \ $(DOXY_SRC_ROOT)/documentation \
../targets \ $(DOXY_SRC_ROOT)/targets \
../assets \ $(DOXY_SRC_ROOT)/assets \
../lib \ $(DOXY_SRC_ROOT)/lib \
../furi \ $(DOXY_SRC_ROOT)/furi \
../.vscode \ $(DOXY_SRC_ROOT)/.vscode
# This tag can be used to specify the character encoding of the source files # 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 # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see: # documentation (see:
# https://www.gnu.org/software/libiconv/) for the list of possible encodings. # https://www.gnu.org/software/libiconv/) for the list of possible encodings.
# See also: INPUT_FILE_ENCODING
# The default value is: UTF-8. # The default value is: UTF-8.
INPUT_ENCODING = UTF-8 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
# 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.
INPUT_FILE_ENCODING =
# If the value of the INPUT tag contains directories, you can use the # If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
# *.h) to filter out the source-files in the directories. # *.h) to filter out the source-files in the directories.
@@ -904,12 +988,12 @@ INPUT_ENCODING = UTF-8
# Note the list of default checked file patterns might differ from the list of # Note the list of default checked file patterns might differ from the list of
# default file extension mappings. # default file extension mappings.
# #
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl,
# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, # *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d,
# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C # *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to
# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, # be provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
# *.vhdl, *.ucf, *.qsf and *.ice. # *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice.
FILE_PATTERNS = *.c \ FILE_PATTERNS = *.c \
*.cc \ *.cc \
@@ -937,47 +1021,45 @@ RECURSIVE = YES
# 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. # run.
EXCLUDE = \ EXCLUDE = $(DOXY_SRC_ROOT)/lib/mlib \
../lib/mlib \ $(DOXY_SRC_ROOT)/lib/STM32CubeWB \
../lib/STM32CubeWB \ $(DOXY_SRC_ROOT)/lib/littlefs \
../lib/littlefs \ $(DOXY_SRC_ROOT)/lib/nanopb \
../lib/nanopb \ $(DOXY_SRC_ROOT)/assets/protobuf \
../assets/protobuf \ $(DOXY_SRC_ROOT)/lib/libusb_stm32 \
../lib/libusb_stm32 \ $(DOXY_SRC_ROOT)/lib/FreeRTOS-Kernel \
../lib/FreeRTOS-Kernel \ $(DOXY_SRC_ROOT)/lib/microtar \
../lib/microtar \ $(DOXY_SRC_ROOT)/lib/mbedtls \
../lib/mbedtls \ $(DOXY_SRC_ROOT)/lib/cxxheaderparser \
../lib/cxxheaderparser \ $(DOXY_SRC_ROOT)/lib/ST25RFAL002 \
../lib/ST25RFAL002 \ $(DOXY_SRC_ROOT)/lib/fatfs \
../lib/fatfs \ $(DOXY_SRC_ROOT)/lib/mlib \
../lib/mlib \ $(DOXY_SRC_ROOT)/lib/stm32wb_cmsis \
../lib/stm32wb_cmsis \ $(DOXY_SRC_ROOT)/lib/stm32wb_copro \
../lib/stm32wb_copro \ $(DOXY_SRC_ROOT)/lib/stm32wb_hal_driver \
../lib/stm32wb_hal_driver \ $(DOXY_SRC_ROOT)/lib/stm32wb_hal \
../lib/stm32wb_hal \ $(DOXY_SRC_ROOT)/lib/cmsis_core \
../lib/cmsis_core \ $(DOXY_SRC_ROOT)/targets/f7/fatfs/ \
../targets/f7/fatfs/ \ $(DOXY_SRC_ROOT)/applications/plugins/dap_link/lib/free-dap \
../applications/plugins/dap_link/lib/free-dap \ $(DOXY_SRC_ROOT)/applications/debug \
../applications/debug \ $(DOXY_SRC_ROOT)/applications/main \
../applications/main \ $(DOXY_SRC_ROOT)/applications/settings \
../applications/settings \ $(DOXY_SRC_ROOT)/lib/micro-ecc \
../lib/micro-ecc \ $(DOXY_SRC_ROOT)/lib/ReadMe.md \
../lib/ReadMe.md \ $(DOXY_SRC_ROOT)/lib/callback-connector \
../lib/callback-connector \ $(DOXY_SRC_ROOT)/lib/app-scened-template \
../lib/app-scened-template \ $(DOXY_SRC_ROOT)/applications/ReadMe.md \
../applications/ReadMe.md \ $(DOXY_SRC_ROOT)/targets/ReadMe.md \
../targets/ReadMe.md \ $(DOXY_SRC_ROOT)/web \
../web \ $(DOXY_SRC_ROOT)/assets/protobuf \
../assets/protobuf \ $(DOXY_SRC_ROOT)/lib/libusb_stm32 \
../lib/libusb_stm32 \ $(DOXY_SRC_ROOT)/lib/FreeRTOS-Kernel \
../lib/FreeRTOS-Kernel \ $(DOXY_SRC_ROOT)/lib/microtar \
../lib/microtar \ $(DOXY_SRC_ROOT)/lib/mbedtls \
../lib/mbedtls \ $(DOXY_SRC_ROOT)/lib/cxxheaderparser \
../lib/cxxheaderparser \ $(DOXY_SRC_ROOT)/applications/external/dap_link/lib/free-dap \
../applications/external/dap_link/lib/free-dap \ $(DOXY_SRC_ROOT)/lib/heatshrink \
../lib/heatshrink \ $(DOXY_CONFIG_DIR)/doxygen-awesome-css
./doxygen/doxygen-awesome-css
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # 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 # directories that are symbolic links (a Unix file system feature) are excluded
@@ -999,10 +1081,7 @@ EXCLUDE_PATTERNS =
# (namespaces, classes, functions, etc.) that should be excluded from the # (namespaces, classes, functions, etc.) that should be excluded from the
# output. The symbol name can be a fully qualified name, a word, or if the # output. The symbol name can be a fully qualified name, a word, or if the
# wildcard * is used, a substring. Examples: ANamespace, AClass, # wildcard * is used, a substring. Examples: ANamespace, AClass,
# AClass::ANamespace, ANamespace::*Test # 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 = EXCLUDE_SYMBOLS =
@@ -1047,6 +1126,11 @@ IMAGE_PATH =
# code is scanned, but not when the output code is generated. If lines are added # code is scanned, but not when the output code is generated. If lines are added
# or removed, the anchors will not be placed correctly. # or removed, the anchors will not be placed correctly.
# #
# 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 # 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 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
# properly processed by doxygen. # properly processed by doxygen.
@@ -1088,6 +1172,15 @@ FILTER_SOURCE_PATTERNS =
USE_MDFILE_AS_MAINPAGE = 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
# extension is to allow longer lines before the automatic comment starts. The
# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
# be processed before the automatic comment starts.
# Minimum value: 7, maximum value: 10000, default value: 72.
FORTRAN_COMMENT_AFTER = 72
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to source browsing # Configuration options related to source browsing
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -1102,7 +1195,8 @@ USE_MDFILE_AS_MAINPAGE =
SOURCE_BROWSER = NO SOURCE_BROWSER = NO
# Setting the INLINE_SOURCES tag to YES will include the body of functions, # 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. # The default value is: NO.
INLINE_SOURCES = NO INLINE_SOURCES = NO
@@ -1185,10 +1279,11 @@ VERBATIM_HEADERS = YES
ALPHABETICAL_INDEX = YES ALPHABETICAL_INDEX = YES
# In case all classes in a project start with a common prefix, all classes will # The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes)
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # that should be ignored while generating the index headers. The IGNORE_PREFIX
# can be used to specify a prefix (or a list of prefixes) that should be ignored # tag works for classes, function and member names. The entity will be placed in
# while generating the index headers. # the alphabetical list under the first letter of the entity name that remains
# after removing the prefix.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
IGNORE_PREFIX = IGNORE_PREFIX =
@@ -1267,7 +1362,12 @@ HTML_STYLESHEET =
# Doxygen will copy the style sheet files to the output directory. # 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 # 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 # style sheet in the list overrules the setting of the previous ones in the
# list). For an example see the documentation. # list).
# Note: Since the styling of scrollbars can currently not be overruled in
# Webkit/Chromium, the styling will be left out of the default doxygen.css if
# one or more extra stylesheets have been specified. So if scrollbar
# customization is desired it has to be added explicitly. For an example see the
# documentation.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_EXTRA_STYLESHEET = HTML_EXTRA_STYLESHEET =
@@ -1282,6 +1382,19 @@ HTML_EXTRA_STYLESHEET =
HTML_EXTRA_FILES = 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
# 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.
HTML_COLORSTYLE = AUTO_LIGHT
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to # will adjust the colors in the style sheet and background images according to
# this color. Hue is specified as an angle on a color-wheel, see # this color. Hue is specified as an angle on a color-wheel, see
@@ -1312,15 +1425,6 @@ HTML_COLORSTYLE_SAT = 100
HTML_COLORSTYLE_GAMMA = 80 HTML_COLORSTYLE_GAMMA = 80
# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
# page will contain the date and time when the page was generated. Setting this
# to 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 = NO
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # 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 # documentation will contain a main index with vertical navigation menus that
# are dynamically created via JavaScript. If disabled, the navigation index will # are dynamically created via JavaScript. If disabled, the navigation index will
@@ -1340,6 +1444,33 @@ HTML_DYNAMIC_MENUS = YES
HTML_DYNAMIC_SECTIONS = NO HTML_DYNAMIC_SECTIONS = NO
# 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 # 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 # shown in the various tree structured indices initially; the user can expand
# and collapse entries dynamically later on. Doxygen will expand the tree to # and collapse entries dynamically later on. Doxygen will expand the tree to
@@ -1376,6 +1507,13 @@ GENERATE_DOCSET = NO
DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_FEEDNAME = "Doxygen generated docs"
# This tag determines the URL of the docset feed. A documentation feed provides
# an umbrella under which multiple documentation sets from a single provider
# (such as a company or product suite) can be grouped.
# This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_FEEDURL =
# This tag specifies a string that should uniquely identify the documentation # This tag specifies a string that should uniquely identify the documentation
# set bundle. This should be a reverse domain-name style string, e.g. # set bundle. This should be a reverse domain-name style string, e.g.
# com.mycompany.MyDocSet. Doxygen will append .docset to the name. # com.mycompany.MyDocSet. Doxygen will append .docset to the name.
@@ -1463,6 +1601,16 @@ BINARY_TOC = NO
TOC_EXPAND = 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 # 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 # 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 # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
@@ -1580,7 +1728,7 @@ GENERATE_TREEVIEW = NO
# area (value NO) or if it should extend to the full height of the window (value # area (value NO) or if it should extend to the full height of the window (value
# YES). Setting this to YES gives a layout similar to # YES). Setting this to YES gives a layout similar to
# https://docs.readthedocs.io with more room for contents, but less room for the # https://docs.readthedocs.io with more room for contents, but less room for the
# project logo, title, and description. If either GENERATOR_TREEVIEW or # project logo, title, and description. If either GENERATE_TREEVIEW or
# DISABLE_INDEX is set to NO, this option has no effect. # DISABLE_INDEX is set to NO, this option has no effect.
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1611,6 +1759,13 @@ TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO EXT_LINKS_IN_WINDOW = NO
# 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 # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
# https://inkscape.org) to generate formulas as SVG images instead of PNGs for # https://inkscape.org) to generate formulas as SVG images instead of PNGs for
@@ -1631,17 +1786,6 @@ HTML_FORMULA_FORMAT = png
FORMULA_FONTSIZE = 10 FORMULA_FONTSIZE = 10
# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
# generated for formulas are transparent PNGs. Transparent PNGs are not
# supported properly for IE 6.0, but are supported on all modern browsers.
#
# Note that when changing this option you need to delete any form_*.png files in
# the HTML output directory before the changes have effect.
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
FORMULA_TRANSPARENT = YES
# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
# to create new LaTeX commands to be used in formulas as building blocks. See # to create new LaTeX commands to be used in formulas as building blocks. See
# the section "Including formulas" for details. # the section "Including formulas" for details.
@@ -1703,8 +1847,8 @@ MATHJAX_RELPATH =
# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
# extension names that should be enabled during MathJax rendering. For example # extension names that should be enabled during MathJax rendering. For example
# for MathJax version 2 (see https://docs.mathjax.org/en/v2.7-latest/tex.html # for MathJax version 2 (see
# #tex-and-latex-extensions): # https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
# For example for MathJax version 3 (see # For example for MathJax version 3 (see
# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): # http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
@@ -1955,9 +2099,16 @@ PDF_HYPERLINKS = YES
USE_PDFLATEX = YES USE_PDFLATEX = YES
# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error.
# command to the generated LaTeX files. This will instruct LaTeX to keep running # Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch
# if errors occur, instead of asking the user for help. # mode nothing is printed on the terminal, errors are scrolled as if <return> 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. # The default value is: NO.
# This tag requires that the tag GENERATE_LATEX is set to YES. # This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -1978,14 +2129,6 @@ LATEX_HIDE_INDICES = NO
LATEX_BIB_STYLE = plain 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) # 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, # 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 # it will be relative to the LATEX_OUTPUT directory. If left blank the
@@ -2151,13 +2294,39 @@ DOCBOOK_OUTPUT = docbook
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an # If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures # AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures
# the structure of the code including all documentation. Note that this feature # the structure of the code including all documentation. Note that this feature
# is still experimental and incomplete at the moment. # is still experimental and incomplete at the moment.
# The default value is: NO. # The default value is: NO.
GENERATE_AUTOGEN_DEF = 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 # Configuration options related to the Perl module output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -2232,7 +2401,8 @@ SEARCH_INCLUDES = YES
# The INCLUDE_PATH tag can be used to specify one or more directories that # The INCLUDE_PATH tag can be used to specify one or more directories that
# contain include files that are not input files but should be processed by the # contain include files that are not input files but should be processed by the
# preprocessor. # preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
# RECURSIVE has no effect here.
# This tag requires that the tag SEARCH_INCLUDES is set to YES. # This tag requires that the tag SEARCH_INCLUDES is set to YES.
INCLUDE_PATH = INCLUDE_PATH =
@@ -2299,15 +2469,15 @@ TAGFILES =
GENERATE_TAGFILE = GENERATE_TAGFILE =
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in # If the ALLEXTERNALS tag is set to YES, all external classes and namespaces
# the class index. If set to NO, only the inherited external classes will be # will be listed in the class and namespace index. If set to NO, only the
# listed. # inherited external classes will be listed.
# The default value is: NO. # The default value is: NO.
ALLEXTERNALS = NO ALLEXTERNALS = NO
# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed # 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. # listed.
# The default value is: YES. # The default value is: YES.
@@ -2321,25 +2491,9 @@ EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES EXTERNAL_PAGES = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the dot tool # Configuration options related to diagram generator tools
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
# NO turns the diagrams off. Note that this option also works with HAVE_DOT
# disabled, but it is recommended to install and use dot, since it yields more
# powerful graphs.
# The default value is: YES.
CLASS_DIAGRAMS = YES
# 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 # 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. # and usage relations if the target is undocumented or is not a class.
# The default value is: YES. # The default value is: YES.
@@ -2348,7 +2502,7 @@ HIDE_UNDOC_RELATIONS = YES
# 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: # 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 # Bell Labs. The other options in this section have no effect if this option is
# set to NO # set to NO
# The default value is: NO. # The default value is: NO.
@@ -2365,49 +2519,77 @@ HAVE_DOT = NO
DOT_NUM_THREADS = 0 DOT_NUM_THREADS = 0
# When you want a differently looking font in the dot files that doxygen # DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
# generates you can specify the font name using DOT_FONTNAME. You need to make # subgraphs. When you want a differently looking font in the dot files that
# sure dot is able to find the font, which can be done by putting it in a # doxygen generates you can specify fontname, fontcolor and fontsize attributes.
# standard location or by setting the DOTFONTPATH environment variable or by # For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
# setting DOT_FONTPATH to the directory containing the font. # Edge and Graph Attributes specification</a> You need to make sure dot is able
# The default value is: Helvetica. # to find the font, which can be done by putting it in a standard location or by
# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
# directory containing the font. Default graphviz fontsize is 14.
# The default value is: fontname=Helvetica,fontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTNAME = Helvetica DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of # DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
# dot graphs. # add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
# Minimum value: 4, maximum value: 24, default value: 10. # href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
# arrows shapes.</a>
# The default value is: labelfontname=Helvetica,labelfontsize=10.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTSIZE = 10 DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
# By default doxygen will tell dot to use the default font as specified with # DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set # around nodes set 'shape=plain' or 'shape=plaintext' <a
# the path where dot can find it using this tag. # href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
# The default value is: shape=box,height=0.2,width=0.4.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
# You can set the path where dot can find font specified with fontname in
# DOT_COMMON_ATTR and others dot attributes.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DOT_FONTPATH = DOT_FONTPATH =
# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for # If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will
# each documented class showing the direct and indirect inheritance relations. # generate a graph for each documented class showing the direct and indirect
# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. # 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
CLASS_GRAPH = 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 # graph for each documented class showing the direct and indirect implementation
# dependencies (inheritance, containment, and class references variables) of the # 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
COLLABORATION_GRAPH = YES COLLABORATION_GRAPH = YES
# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
# groups, showing the direct groups dependencies. # 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2449,8 +2631,8 @@ DOT_UML_DETAILS = NO
# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters # 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 # 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 # significantly it will be wrapped across multiple lines. Some heuristics are
# to avoid ugly line breaks. # applied to avoid ugly line breaks.
# Minimum value: 0, maximum value: 1000, default value: 17. # Minimum value: 0, maximum value: 1000, default value: 17.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2467,7 +2649,9 @@ TEMPLATE_RELATIONS = NO
# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # 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 # 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2476,7 +2660,10 @@ INCLUDE_GRAPH = YES
# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # 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 # 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2516,16 +2703,26 @@ 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 # dependencies a directory has on other directories in a graphical way. The
# dependency relations are determined by the #include relations between 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
DIRECTORY_GRAPH = YES DIRECTORY_GRAPH = YES
# 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.
# Minimum value: 1, maximum value: 25, default value: 1.
# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
DIR_GRAPH_MAX_DEPTH = 1
# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # 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 # generated by dot. For an explanation of the image formats see the section
# output formats in the documentation of the dot tool (Graphviz (see: # 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 # 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 # to make the SVG files visible in IE 9+ (other browsers do not have this
# requirement). # requirement).
@@ -2562,11 +2759,12 @@ DOT_PATH =
DOTFILE_DIRS = DOTFILE_DIRS =
# The MSCFILE_DIRS tag can be used to specify one or more directories that # You can include diagrams made with dia in doxygen documentation. Doxygen will
# contain msc files that are included in the documentation (see the \mscfile # then run dia to produce the diagram and insert it in the documentation. The
# command). # 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 # 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 # contain dia files that are included in the documentation (see the \diafile
@@ -2575,10 +2773,10 @@ MSCFILE_DIRS =
DIAFILE_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. If left blank, it is assumed # path where java can find the plantuml.jar file or to the filename of jar file
# PlantUML is not used or called during a preprocessing step. Doxygen will # to be used. If left blank, it is assumed PlantUML is not used or called during
# generate a warning when it encounters a \startuml command in this case and # a preprocessing step. Doxygen will generate a warning when it encounters a
# will not generate output for the diagram. # \startuml command in this case and will not generate output for the diagram.
PLANTUML_JAR_PATH = PLANTUML_JAR_PATH =
@@ -2616,18 +2814,6 @@ DOT_GRAPH_MAX_NODES = 50
MAX_DOT_GRAPH_DEPTH = 0 MAX_DOT_GRAPH_DEPTH = 0
# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
# background. This is disabled by default, because dot on Windows does not seem
# to support this out of the box.
#
# Warning: Depending on the platform used, enabling this option may lead to
# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
# read).
# The default value is: NO.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_TRANSPARENT = NO
# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
# files in one run (i.e. multiple -o and -T options on the command line). This # files in one run (i.e. multiple -o and -T options on the command line). This
# makes dot run faster, but since only newer versions of dot (>1.8.10) support # makes dot run faster, but since only newer versions of dot (>1.8.10) support
@@ -2640,6 +2826,8 @@ 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 # explaining the meaning of the various boxes and arrows in the dot generated
# graphs. # graphs.
# 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. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag HAVE_DOT is set to YES.
@@ -2653,3 +2841,19 @@ GENERATE_LEGEND = YES
# The default value is: YES. # The default value is: YES.
DOT_CLEANUP = 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
# <outfile_format> -o <outputfile> <inputfile>. 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 =

View File

@@ -79,6 +79,7 @@ To use language servers other than the default VS Code C/C++ language server, us
- `lint`, `format` - run clang-format on the C source code to check and reformat it according to the `.clang-format` specs. Supports `ARGS="..."` to pass extra arguments to clang-format. - `lint`, `format` - run clang-format on the C source code to check and reformat it according to the `.clang-format` specs. Supports `ARGS="..."` to pass extra arguments to clang-format.
- `lint_py`, `format_py` - run [black](https://black.readthedocs.io/en/stable/index.html) on the Python source code, build system files & application manifests. Supports `ARGS="..."` to pass extra arguments to black. - `lint_py`, `format_py` - run [black](https://black.readthedocs.io/en/stable/index.html) on the Python source code, build system files & application manifests. Supports `ARGS="..."` to pass extra arguments to black.
- `firmware_pvs` - generate a PVS Studio report for the firmware. Requires PVS Studio to be available on your system's `PATH`. - `firmware_pvs` - generate a PVS Studio report for the firmware. Requires PVS Studio to be available on your system's `PATH`.
- `doxygen` - generate Doxygen documentation for the firmware. `doxy` target also opens web browser to view the generated documentation.
- `cli` - start a Flipper CLI session over USB. - `cli` - start a Flipper CLI session over USB.
### Firmware targets ### Firmware targets

View File

@@ -33,15 +33,13 @@ typedef enum {
FlipperApplicationLoadStatusMissingImports, FlipperApplicationLoadStatusMissingImports,
} FlipperApplicationLoadStatus; } FlipperApplicationLoadStatus;
/** /** Get text description of preload status
* @brief Get text description of preload status
* @param status Status code * @param status Status code
* @return String pointer to description * @return String pointer to description
*/ */
const char* flipper_application_preload_status_to_string(FlipperApplicationPreloadStatus status); const char* flipper_application_preload_status_to_string(FlipperApplicationPreloadStatus status);
/** /** Get text description of load status
* @brief Get text description of load status
* @param status Status code * @param status Status code
* @return String pointer to description * @return String pointer to description
*/ */
@@ -61,8 +59,7 @@ typedef struct {
uint8_t* debug_link; uint8_t* debug_link;
} FlipperApplicationState; } FlipperApplicationState;
/** /** Initialize FlipperApplication object
* @brief Initialize FlipperApplication object
* @param storage Storage instance * @param storage Storage instance
* @param api_interface ELF API interface to use for pre-loading and symbol resolving * @param api_interface ELF API interface to use for pre-loading and symbol resolving
* @return Application instance * @return Application instance
@@ -70,44 +67,44 @@ typedef struct {
FlipperApplication* FlipperApplication*
flipper_application_alloc(Storage* storage, const ElfApiInterface* api_interface); flipper_application_alloc(Storage* storage, const ElfApiInterface* api_interface);
/** /** Destroy FlipperApplication object
* @brief Destroy FlipperApplication object
* @param app Application pointer * @param app Application pointer
*/ */
void flipper_application_free(FlipperApplication* app); void flipper_application_free(FlipperApplication* app);
/** /** Validate elf file and load application metadata
* @brief Validate elf file and load application metadata *
* @param app Application pointer * @param app Application pointer
* @param[in] path The path to fap file
*
* @return Preload result code * @return Preload result code
*/ */
FlipperApplicationPreloadStatus FlipperApplicationPreloadStatus
flipper_application_preload(FlipperApplication* app, const char* path); flipper_application_preload(FlipperApplication* app, const char* path);
/** /** Validate elf file and load application manifest
* @brief Validate elf file and load application manifest *
* @param app Application pointer * @param app Application pointer
* @param[in] path The path to fap file
*
* @return Preload result code * @return Preload result code
*/ */
FlipperApplicationPreloadStatus FlipperApplicationPreloadStatus
flipper_application_preload_manifest(FlipperApplication* app, const char* path); flipper_application_preload_manifest(FlipperApplication* app, const char* path);
/** /** Get pointer to application manifest for preloaded application
* @brief Get pointer to application manifest for preloaded application
* @param app Application pointer * @param app Application pointer
* @return Pointer to application manifest * @return Pointer to application manifest
*/ */
const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplication* app); const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplication* app);
/** /** Load sections and process relocations for already pre-loaded application
* @brief Load sections and process relocations for already pre-loaded application
* @param app Application pointer * @param app Application pointer
* @return Load result code * @return Load result code
*/ */
FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app); FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app);
/** /** Allocate application thread at entry point address, using app name and
* @brief Allocate application thread at entry point address, using app name and
* stack size from metadata. Returned thread isn't started yet. * stack size from metadata. Returned thread isn't started yet.
* Can be only called once for application instance. * Can be only called once for application instance.
* @param app Applicaiton pointer * @param app Applicaiton pointer
@@ -116,20 +113,17 @@ FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplicatio
*/ */
FuriThread* flipper_application_alloc_thread(FlipperApplication* app, const char* args); FuriThread* flipper_application_alloc_thread(FlipperApplication* app, const char* args);
/** /** Check if application is a plugin (not a runnable standalone app)
* @brief Check if application is a plugin (not a runnable standalone app)
* @param app Application pointer * @param app Application pointer
* @return true if application is a plugin, false otherwise * @return true if application is a plugin, false otherwise
*/ */
bool flipper_application_is_plugin(FlipperApplication* app); bool flipper_application_is_plugin(FlipperApplication* app);
/** /** Entry point prototype for standalone applications
* @brief Entry point prototype for standalone applications
*/ */
typedef int32_t (*FlipperApplicationEntryPoint)(void*); typedef int32_t (*FlipperApplicationEntryPoint)(void*);
/** /** An object that describes a plugin - must be returned by plugin's entry point
* @brief An object that describes a plugin - must be returned by plugin's entry point
*/ */
typedef struct { typedef struct {
const char* appid; const char* appid;
@@ -137,21 +131,18 @@ typedef struct {
const void* entry_point; const void* entry_point;
} FlipperAppPluginDescriptor; } FlipperAppPluginDescriptor;
/** /** Entry point prototype for plugins
* @brief Entry point prototype for plugins
*/ */
typedef const FlipperAppPluginDescriptor* (*FlipperApplicationPluginEntryPoint)(void); typedef const FlipperAppPluginDescriptor* (*FlipperApplicationPluginEntryPoint)(void);
/** /** Get plugin descriptor for preloaded plugin
* @brief Get plugin descriptor for preloaded plugin
* @param app Application pointer * @param app Application pointer
* @return Pointer to plugin descriptor * @return Pointer to plugin descriptor
*/ */
const FlipperAppPluginDescriptor* const FlipperAppPluginDescriptor*
flipper_application_plugin_get_descriptor(FlipperApplication* app); flipper_application_plugin_get_descriptor(FlipperApplication* app);
/** /** Load name and icon from FAP file.
* @brief Load name and icon from FAP file.
* *
* @param path Path to FAP file. * @param path Path to FAP file.
* @param storage Storage instance. * @param storage Storage instance.

View File

@@ -1,6 +1,4 @@
/** /** @file flipper_format.h Flipper File Format helper library.
* @file flipper_format.h
* Flipper File Format helper library.
* *
* Flipper File Format is a fairly simple format for storing data in a file. * Flipper File Format is a fairly simple format for storing data in a file.
* *
@@ -11,7 +9,9 @@
* Field name: field value * Field name: field value
* ~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~
* *
* Lines starting with the # character are ignored (considered as comments). The separator between the name of the value and the value itself is the string ": ". * Lines starting with the # character are ignored (considered as comments). The
* separator between the name of the value and the value itself is the string
* ": ".
* *
* Currently supported types: * Currently supported types:
* *
@@ -25,7 +25,9 @@
* *
* End of line is LF when writing, but CR is supported when reading. * End of line is LF when writing, but CR is supported when reading.
* *
* The library is designed in such a way that comments and field values are completely ignored when searching for keys, that is, they do not consume memory. * The library is designed in such a way that comments and field values are
* completely ignored when searching for keys, that is, they do not consume
* memory.
* *
* File example: * File example:
* *
@@ -43,22 +45,19 @@
* ~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~
* FlipperFormat* format = flipper_format_file_alloc(storage); * FlipperFormat* format = flipper_format_file_alloc(storage);
* *
* do { * do { const uint32_t version = 1; const char* string_value = "String value";
* const uint32_t version = 1; * const uint32_t uint32_value = 1234; const uint16_t array_size = 4; const
* const char* string_value = "String value"; * uint8_t* array[array_size] = {0x00, 0x01, 0xFF, 0xA3};
* const uint32_t uint32_value = 1234;
* const uint16_t array_size = 4;
* const uint8_t* array[array_size] = {0x00, 0x01, 0xFF, 0xA3};
* *
* if(!flipper_format_file_open_new(format, EXT_PATH("flipper_format_test"))) break; * if(!flipper_format_file_open_new(format, EXT_PATH("flipper_format_test")))
* if(!flipper_format_write_header_cstr(format, "Flipper Test File", version)) break; * break; if(!flipper_format_write_header_cstr(format, "Flipper Test File",
* if(!flipper_format_write_comment_cstr(format, "Just test file")) break; * version)) break; if(!flipper_format_write_comment_cstr(format,
* if(!flipper_format_write_string_cstr(format, "String", string_value)) break; * "Just test file")) break; if(!flipper_format_write_string_cstr(format,
* if(!flipper_format_write_uint32(format, "UINT", &uint32_value, 1)) break; * "String", string_value)) break; if(!flipper_format_write_uint32(format,
* if(!flipper_format_write_hex(format, "Hex Array", array, array_size)) break; * "UINT", &uint32_value, 1)) break; if(!flipper_format_write_hex(format,
* "Hex Array", array, array_size)) break;
* *
* // signal that the file was written successfully * // signal that the file was written successfully } while(0);
* } while(0);
* *
* flipper_format_free(file); * flipper_format_free(file);
* ~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~
@@ -68,28 +67,21 @@
* ~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~
* FlipperFormat* file = flipper_format_file_alloc(storage); * FlipperFormat* file = flipper_format_file_alloc(storage);
* *
* do { * do { uint32_t version = 1; FuriString* file_type; FuriString* string_value;
* uint32_t version = 1; * uint32_t uint32_value = 1; uint16_t array_size = 4; uint8_t*
* FuriString* file_type; * array[array_size] = {0}; file_type = furi_string_alloc(); string_value =
* FuriString* string_value; * furi_string_alloc();
* uint32_t uint32_value = 1;
* uint16_t array_size = 4;
* uint8_t* array[array_size] = {0};
* file_type = furi_string_alloc();
* string_value = furi_string_alloc();
* *
* if(!flipper_format_file_open_existing(file, EXT_PATH("flipper_format_test"))) break; * if(!flipper_format_file_open_existing(file, EXT_PATH("flipper_format_test")))
* if(!flipper_format_read_header(file, file_type, &version)) break; * break; if(!flipper_format_read_header(file, file_type, &version)) break;
* if(!flipper_format_read_string(file, "String", string_value)) break; * if(!flipper_format_read_string(file, "String", string_value)) break;
* if(!flipper_format_read_uint32(file, "UINT", &uint32_value, 1)) break; * if(!flipper_format_read_uint32(file, "UINT", &uint32_value, 1)) break;
* if(!flipper_format_read_hex(file, "Hex Array", array, array_size)) break; * if(!flipper_format_read_hex(file, "Hex Array", array, array_size)) break;
* *
* // signal that the file was read successfully * // signal that the file was read successfully } while(0);
* } while(0);
* *
* flipper_format_free(file); * flipper_format_free(file);
* ~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~
*
*/ */
#pragma once #pragma once
@@ -102,135 +94,153 @@ extern "C" {
typedef struct FlipperFormat FlipperFormat; typedef struct FlipperFormat FlipperFormat;
/** /** Allocate FlipperFormat as string.
* Allocate FlipperFormat as string. *
* @return FlipperFormat* pointer to a FlipperFormat instance * @return FlipperFormat* pointer to a FlipperFormat instance
*/ */
FlipperFormat* flipper_format_string_alloc(void); FlipperFormat* flipper_format_string_alloc(void);
/** /** Allocate FlipperFormat as file.
* Allocate FlipperFormat as file. *
* @param storage The storage
*
* @return FlipperFormat* pointer to a FlipperFormat instance * @return FlipperFormat* pointer to a FlipperFormat instance
*/ */
FlipperFormat* flipper_format_file_alloc(Storage* storage); FlipperFormat* flipper_format_file_alloc(Storage* storage);
/** /** Allocate FlipperFormat as file, buffered mode.
* Allocate FlipperFormat as file, buffered mode. *
* @param storage The storage
*
* @return FlipperFormat* pointer to a FlipperFormat instance * @return FlipperFormat* pointer to a FlipperFormat instance
*/ */
FlipperFormat* flipper_format_buffered_file_alloc(Storage* storage); FlipperFormat* flipper_format_buffered_file_alloc(Storage* storage);
/** /** Open existing file. Use only if FlipperFormat allocated as a file.
* Open existing file. *
* Use only if FlipperFormat allocated as a file.
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param path File path * @param path File path
*
* @return True on success * @return True on success
*/ */
bool flipper_format_file_open_existing(FlipperFormat* flipper_format, const char* path); bool flipper_format_file_open_existing(FlipperFormat* flipper_format, const char* path);
/** /** Open existing file, buffered mode. Use only if FlipperFormat allocated as a
* Open existing file, buffered mode. * buffered file.
* Use only if FlipperFormat allocated as a buffered file. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param path File path * @param path File path
*
* @return True on success * @return True on success
*/ */
bool flipper_format_buffered_file_open_existing(FlipperFormat* flipper_format, const char* path); bool flipper_format_buffered_file_open_existing(FlipperFormat* flipper_format, const char* path);
/** /** Open existing file for writing and add values to the end of file. Use only if
* Open existing file for writing and add values to the end of file. * FlipperFormat allocated as a file.
* Use only if FlipperFormat allocated as a file. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param path File path * @param path File path
*
* @return True on success * @return True on success
*/ */
bool flipper_format_file_open_append(FlipperFormat* flipper_format, const char* path); bool flipper_format_file_open_append(FlipperFormat* flipper_format, const char* path);
/** /** Open file. Creates a new file, or deletes the contents of the file if it
* Open file. Creates a new file, or deletes the contents of the file if it already exists. * already exists. Use only if FlipperFormat allocated as a file.
* Use only if FlipperFormat allocated as a file. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param path File path * @param path File path
*
* @return True on success * @return True on success
*/ */
bool flipper_format_file_open_always(FlipperFormat* flipper_format, const char* path); bool flipper_format_file_open_always(FlipperFormat* flipper_format, const char* path);
/** /** Open file. Creates a new file, or deletes the contents of the file if it
* Open file. Creates a new file, or deletes the contents of the file if it already exists, buffered mode. * already exists, buffered mode. Use only if FlipperFormat allocated as a
* Use only if FlipperFormat allocated as a buffered file. * buffered file.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param path File path * @param path File path
*
* @return True on success * @return True on success
*/ */
bool flipper_format_buffered_file_open_always(FlipperFormat* flipper_format, const char* path); bool flipper_format_buffered_file_open_always(FlipperFormat* flipper_format, const char* path);
/** /** Open file. Creates a new file, fails if file already exists. Use only if
* Open file. Creates a new file, fails if file already exists. * FlipperFormat allocated as a file.
* Use only if FlipperFormat allocated as a file. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param path File path * @param path File path
*
* @return True on success * @return True on success
*/ */
bool flipper_format_file_open_new(FlipperFormat* flipper_format, const char* path); bool flipper_format_file_open_new(FlipperFormat* flipper_format, const char* path);
/** /** Closes the file, use only if FlipperFormat allocated as a file.
* Closes the file, use only if FlipperFormat allocated as a file. *
* @param flipper_format * @param flipper_format The flipper format
*
* @return true * @return true
* @return false * @return false
*/ */
bool flipper_format_file_close(FlipperFormat* flipper_format); bool flipper_format_file_close(FlipperFormat* flipper_format);
/** /** Closes the file, use only if FlipperFormat allocated as a buffered file.
* Closes the file, use only if FlipperFormat allocated as a buffered file. *
* @param flipper_format * @param flipper_format The flipper format
*
* @return true * @return true
* @return false * @return false
*/ */
bool flipper_format_buffered_file_close(FlipperFormat* flipper_format); bool flipper_format_buffered_file_close(FlipperFormat* flipper_format);
/** /** Free FlipperFormat.
* Free FlipperFormat. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
*/ */
void flipper_format_free(FlipperFormat* flipper_format); void flipper_format_free(FlipperFormat* flipper_format);
/** /** Set FlipperFormat mode.
* Set FlipperFormat mode. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param strict_mode True obligates not to skip valid fields. False by default. * @param strict_mode True obligates not to skip valid fields. False by
* default.
*/ */
void flipper_format_set_strict_mode(FlipperFormat* flipper_format, bool strict_mode); void flipper_format_set_strict_mode(FlipperFormat* flipper_format, bool strict_mode);
/** /** Rewind the RW pointer.
* Rewind the RW pointer. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
*
* @return True on success * @return True on success
*/ */
bool flipper_format_rewind(FlipperFormat* flipper_format); bool flipper_format_rewind(FlipperFormat* flipper_format);
/** /** Move the RW pointer at the end. Can be useful if you want to add some data
* Move the RW pointer at the end. Can be useful if you want to add some data after reading. * after reading.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
*
* @return True on success * @return True on success
*/ */
bool flipper_format_seek_to_end(FlipperFormat* flipper_format); bool flipper_format_seek_to_end(FlipperFormat* flipper_format);
/** /** Check if the key exists.
* Check if the key exists. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
*
* @return true key exists * @return true key exists
* @return false key is not exists * @return false key is not exists
*/ */
bool flipper_format_key_exist(FlipperFormat* flipper_format, const char* key); bool flipper_format_key_exist(FlipperFormat* flipper_format, const char* key);
/** /** Read the header (file type and version).
* Read the header (file type and version). *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param filetype File type string * @param filetype File type string
* @param version Version Value * @param version Version Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_header( bool flipper_format_read_header(
@@ -238,11 +248,12 @@ bool flipper_format_read_header(
FuriString* filetype, FuriString* filetype,
uint32_t* version); uint32_t* version);
/** /** Write the header (file type and version).
* Write the header (file type and version). *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param filetype File type string * @param filetype File type string
* @param version Version Value * @param version Version Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_header( bool flipper_format_write_header(
@@ -250,11 +261,12 @@ bool flipper_format_write_header(
FuriString* filetype, FuriString* filetype,
const uint32_t version); const uint32_t version);
/** /** Write the header (file type and version). Plain C string version.
* Write the header (file type and version). Plain C string version. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param filetype File type string * @param filetype File type string
* @param version Version Value * @param version Version Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_header_cstr( bool flipper_format_write_header_cstr(
@@ -262,11 +274,12 @@ bool flipper_format_write_header_cstr(
const char* filetype, const char* filetype,
const uint32_t version); const uint32_t version);
/** /** Get the count of values by key
* Get the count of values by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key * @param key The key
* @param count * @param count The count
*
* @return bool * @return bool
*/ */
bool flipper_format_get_value_count( bool flipper_format_get_value_count(
@@ -274,29 +287,32 @@ bool flipper_format_get_value_count(
const char* key, const char* key,
uint32_t* count); uint32_t* count);
/** /** Read a string by key
* Read a string by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_string(FlipperFormat* flipper_format, const char* key, FuriString* data); bool flipper_format_read_string(FlipperFormat* flipper_format, const char* key, FuriString* data);
/** /** Write key and string
* Write key and string *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_string(FlipperFormat* flipper_format, const char* key, FuriString* data); bool flipper_format_write_string(FlipperFormat* flipper_format, const char* key, FuriString* data);
/** /** Write key and string. Plain C string version.
* Write key and string. Plain C string version. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_string_cstr( bool flipper_format_write_string_cstr(
@@ -304,12 +320,13 @@ bool flipper_format_write_string_cstr(
const char* key, const char* key,
const char* data); const char* data);
/** /** Read array of uint64 in hex format by key
* Read array of uint64 in hex format by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_hex_uint64( bool flipper_format_read_hex_uint64(
@@ -318,12 +335,13 @@ bool flipper_format_read_hex_uint64(
uint64_t* data, uint64_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write key and array of uint64 in hex format
* Write key and array of uint64 in hex format *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_hex_uint64( bool flipper_format_write_hex_uint64(
@@ -332,12 +350,13 @@ bool flipper_format_write_hex_uint64(
const uint64_t* data, const uint64_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Read array of uint32 by key
* Read array of uint32 by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_uint32( bool flipper_format_read_uint32(
@@ -346,12 +365,13 @@ bool flipper_format_read_uint32(
uint32_t* data, uint32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write key and array of uint32
* Write key and array of uint32 *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_uint32( bool flipper_format_write_uint32(
@@ -360,12 +380,13 @@ bool flipper_format_write_uint32(
const uint32_t* data, const uint32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Read array of int32 by key
* Read array of int32 by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_int32( bool flipper_format_read_int32(
@@ -374,12 +395,13 @@ bool flipper_format_read_int32(
int32_t* data, int32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write key and array of int32
* Write key and array of int32 *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_int32( bool flipper_format_write_int32(
@@ -388,12 +410,13 @@ bool flipper_format_write_int32(
const int32_t* data, const int32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Read array of bool by key
* Read array of bool by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_bool( bool flipper_format_read_bool(
@@ -402,12 +425,13 @@ bool flipper_format_read_bool(
bool* data, bool* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write key and array of bool
* Write key and array of bool *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_bool( bool flipper_format_write_bool(
@@ -416,12 +440,13 @@ bool flipper_format_write_bool(
const bool* data, const bool* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Read array of float by key
* Read array of float by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_float( bool flipper_format_read_float(
@@ -430,12 +455,13 @@ bool flipper_format_read_float(
float* data, float* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write key and array of float
* Write key and array of float *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_float( bool flipper_format_write_float(
@@ -444,12 +470,13 @@ bool flipper_format_write_float(
const float* data, const float* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Read array of hex-formatted bytes by key
* Read array of hex-formatted bytes by key *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_read_hex( bool flipper_format_read_hex(
@@ -458,12 +485,13 @@ bool flipper_format_read_hex(
uint8_t* data, uint8_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write key and array of hex-formatted bytes
* Write key and array of hex-formatted bytes *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param data_size Values count * @param data_size Values count
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_hex( bool flipper_format_write_hex(
@@ -472,44 +500,52 @@ bool flipper_format_write_hex(
const uint8_t* data, const uint8_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Write comment
* Write comment *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param data Comment text * @param data Comment text
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_comment(FlipperFormat* flipper_format, FuriString* data); bool flipper_format_write_comment(FlipperFormat* flipper_format, FuriString* data);
/** /** Write comment. Plain C string version.
* Write comment. Plain C string version. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param data Comment text * @param data Comment text
*
* @return True on success * @return True on success
*/ */
bool flipper_format_write_comment_cstr(FlipperFormat* flipper_format, const char* data); bool flipper_format_write_comment_cstr(FlipperFormat* flipper_format, const char* data);
/** /** Removes the first matching key and its value. Sets the RW pointer to a
* Removes the first matching key and its value. Sets the RW pointer to a position of deleted data. * position of deleted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
*
* @return True on success * @return True on success
*/ */
bool flipper_format_delete_key(FlipperFormat* flipper_format, const char* key); bool flipper_format_delete_key(FlipperFormat* flipper_format, const char* key);
/** /** Updates the value of the first matching key to a string value. Sets the RW
* Updates the value of the first matching key to a string value. Sets the RW pointer to a position at the end of inserted data. * pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_string(FlipperFormat* flipper_format, const char* key, FuriString* data); bool flipper_format_update_string(FlipperFormat* flipper_format, const char* key, FuriString* data);
/** /** Updates the value of the first matching key to a string value. Plain C
* Updates the value of the first matching key to a string value. Plain C version. Sets the RW pointer to a position at the end of inserted data. * version. Sets the RW pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_string_cstr( bool flipper_format_update_string_cstr(
@@ -517,11 +553,14 @@ bool flipper_format_update_string_cstr(
const char* key, const char* key,
const char* data); const char* data);
/** /** Updates the value of the first matching key to a uint32 array value. Sets the
* Updates the value of the first matching key to a uint32 array value. Sets the RW pointer to a position at the end of inserted data. * RW pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_uint32( bool flipper_format_update_uint32(
@@ -530,11 +569,14 @@ bool flipper_format_update_uint32(
const uint32_t* data, const uint32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a int32 array value. Sets the
* Updates the value of the first matching key to a int32 array value. Sets the RW pointer to a position at the end of inserted data. * RW pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_int32( bool flipper_format_update_int32(
@@ -543,11 +585,14 @@ bool flipper_format_update_int32(
const int32_t* data, const int32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a bool array value. Sets the
* Updates the value of the first matching key to a bool array value. Sets the RW pointer to a position at the end of inserted data. * RW pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_bool( bool flipper_format_update_bool(
@@ -556,11 +601,14 @@ bool flipper_format_update_bool(
const bool* data, const bool* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a float array value. Sets the
* Updates the value of the first matching key to a float array value. Sets the RW pointer to a position at the end of inserted data. * RW pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_float( bool flipper_format_update_float(
@@ -569,11 +617,14 @@ bool flipper_format_update_float(
const float* data, const float* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to an array of hex-formatted
* Updates the value of the first matching key to an array of hex-formatted bytes. Sets the RW pointer to a position at the end of inserted data. * bytes. Sets the RW pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_update_hex( bool flipper_format_update_hex(
@@ -582,12 +633,14 @@ bool flipper_format_update_hex(
const uint8_t* data, const uint8_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a string value, or adds the
* Updates the value of the first matching key to a string value, or adds the key and value if the key did not exist. * key and value if the key did not exist. Sets the RW pointer to a position at
* Sets the RW pointer to a position at the end of inserted data. * the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_string( bool flipper_format_insert_or_update_string(
@@ -595,13 +648,14 @@ bool flipper_format_insert_or_update_string(
const char* key, const char* key,
FuriString* data); FuriString* data);
/** /** Updates the value of the first matching key to a string value, or adds the
* Updates the value of the first matching key to a string value, or adds the key and value if the key did not exist. * key and value if the key did not exist. Plain C version. Sets the RW pointer
* Plain C version. * to a position at the end of inserted data.
* Sets the RW pointer to a position at the end of inserted data. *
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_string_cstr( bool flipper_format_insert_or_update_string_cstr(
@@ -609,12 +663,15 @@ bool flipper_format_insert_or_update_string_cstr(
const char* key, const char* key,
const char* data); const char* data);
/** /** Updates the value of the first matching key to a uint32 array value, or adds
* Updates the value of the first matching key to a uint32 array value, or adds the key and value if the key did not exist. * the key and value if the key did not exist. Sets the RW pointer to a position
* Sets the RW pointer to a position at the end of inserted data. * at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_uint32( bool flipper_format_insert_or_update_uint32(
@@ -623,12 +680,15 @@ bool flipper_format_insert_or_update_uint32(
const uint32_t* data, const uint32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a int32 array value, or adds
* Updates the value of the first matching key to a int32 array value, or adds the key and value if the key did not exist. * the key and value if the key did not exist. Sets the RW pointer to a position
* Sets the RW pointer to a position at the end of inserted data. * at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_int32( bool flipper_format_insert_or_update_int32(
@@ -637,12 +697,15 @@ bool flipper_format_insert_or_update_int32(
const int32_t* data, const int32_t* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a bool array value, or adds
* Updates the value of the first matching key to a bool array value, or adds the key and value if the key did not exist. * the key and value if the key did not exist. Sets the RW pointer to a position
* Sets the RW pointer to a position at the end of inserted data. * at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_bool( bool flipper_format_insert_or_update_bool(
@@ -651,12 +714,15 @@ bool flipper_format_insert_or_update_bool(
const bool* data, const bool* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to a float array value, or adds
* Updates the value of the first matching key to a float array value, or adds the key and value if the key did not exist. * the key and value if the key did not exist. Sets the RW pointer to a position
* Sets the RW pointer to a position at the end of inserted data. * at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_float( bool flipper_format_insert_or_update_float(
@@ -665,12 +731,15 @@ bool flipper_format_insert_or_update_float(
const float* data, const float* data,
const uint16_t data_size); const uint16_t data_size);
/** /** Updates the value of the first matching key to an array of hex-formatted
* Updates the value of the first matching key to an array of hex-formatted bytes, or adds the key and value if the key did not exist. * bytes, or adds the key and value if the key did not exist. Sets the RW
*Sets the RW pointer to a position at the end of inserted data. * pointer to a position at the end of inserted data.
*
* @param flipper_format Pointer to a FlipperFormat instance * @param flipper_format Pointer to a FlipperFormat instance
* @param key Key * @param key Key
* @param data Value * @param data Value
* @param[in] data_size The data size
*
* @return True on success * @return True on success
*/ */
bool flipper_format_insert_or_update_hex( bool flipper_format_insert_or_update_hex(

View File

@@ -1,5 +1,4 @@
/** /** @file lfrfid_worker.h
* @file lfrfid_worker.h
* *
* LFRFID worker * LFRFID worker
*/ */
@@ -54,37 +53,35 @@ typedef void (*LFRFIDWorkerEmulateRawCallback)(LFRFIDWorkerEmulateRawResult resu
typedef struct LFRFIDWorker LFRFIDWorker; typedef struct LFRFIDWorker LFRFIDWorker;
/** /** Allocate LF-RFID worker
* Allocate LF-RFID worker
* @return LFRFIDWorker* * @return LFRFIDWorker*
*/ */
LFRFIDWorker* lfrfid_worker_alloc(ProtocolDict* dict); LFRFIDWorker* lfrfid_worker_alloc(ProtocolDict* dict);
/** /** Free LF-RFID worker
* Free LF-RFID worker *
* @param worker * @param worker The worker
*/ */
void lfrfid_worker_free(LFRFIDWorker* worker); void lfrfid_worker_free(LFRFIDWorker* worker);
/** /** Start LF-RFID worker thread
* Start LF-RFID worker thread *
* @param worker * @param worker The worker
*/ */
void lfrfid_worker_start_thread(LFRFIDWorker* worker); void lfrfid_worker_start_thread(LFRFIDWorker* worker);
/** /** Stop LF-RFID worker thread
* Stop LF-RFID worker thread *
* @param worker * @param worker The worker
*/ */
void lfrfid_worker_stop_thread(LFRFIDWorker* worker); void lfrfid_worker_stop_thread(LFRFIDWorker* worker);
/** /** Start read mode
* @brief Start read mode
* *
* @param worker * @param worker The worker
* @param type * @param type The type
* @param callback * @param callback The callback
* @param context * @param context The context
*/ */
void lfrfid_worker_read_start( void lfrfid_worker_read_start(
LFRFIDWorker* worker, LFRFIDWorker* worker,
@@ -92,13 +89,12 @@ void lfrfid_worker_read_start(
LFRFIDWorkerReadCallback callback, LFRFIDWorkerReadCallback callback,
void* context); void* context);
/** /** Start write mode
* @brief Start write mode
* *
* @param worker * @param worker The worker
* @param protocol * @param protocol The protocol
* @param callback * @param callback The callback
* @param context * @param context The context
*/ */
void lfrfid_worker_write_start( void lfrfid_worker_write_start(
LFRFIDWorker* worker, LFRFIDWorker* worker,
@@ -106,20 +102,20 @@ void lfrfid_worker_write_start(
LFRFIDWorkerWriteCallback callback, LFRFIDWorkerWriteCallback callback,
void* context); void* context);
/** /** Start emulate mode
* Start emulate mode *
* @param worker * @param worker The worker
* @param[in] protocol The protocol
*/ */
void lfrfid_worker_emulate_start(LFRFIDWorker* worker, LFRFIDProtocol protocol); void lfrfid_worker_emulate_start(LFRFIDWorker* worker, LFRFIDProtocol protocol);
/** /** Start raw read mode
* @brief Start raw read mode
* *
* @param worker * @param worker The worker
* @param filename * @param filename The filename
* @param type * @param type The type
* @param callback * @param callback The callback
* @param context * @param context The context
*/ */
void lfrfid_worker_read_raw_start( void lfrfid_worker_read_raw_start(
LFRFIDWorker* worker, LFRFIDWorker* worker,
@@ -128,12 +124,12 @@ void lfrfid_worker_read_raw_start(
LFRFIDWorkerReadRawCallback callback, LFRFIDWorkerReadRawCallback callback,
void* context); void* context);
/** /** Emulate raw read mode
* Emulate raw read mode *
* @param worker * @param worker The worker
* @param filename * @param filename The filename
* @param callback * @param callback The callback
* @param context * @param context The context
*/ */
void lfrfid_worker_emulate_raw_start( void lfrfid_worker_emulate_raw_start(
LFRFIDWorker* worker, LFRFIDWorker* worker,
@@ -141,9 +137,9 @@ void lfrfid_worker_emulate_raw_start(
LFRFIDWorkerEmulateRawCallback callback, LFRFIDWorkerEmulateRawCallback callback,
void* context); void* context);
/** /** Stop all modes
* Stop all modes *
* @param worker * @param worker The worker
*/ */
void lfrfid_worker_stop(LFRFIDWorker* worker); void lfrfid_worker_stop(LFRFIDWorker* worker);

View File

@@ -43,7 +43,8 @@ typedef struct Compress Compress;
/** Allocate encoder and decoder /** Allocate encoder and decoder
* *
* @param compress_buff_size size of decoder and encoder buffer to allocate * @param compress_buff_size size of decoder and encoder buffer to
* allocate
* *
* @return Compress instance * @return Compress instance
*/ */
@@ -61,6 +62,7 @@ void compress_free(Compress* compress);
* @param data_in pointer to input data * @param data_in pointer to input data
* @param data_in_size size of input data * @param data_in_size size of input data
* @param data_out maximum size of output data * @param data_out maximum size of output data
* @param[in] data_out_size The data out size
* @param data_res_size pointer to result output data size * @param data_res_size pointer to result output data size
* *
* @return true on success * @return true on success
@@ -79,6 +81,7 @@ bool compress_encode(
* @param data_in pointer to input data * @param data_in pointer to input data
* @param data_in_size size of input data * @param data_in_size size of input data
* @param data_out maximum size of output data * @param data_out maximum size of output data
* @param[in] data_out_size The data out size
* @param data_res_size pointer to result output data size * @param data_res_size pointer to result output data size
* *
* @return true on success * @return true on success

View File

@@ -1,5 +1,8 @@
import os import os
import re import re
import subprocess
import sys
import webbrowser
import SCons import SCons
from SCons.Errors import StopError from SCons.Errors import StopError
@@ -83,3 +86,10 @@ def path_as_posix(path):
if SCons.Platform.platform_default() == "win32": if SCons.Platform.platform_default() == "win32":
return path.replace(os.path.sep, os.path.altsep) return path.replace(os.path.sep, os.path.altsep)
return path return path
def open_browser_action(target, source, env):
if sys.platform == "darwin":
subprocess.run(["open", source[0].abspath])
else:
webbrowser.open(source[0].abspath)

View File

@@ -0,0 +1,40 @@
from SCons.Script import Action, Builder
def exists(env):
return True
def DoxyBuild(env, target, source, doxy_env_variables=None):
if doxy_env_variables:
doxy_env = env.Clone()
doxy_env.Append(ENV=doxy_env_variables)
else:
doxy_env = env
return doxy_env._DoxyBuilder(target, source)
def generate(env):
if not env["VERBOSE"]:
env.SetDefault(
DOXYGENCOMSTR="\tDOXY\t${TARGET}",
)
env.SetDefault(
DOXYGEN="doxygen",
)
env.AddMethod(DoxyBuild)
env.Append(
BUILDERS={
"_DoxyBuilder": Builder(
action=[
Action(
[["$DOXYGEN", "$SOURCE"]],
"$DOXYGENCOMSTR",
),
],
)
}
)

View File

@@ -32,7 +32,7 @@ def atexist_handler():
for bf in GetBuildFailures(): for bf in GetBuildFailures():
for node in Flatten(bf.node): for node in Flatten(bf.node):
if node.exists and node.name.endswith(".html"): if node.exists and "pvs" in node.name and node.name.endswith(".html"):
# macOS # macOS
if sys.platform == "darwin": if sys.platform == "darwin":
subprocess.run(["open", node.abspath]) subprocess.run(["open", node.abspath])

View File

@@ -1,5 +1,5 @@
from fbt.util import link_dir
from ansi.color import fg from ansi.color import fg
from fbt.util import link_dir
def link_elf_dir_as_latest(env, elf_node): def link_elf_dir_as_latest(env, elf_node):