From 1e5bce2534677aed3c407d33414bcb5ab9270955 Mon Sep 17 00:00:00 2001 From: dpugliese6 Date: Tue, 7 Jan 2025 13:10:22 +0100 Subject: [PATCH] docs: improvement of README and added analysis script description --- README.md | 12 +- docs/IoD_Sim_doc | 640 ++++++++++++++++++++--------------------- docs/README.md | 129 +++++++++ docs/analysis.md | 40 +++ docs/logo_extended.png | Bin 0 -> 60746 bytes 5 files changed, 494 insertions(+), 327 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/analysis.md create mode 100644 docs/logo_extended.png diff --git a/README.md b/README.md index e326432..4604be9 100644 --- a/README.md +++ b/README.md @@ -21,25 +21,23 @@ For more details on how IoD_Sim works and all its features, the following research publications are highly recommended: - [G. Grieco, G. Iacovelli, P. Boccadoro and L. A. Grieco, "Internet of Drones Simulator: Design, Implementation, and Performance Evaluation," in IEEE Internet of Things Journal, vol. 10, no. 2, pp. 1476-1498, 15 Jan.15, 2023, doi: 10.1109/JIOT.2022.3207324.](https://doi.org/10.1109/JIOT.2022.3207324) -- [G. Grieco, G. Iacovelli, M. Sandri, M. Giordani, M. Zorzi and L. A. Grieco, "Preliminary Performance Evaluation of a - Satellite-to-HAP Communication Link," European Wireless 2023; 28th European Wireless Conference, Rome, Italy, 2023, - pp. 340-345.](https://ieeexplore.ieee.org/abstract/document/10461435) +- [G. Grieco, G. Iacovelli, M. Sandri, M. Giordani, M. Zorzi and L. A. Grieco, "Preliminary Performance Evaluation of avSatellite-to-HAP Communication Link," European Wireless 2023; 28th European Wireless Conference, Rome, Italy, 2023, pp. 340-345.](https://ieeexplore.ieee.org/abstract/document/10461435) - [G. Grieco, G. Iacovelli, D. Pugliese, D. Striccoli and L. A. Grieco, "A System-Level Simulation Module for Multi-UAV IRS-Assisted Communications," in IEEE Transactions on Vehicular Technology, vol. 73, no. 5, pp. 6740-6751, May 2024, doi: 10.1109/TVT.2023.3342298.](https://dx.doi.org/10.1109/TVT.2023.3342298) Older publications that might still be useful: - [G. Grieco, R. Artuso, P. Boccadoro, G. Piro and L. A. Grieco, "An Open Source and System-Level Simulator for the Internet of Drones," 2019 IEEE 30th International Symposium on Personal, Indoor and Mobile Radio Communications (PIMRC Workshops), Istanbul, Turkey, 2019, pp. 1-6, doi: 10.1109/PIMRCW.2019.8880832.](https://ieeexplore.ieee.org/document/8880832) -You can head over to the [Releases](releases) section to download a copy of a +You can head over to the [Releases](https://github.com/telematics-lab/IoD_Sim/releases) section to download a copy of a stable version of the software. The IoD_Sim repository is where this software is developed and there are many ways in which you can participate in the project, for example: -- [Submit bugs and feature requests](issues) and help us verify as they are +- [Submit bugs and feature requests](https://github.com/telematics-lab/IoD_Sim/issues) and help us verify as they are checked in. -- Review [source code changes](pulls). -- Review the [documentation](doc) and make pull requests for anything, from +- Review [source code changes](https://github.com/telematics-lab/IoD_Sim/commits/main/). +- Review the [documentation](https://github.com/telematics-lab/IoD_Sim/tree/main/docs) and make pull requests for anything, from typos to new content. IoD_Sim is primarily compatible with **Linux**-based operating systems. You can diff --git a/docs/IoD_Sim_doc b/docs/IoD_Sim_doc index b70046e..e011ebf 100644 --- a/docs/IoD_Sim_doc +++ b/docs/IoD_Sim_doc @@ -24,7 +24,7 @@ # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. -DOXYFILE_ENCODING = UTF-8 +DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the @@ -32,33 +32,33 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "IoD_Sim" +PROJECT_NAME = "IoD_Sim" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = "v4.0" +PROJECT_NUMBER = "v4.0" # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = "A system level simulator for the Internet of Drones, based on ns-3." +PROJECT_BRIEF = "A system level simulator for the Internet of Drones, based on ns-3." # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = ./docs/logo_docs.png +PROJECT_LOGO = ./docs/logo_docs.png # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = docs +OUTPUT_DIRECTORY = docs # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -68,7 +68,7 @@ OUTPUT_DIRECTORY = docs # performance problems for the file system. # The default value is: NO. -CREATE_SUBDIRS = NO +CREATE_SUBDIRS = NO # 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 @@ -76,7 +76,7 @@ CREATE_SUBDIRS = NO # U+3044. # The default value is: NO. -ALLOW_UNICODE_NAMES = NO +ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this @@ -91,7 +91,7 @@ ALLOW_UNICODE_NAMES = NO # Ukrainian and Vietnamese. # The default value is: English. -OUTPUT_LANGUAGE = English +OUTPUT_LANGUAGE = English # The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all # documentation generated by doxygen is written. Doxygen will use this @@ -99,14 +99,14 @@ OUTPUT_LANGUAGE = English # Possible values are: None, LTR, RTL and Context. # The default value is: None. -OUTPUT_TEXT_DIRECTION = None +OUTPUT_TEXT_DIRECTION = None # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. -BRIEF_MEMBER_DESC = YES +BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description @@ -115,7 +115,7 @@ BRIEF_MEMBER_DESC = YES # brief descriptions will be completely suppressed. # The default value is: YES. -REPEAT_BRIEF = YES +REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found @@ -126,24 +126,24 @@ REPEAT_BRIEF = YES # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. -ABBREVIATE_BRIEF = "The $name class" \ - "The $name widget" \ - "The $name file" \ - is \ - provides \ - specifies \ - contains \ - represents \ - a \ - an \ - the +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. -ALWAYS_DETAILED_SEC = NO +ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those @@ -151,14 +151,14 @@ ALWAYS_DETAILED_SEC = NO # operators of the base classes will not be shown. # The default value is: NO. -INLINE_INHERITED_MEMB = NO +INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. -FULL_PATH_NAMES = YES +FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand @@ -170,7 +170,7 @@ FULL_PATH_NAMES = YES # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. -STRIP_FROM_PATH = +STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which @@ -179,14 +179,14 @@ STRIP_FROM_PATH = # specify the list of include paths that are normally passed to the compiler # using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. -SHORT_NAMES = NO +SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief @@ -195,7 +195,7 @@ SHORT_NAMES = NO # description.) # The default value is: NO. -JAVADOC_AUTOBRIEF = NO +JAVADOC_AUTOBRIEF = NO # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as @@ -205,7 +205,7 @@ JAVADOC_AUTOBRIEF = NO # interpreted by doxygen. # The default value is: NO. -JAVADOC_BANNER = NO +JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If @@ -213,7 +213,7 @@ JAVADOC_BANNER = NO # requiring an explicit \brief command for a brief description.) # The default value is: NO. -QT_AUTOBRIEF = NO +QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as @@ -233,26 +233,26 @@ MULTILINE_CPP_IS_BRIEF = NO # documentation blocks is shown as doxygen documentation. # The default value is: YES. -PYTHON_DOCSTRING = YES +PYTHON_DOCSTRING = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. -INHERIT_DOCS = YES +INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. -SEPARATE_MEMBER_PAGES = NO +SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. -TAB_SIZE = 4 +TAB_SIZE = 4 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: @@ -269,7 +269,7 @@ TAB_SIZE = 4 # commands \{ and \} for these it is advised to use the version @{ and @} or use # a double escape (\\{ and \\}) -ALIASES = +ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For @@ -277,7 +277,7 @@ ALIASES = # members will be omitted, etc. # The default value is: NO. -OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored @@ -285,19 +285,19 @@ OPTIMIZE_OUTPUT_FOR_C = NO # qualified scopes will look different, etc. # The default value is: NO. -OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. -OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. -OPTIMIZE_OUTPUT_VHDL = NO +OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that @@ -305,7 +305,7 @@ OPTIMIZE_OUTPUT_VHDL = NO # separated into more groups, etc. # The default value is: NO. -OPTIMIZE_OUTPUT_SLICE = NO +OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given @@ -328,7 +328,7 @@ OPTIMIZE_OUTPUT_SLICE = NO # # Note see also the list of default file extension mappings. -EXTENSION_MAPPING = +EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable @@ -338,7 +338,7 @@ EXTENSION_MAPPING = # case of backward compatibilities issues. # The default value is: YES. -MARKDOWN_SUPPORT = YES +MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if @@ -347,7 +347,7 @@ MARKDOWN_SUPPORT = YES # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. -TOC_INCLUDE_HEADINGS = 5 +TOC_INCLUDE_HEADINGS = 5 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can @@ -355,7 +355,7 @@ TOC_INCLUDE_HEADINGS = 5 # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. -AUTOLINK_SUPPORT = YES +AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this @@ -365,13 +365,13 @@ AUTOLINK_SUPPORT = YES # diagrams that involve STL classes more complete and accurate. # The default value is: NO. -BUILTIN_STL_SUPPORT = NO +BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. -CPP_CLI_SUPPORT = NO +CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen @@ -379,7 +379,7 @@ CPP_CLI_SUPPORT = NO # of private inheritance when no explicit protection keyword is present. # The default value is: NO. -SIP_SUPPORT = NO +SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make @@ -389,7 +389,7 @@ SIP_SUPPORT = NO # should set this option to NO. # The default value is: YES. -IDL_PROPERTY_SUPPORT = YES +IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first @@ -397,7 +397,7 @@ IDL_PROPERTY_SUPPORT = YES # all members of a group must be documented explicitly. # The default value is: NO. -DISTRIBUTE_GROUP_DOC = NO +DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option @@ -413,7 +413,7 @@ GROUP_NESTED_COMPOUNDS = NO # \nosubgrouping command. # The default value is: YES. -SUBGROUPING = YES +SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) @@ -434,7 +434,7 @@ INLINE_GROUPED_CLASSES = NO # Man pages) or section (for LaTeX and RTF). # The default value is: NO. -INLINE_SIMPLE_STRUCTS = NO +INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So @@ -445,7 +445,7 @@ INLINE_SIMPLE_STRUCTS = NO # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. -TYPEDEF_HIDES_STRUCT = NO +TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be @@ -458,7 +458,7 @@ TYPEDEF_HIDES_STRUCT = NO # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. -LOOKUP_CACHE_SIZE = 0 +LOOKUP_CACHE_SIZE = 0 # The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of @@ -471,7 +471,7 @@ LOOKUP_CACHE_SIZE = 0 # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. -NUM_PROC_THREADS = 1 +NUM_PROC_THREADS = 1 #--------------------------------------------------------------------------- # Build related configuration options @@ -485,31 +485,31 @@ NUM_PROC_THREADS = 1 # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = NO +EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. -EXTRACT_PRIVATE = NO +EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. -EXTRACT_PRIV_VIRTUAL = NO +EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. -EXTRACT_PACKAGE = NO +EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = NO +EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, @@ -517,7 +517,7 @@ EXTRACT_STATIC = NO # for Java sources. # The default value is: YES. -EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are @@ -525,7 +525,7 @@ EXTRACT_LOCAL_CLASSES = YES # included. # The default value is: NO. -EXTRACT_LOCAL_METHODS = NO +EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called @@ -534,7 +534,7 @@ EXTRACT_LOCAL_METHODS = NO # are hidden. # The default value is: NO. -EXTRACT_ANON_NSPACES = NO +EXTRACT_ANON_NSPACES = NO # If this flag is set to YES, the name of an unnamed parameter in a declaration # will be determined by the corresponding definition. By default unnamed @@ -549,7 +549,7 @@ RESOLVE_UNNAMED_PARAMS = YES # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. -HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set @@ -557,28 +557,28 @@ HIDE_UNDOC_MEMBERS = NO # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. -HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. -HIDE_FRIEND_COMPOUNDS = NO +HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. -HIDE_IN_BODY_DOCS = NO +HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. -INTERNAL_DOCS = NO +INTERNAL_DOCS = NO # With the correct setting of option CASE_SENSE_NAMES doxygen will better be # able to match the capabilities of the underlying filesystem. In case the @@ -594,14 +594,14 @@ INTERNAL_DOCS = NO # YES. # The default value is: system dependent. -CASE_SENSE_NAMES = YES +CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. -HIDE_SCOPE_NAMES = NO +HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to @@ -614,33 +614,33 @@ HIDE_COMPOUND_REFERENCE= NO # the files that are included by a file in the documentation of that file. # The default value is: YES. -SHOW_INCLUDE_FILES = YES +SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. -SHOW_GROUPED_MEMB_INC = NO +SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. -FORCE_LOCAL_INCLUDES = NO +FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. -INLINE_INFO = YES +INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. -SORT_MEMBER_DOCS = YES +SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member @@ -648,7 +648,7 @@ SORT_MEMBER_DOCS = YES # this will also influence the order of the classes in the class list. # The default value is: NO. -SORT_BRIEF_DOCS = NO +SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and @@ -667,7 +667,7 @@ SORT_MEMBERS_CTORS_1ST = NO # appear in their defined order. # The default value is: NO. -SORT_GROUP_NAMES = NO +SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will @@ -677,7 +677,7 @@ SORT_GROUP_NAMES = NO # list. # The default value is: NO. -SORT_BY_SCOPE_NAME = NO +SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between @@ -687,25 +687,25 @@ SORT_BY_SCOPE_NAME = NO # accept a match between prototype and implementation in such cases. # The default value is: NO. -STRICT_PROTO_MATCHING = NO +STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. -GENERATE_TODOLIST = YES +GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. -GENERATE_TESTLIST = YES +GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. -GENERATE_BUGLIST = YES +GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in @@ -718,7 +718,7 @@ GENERATE_DEPRECATEDLIST= YES # sections, marked by \if ... \endif and \cond # ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the @@ -729,28 +729,28 @@ ENABLED_SECTIONS = # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. -MAX_INITIALIZER_LINES = 30 +MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. -SHOW_USED_FILES = YES +SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. -SHOW_FILES = YES +SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. -SHOW_NAMESPACES = YES +SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from @@ -760,7 +760,7 @@ SHOW_NAMESPACES = YES # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated @@ -773,7 +773,7 @@ FILE_VERSION_FILTER = # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -783,7 +783,7 @@ LAYOUT_FILE = # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. -CITE_BIB_FILES = +CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -794,7 +794,7 @@ CITE_BIB_FILES = # messages are off. # The default value is: NO. -QUIET = NO +QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES @@ -803,14 +803,14 @@ QUIET = NO # Tip: Turn warnings on while writing the documentation. # The default value is: YES. -WARNINGS = YES +WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. -WARN_IF_UNDOCUMENTED = YES +WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters @@ -818,7 +818,7 @@ WARN_IF_UNDOCUMENTED = YES # markup commands wrongly. # The default value is: YES. -WARN_IF_DOC_ERROR = YES +WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return @@ -827,7 +827,7 @@ WARN_IF_DOC_ERROR = YES # EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. -WARN_NO_PARAMDOC = NO +WARN_NO_PARAMDOC = NO # 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 @@ -836,7 +836,7 @@ WARN_NO_PARAMDOC = NO # Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. -WARN_AS_ERROR = NO +WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which @@ -846,13 +846,13 @@ WARN_AS_ERROR = NO # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. -WARN_FORMAT = "$file:$line: $text" +WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -864,9 +864,9 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = README.md \ - src - +INPUT = docs/README.md \ + docs/analysis.md \ + src # 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 @@ -875,7 +875,7 @@ INPUT = README.md \ # https://www.gnu.org/software/libiconv/) for the list of possible encodings. # The default value is: UTF-8. -INPUT_ENCODING = UTF-8 +INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and @@ -895,57 +895,57 @@ INPUT_ENCODING = UTF-8 # *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, # *.ucf, *.qsf and *.ice. -FILE_PATTERNS = *.c \ - *.cc \ - *.cxx \ - *.cpp \ - *.c++ \ - *.java \ - *.ii \ - *.ixx \ - *.ipp \ - *.i++ \ - *.inl \ - *.idl \ - *.ddl \ - *.odl \ - *.h \ - *.hh \ - *.hxx \ - *.hpp \ - *.h++ \ - *.cs \ - *.d \ - *.php \ - *.php4 \ - *.php5 \ - *.phtml \ - *.inc \ - *.m \ - *.markdown \ - *.md \ - *.mm \ - *.dox \ - *.py \ - *.pyw \ - *.f90 \ - *.f95 \ - *.f03 \ - *.f08 \ - *.f18 \ - *.f \ - *.for \ - *.vhd \ - *.vhdl \ - *.ucf \ - *.qsf \ - *.ice +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. -RECURSIVE = YES +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a @@ -954,14 +954,14 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. -EXCLUDE_SYMLINKS = NO +EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude @@ -970,7 +970,7 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the @@ -981,33 +981,33 @@ EXCLUDE_PATTERNS = # 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 = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. -EXAMPLE_PATTERNS = * +EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. -EXAMPLE_RECURSIVE = NO +EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = .github/logo_extended.svg +IMAGE_PATH = docs/logo_extended.png # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -1028,7 +1028,7 @@ IMAGE_PATH = .github/logo_extended.svg # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = +INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -1041,14 +1041,14 @@ INPUT_FILTER = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -FILTER_PATTERNS = +FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. -FILTER_SOURCE_FILES = NO +FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and @@ -1076,20 +1076,20 @@ USE_MDFILE_AS_MAINPAGE = README.md # also VERBATIM_HEADERS is set to NO. # The default value is: NO. -SOURCE_BROWSER = NO +SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. -INLINE_SOURCES = NO +INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. -STRIP_CODE_COMMENTS = YES +STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. @@ -1101,7 +1101,7 @@ REFERENCED_BY_RELATION = NO # all documented entities called/used by that function will be listed. # The default value is: NO. -REFERENCES_RELATION = NO +REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and @@ -1119,7 +1119,7 @@ REFERENCES_LINK_SOURCE = YES # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. -SOURCE_TOOLTIPS = YES +SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in @@ -1141,7 +1141,7 @@ SOURCE_TOOLTIPS = YES # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. -USE_HTAGS = NO +USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is @@ -1149,7 +1149,7 @@ USE_HTAGS = NO # See also: Section \class. # The default value is: YES. -VERBATIM_HEADERS = YES +VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: @@ -1166,7 +1166,7 @@ CLANG_ASSISTED_PARSING = NO # YES then doxygen will add the directory of each input to the include path. # The default value is: YES. -CLANG_ADD_INC_PATHS = YES +CLANG_ADD_INC_PATHS = YES # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that @@ -1174,7 +1174,7 @@ CLANG_ADD_INC_PATHS = YES # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_OPTIONS = +CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the directory containing a file called compile_commands.json. This @@ -1187,7 +1187,7 @@ CLANG_OPTIONS = # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. -CLANG_DATABASE_PATH = +CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index @@ -1198,7 +1198,7 @@ CLANG_DATABASE_PATH = # classes, structs, unions or interfaces. # The default value is: YES. -ALPHABETICAL_INDEX = YES +ALPHABETICAL_INDEX = YES # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag @@ -1206,7 +1206,7 @@ ALPHABETICAL_INDEX = YES # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output @@ -1215,7 +1215,7 @@ IGNORE_PREFIX = # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. -GENERATE_HTML = YES +GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1223,14 +1223,14 @@ GENERATE_HTML = YES # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_OUTPUT = html +HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FILE_EXTENSION = .html +HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a @@ -1250,7 +1250,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1260,7 +1260,7 @@ HTML_HEADER = # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1272,7 +1272,7 @@ HTML_FOOTER = # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1285,7 +1285,7 @@ HTML_STYLESHEET = # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1295,7 +1295,7 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to @@ -1306,7 +1306,7 @@ HTML_EXTRA_FILES = # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A @@ -1314,7 +1314,7 @@ HTML_COLORSTYLE_HUE = 220 # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 @@ -1325,7 +1325,7 @@ HTML_COLORSTYLE_SAT = 100 # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. -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 @@ -1334,7 +1334,7 @@ HTML_COLORSTYLE_GAMMA = 80 # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_TIMESTAMP = NO +HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that @@ -1345,7 +1345,7 @@ HTML_TIMESTAMP = NO # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_MENUS = YES +HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the @@ -1353,7 +1353,7 @@ HTML_DYNAMIC_MENUS = YES # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_SECTIONS = NO +HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand @@ -1381,7 +1381,7 @@ HTML_INDEX_NUM_ENTRIES = 100 # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_DOCSET = NO +GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider @@ -1389,7 +1389,7 @@ GENERATE_DOCSET = NO # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. @@ -1397,7 +1397,7 @@ DOCSET_FEEDNAME = "Doxygen generated docs" # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style @@ -1405,13 +1405,13 @@ DOCSET_BUNDLE_ID = org.doxygen.Project # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. -DOCSET_PUBLISHER_NAME = Publisher +DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The @@ -1429,14 +1429,14 @@ DOCSET_PUBLISHER_NAME = Publisher # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_HTMLHELP = NO +GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = +CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, @@ -1444,20 +1444,20 @@ CHM_FILE = # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -HHC_LOCATION = +HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -GENERATE_CHI = NO +GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it @@ -1465,14 +1465,14 @@ CHM_INDEX_ENCODING = # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -BINARY_TOC = NO +BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -TOC_EXPAND = NO +TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that @@ -1481,14 +1481,14 @@ TOC_EXPAND = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_QHP = NO +GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. -QCH_FILE = +QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace @@ -1497,7 +1497,7 @@ QCH_FILE = # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_NAMESPACE = org.doxygen.Project +QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual @@ -1506,7 +1506,7 @@ QHP_NAMESPACE = org.doxygen.Project # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_VIRTUAL_FOLDER = doc +QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom @@ -1514,7 +1514,7 @@ QHP_VIRTUAL_FOLDER = doc # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom @@ -1522,21 +1522,21 @@ QHP_CUST_FILTER_NAME = # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = +QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To @@ -1548,7 +1548,7 @@ QHG_LOCATION = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_ECLIPSEHELP = NO +GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this @@ -1556,7 +1556,7 @@ GENERATE_ECLIPSEHELP = NO # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. -ECLIPSE_DOC_ID = org.doxygen.Project +ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The @@ -1567,7 +1567,7 @@ ECLIPSE_DOC_ID = org.doxygen.Project # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -DISABLE_INDEX = NO +DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag @@ -1584,7 +1584,7 @@ DISABLE_INDEX = NO # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -GENERATE_TREEVIEW = NO +GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. @@ -1594,21 +1594,21 @@ GENERATE_TREEVIEW = NO # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. -ENUM_VALUES_PER_LINE = 4 +ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. -TREEVIEW_WIDTH = 250 +TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -EXT_LINKS_IN_WINDOW = NO +EXT_LINKS_IN_WINDOW = NO # 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 @@ -1619,7 +1619,7 @@ EXT_LINKS_IN_WINDOW = NO # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FORMULA_FORMAT = png +HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful @@ -1628,7 +1628,7 @@ HTML_FORMULA_FORMAT = png # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. -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 @@ -1639,13 +1639,13 @@ FORMULA_FONTSIZE = 10 # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -FORMULA_TRANSPARENT = YES +FORMULA_TRANSPARENT = YES # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. -FORMULA_MACROFILE = +FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering @@ -1656,7 +1656,7 @@ FORMULA_MACROFILE = # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -USE_MATHJAX = NO +USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: @@ -1666,7 +1666,7 @@ USE_MATHJAX = NO # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_FORMAT = HTML-CSS +MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory @@ -1679,14 +1679,14 @@ MATHJAX_FORMAT = HTML-CSS # The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_EXTENSIONS = +MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site @@ -1695,7 +1695,7 @@ MATHJAX_EXTENSIONS = # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_CODEFILE = +MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and @@ -1716,7 +1716,7 @@ MATHJAX_CODEFILE = # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -SEARCHENGINE = YES +SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using JavaScript. There @@ -1728,7 +1728,7 @@ SEARCHENGINE = YES # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. -SERVER_BASED_SEARCH = NO +SERVER_BASED_SEARCH = NO # When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file @@ -1745,7 +1745,7 @@ SERVER_BASED_SEARCH = NO # The default value is: NO. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH = NO +EXTERNAL_SEARCH = NO # The SEARCHENGINE_URL should point to a search engine hosted by a web server # which will return the search results when EXTERNAL_SEARCH is enabled. @@ -1757,7 +1757,7 @@ EXTERNAL_SEARCH = NO # details. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHENGINE_URL = +SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the @@ -1765,7 +1765,7 @@ SEARCHENGINE_URL = # The default file is: searchdata.xml. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHDATA_FILE = searchdata.xml +SEARCHDATA_FILE = searchdata.xml # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the # EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is @@ -1773,7 +1773,7 @@ SEARCHDATA_FILE = searchdata.xml # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH_ID = +EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are @@ -1783,7 +1783,7 @@ EXTERNAL_SEARCH_ID = # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. -EXTRA_SEARCH_MAPPINGS = +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output @@ -1792,7 +1792,7 @@ EXTRA_SEARCH_MAPPINGS = # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. -GENERATE_LATEX = YES +GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1800,7 +1800,7 @@ GENERATE_LATEX = YES # The default directory is: latex. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_OUTPUT = latex +LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. @@ -1812,7 +1812,7 @@ LATEX_OUTPUT = latex # the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_CMD_NAME = +LATEX_CMD_NAME = # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. @@ -1822,7 +1822,7 @@ LATEX_CMD_NAME = # The default file is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. -MAKEINDEX_CMD_NAME = makeindex +MAKEINDEX_CMD_NAME = makeindex # The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to # generate index for LaTeX. In case there is no backslash (\) as first character @@ -1832,7 +1832,7 @@ MAKEINDEX_CMD_NAME = makeindex # The default value is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_MAKEINDEX_CMD = makeindex +LATEX_MAKEINDEX_CMD = makeindex # If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some @@ -1840,7 +1840,7 @@ LATEX_MAKEINDEX_CMD = makeindex # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -COMPACT_LATEX = NO +COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used by the # printer. @@ -1849,7 +1849,7 @@ COMPACT_LATEX = NO # The default value is: a4. # This tag requires that the tag GENERATE_LATEX is set to YES. -PAPER_TYPE = a4 +PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names # that should be included in the LaTeX output. The package can be specified just @@ -1861,7 +1861,7 @@ PAPER_TYPE = a4 # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for the # generated LaTeX document. The header should contain everything until the first @@ -1877,7 +1877,7 @@ EXTRA_PACKAGES = # to HTML_HEADER. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HEADER = +LATEX_HEADER = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the # generated LaTeX document. The footer should contain everything after the last @@ -1888,7 +1888,7 @@ LATEX_HEADER = # Note: Only use a user-defined footer if you know what you are doing! # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_FOOTER = +LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created @@ -1907,7 +1907,7 @@ LATEX_EXTRA_STYLESHEET = # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_FILES = +LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will @@ -1916,7 +1916,7 @@ LATEX_EXTRA_FILES = # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. -PDF_HYPERLINKS = YES +PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX @@ -1926,7 +1926,7 @@ PDF_HYPERLINKS = YES # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. -USE_PDFLATEX = YES +USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running @@ -1935,14 +1935,14 @@ USE_PDFLATEX = YES # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_BATCHMODE = NO +LATEX_BATCHMODE = NO # If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the # index chapters (such as File Index, Compound Index, etc.) in the output. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HIDE_INDICES = NO +LATEX_HIDE_INDICES = NO # If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source # code with syntax highlighting in the LaTeX output. @@ -1952,7 +1952,7 @@ LATEX_HIDE_INDICES = NO # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_SOURCE_CODE = NO +LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See @@ -1960,7 +1960,7 @@ LATEX_SOURCE_CODE = NO # The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. -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 @@ -1968,7 +1968,7 @@ LATEX_BIB_STYLE = plain # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_TIMESTAMP = NO +LATEX_TIMESTAMP = NO # The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) # path from which the emoji images will be read. If a relative path is entered, @@ -1976,7 +1976,7 @@ LATEX_TIMESTAMP = NO # LATEX_OUTPUT directory will be used. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EMOJI_DIRECTORY = +LATEX_EMOJI_DIRECTORY = #--------------------------------------------------------------------------- # Configuration options related to the RTF output @@ -1987,7 +1987,7 @@ LATEX_EMOJI_DIRECTORY = # readers/editors. # The default value is: NO. -GENERATE_RTF = NO +GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1995,7 +1995,7 @@ GENERATE_RTF = NO # The default directory is: rtf. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_OUTPUT = rtf +RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some @@ -2003,7 +2003,7 @@ RTF_OUTPUT = rtf # The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -COMPACT_RTF = NO +COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will # contain hyperlink fields. The RTF file will contain links (just like the HTML @@ -2015,7 +2015,7 @@ COMPACT_RTF = NO # The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_HYPERLINKS = NO +RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # configuration file, i.e. a series of assignments. You only have to provide @@ -2025,14 +2025,14 @@ RTF_HYPERLINKS = NO # default style sheet that doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_STYLESHEET_FILE = +RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is # similar to doxygen's configuration file. A template extensions file can be # generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = +RTF_EXTENSIONS_FILE = # If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code # with syntax highlighting in the RTF output. @@ -2042,7 +2042,7 @@ RTF_EXTENSIONS_FILE = # The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_SOURCE_CODE = NO +RTF_SOURCE_CODE = NO #--------------------------------------------------------------------------- # Configuration options related to the man page output @@ -2052,7 +2052,7 @@ RTF_SOURCE_CODE = NO # classes and files. # The default value is: NO. -GENERATE_MAN = NO +GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -2061,7 +2061,7 @@ GENERATE_MAN = NO # The default directory is: man. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_OUTPUT = man +MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to the generated # man pages. In case the manual section does not start with a number, the number @@ -2070,14 +2070,14 @@ MAN_OUTPUT = man # The default value is: .3. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_EXTENSION = .3 +MAN_EXTENSION = .3 # The MAN_SUBDIR tag determines the name of the directory created within # MAN_OUTPUT in which the man pages are placed. If defaults to man followed by # MAN_EXTENSION with the initial . removed. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_SUBDIR = +MAN_SUBDIR = # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real @@ -2086,7 +2086,7 @@ MAN_SUBDIR = # The default value is: NO. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_LINKS = NO +MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the XML output @@ -2096,7 +2096,7 @@ MAN_LINKS = NO # captures the structure of the code including all documentation. # The default value is: NO. -GENERATE_XML = NO +GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -2104,7 +2104,7 @@ GENERATE_XML = NO # The default directory is: xml. # This tag requires that the tag GENERATE_XML is set to YES. -XML_OUTPUT = xml +XML_OUTPUT = xml # If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to @@ -2113,7 +2113,7 @@ XML_OUTPUT = xml # The default value is: YES. # This tag requires that the tag GENERATE_XML is set to YES. -XML_PROGRAMLISTING = YES +XML_PROGRAMLISTING = YES # If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include # namespace members in file scope as well, matching the HTML output. @@ -2130,7 +2130,7 @@ XML_NS_MEMB_FILE_SCOPE = NO # that can be used to generate PDF. # The default value is: NO. -GENERATE_DOCBOOK = NO +GENERATE_DOCBOOK = NO # The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be put in @@ -2138,7 +2138,7 @@ GENERATE_DOCBOOK = NO # The default directory is: docbook. # This tag requires that the tag GENERATE_DOCBOOK is set to YES. -DOCBOOK_OUTPUT = docbook +DOCBOOK_OUTPUT = docbook # If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the # program listings (including syntax highlighting and cross-referencing @@ -2159,7 +2159,7 @@ DOCBOOK_PROGRAMLISTING = NO # is still experimental and incomplete at the moment. # The default value is: NO. -GENERATE_AUTOGEN_DEF = NO +GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # Configuration options related to the Perl module output @@ -2171,7 +2171,7 @@ GENERATE_AUTOGEN_DEF = NO # Note that this feature is still experimental and incomplete at the moment. # The default value is: NO. -GENERATE_PERLMOD = NO +GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI @@ -2179,7 +2179,7 @@ GENERATE_PERLMOD = NO # The default value is: NO. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_LATEX = NO +PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely # formatted so it can be parsed by a human reader. This is useful if you want to @@ -2189,7 +2189,7 @@ PERLMOD_LATEX = NO # The default value is: YES. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_PRETTY = YES +PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file are # prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful @@ -2207,7 +2207,7 @@ PERLMOD_MAKEVAR_PREFIX = # C-preprocessor directives found in the sources and include files. # The default value is: YES. -ENABLE_PREPROCESSING = YES +ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be @@ -2216,7 +2216,7 @@ ENABLE_PREPROCESSING = YES # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -MACRO_EXPANSION = NO +MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then # the macro expansion is limited to the macros specified with the PREDEFINED and @@ -2224,21 +2224,21 @@ MACRO_EXPANSION = NO # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_ONLY_PREDEF = NO +EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -SEARCH_INCLUDES = YES +SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the # preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the @@ -2246,7 +2246,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2256,7 +2256,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = +PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2265,7 +2265,7 @@ PREDEFINED = # definition found in the source code. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have @@ -2275,7 +2275,7 @@ EXPAND_AS_DEFINED = # The default value is: YES. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -SKIP_FUNCTION_MACROS = YES +SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration options related to external references @@ -2294,34 +2294,34 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be # listed. # The default value is: NO. -ALLEXTERNALS = NO +ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed # in the modules index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. -EXTERNAL_GROUPS = YES +EXTERNAL_GROUPS = YES # If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in # the related pages index. If set to NO, only the current project's pages will # be listed. # The default value is: YES. -EXTERNAL_PAGES = YES +EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- # Configuration options related to the dot tool @@ -2334,20 +2334,20 @@ EXTERNAL_PAGES = YES # powerful graphs. # The default value is: YES. -CLASS_DIAGRAMS = 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 = +DIA_PATH = # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. -HIDE_UNDOC_RELATIONS = YES +HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: @@ -2356,7 +2356,7 @@ HIDE_UNDOC_RELATIONS = YES # set to NO # The default value is: YES. -HAVE_DOT = YES +HAVE_DOT = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed # to run in parallel. When set to 0 doxygen will base this on the number of @@ -2366,7 +2366,7 @@ HAVE_DOT = YES # Minimum value: 0, maximum value: 32, default value: 0. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_NUM_THREADS = 0 +DOT_NUM_THREADS = 0 # When you want a differently looking font in the dot files that doxygen # generates you can specify the font name using DOT_FONTNAME. You need to make @@ -2376,21 +2376,21 @@ DOT_NUM_THREADS = 0 # The default value is: Helvetica. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size (in points) of the font of # dot graphs. # Minimum value: 4, maximum value: 24, default value: 10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the default font as specified with # DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set # the path where dot can find it using this tag. # 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 # each documented class showing the direct and indirect inheritance relations. @@ -2398,7 +2398,7 @@ DOT_FONTPATH = # 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 # graph for each documented class showing the direct and indirect implementation @@ -2407,14 +2407,14 @@ CLASS_GRAPH = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -COLLABORATION_GRAPH = YES +COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for # groups, showing the direct groups dependencies. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -GROUP_GRAPHS = YES +GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling @@ -2422,7 +2422,7 @@ GROUP_GRAPHS = YES # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -UML_LOOK = NO +UML_LOOK = NO # If the UML_LOOK tag is enabled, the fields and methods are shown inside the # class node. If there are many fields or methods and many nodes the graph may @@ -2435,7 +2435,7 @@ UML_LOOK = NO # Minimum value: 0, maximum value: 100, default value: 10. # This tag requires that the tag UML_LOOK is set to YES. -UML_LIMIT_NUM_FIELDS = 10 +UML_LIMIT_NUM_FIELDS = 10 # If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and # methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS @@ -2448,7 +2448,7 @@ UML_LIMIT_NUM_FIELDS = 10 # The default value is: NO. # This tag requires that the tag UML_LOOK is set to YES. -DOT_UML_DETAILS = NO +DOT_UML_DETAILS = NO # The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters # to display on a single line. If the actual line length exceeds this threshold @@ -2457,7 +2457,7 @@ DOT_UML_DETAILS = NO # Minimum value: 0, maximum value: 1000, default value: 17. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_WRAP_THRESHOLD = 17 +DOT_WRAP_THRESHOLD = 17 # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their @@ -2465,7 +2465,7 @@ DOT_WRAP_THRESHOLD = 17 # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -TEMPLATE_RELATIONS = NO +TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then doxygen will generate a graph for each documented file showing the @@ -2474,7 +2474,7 @@ TEMPLATE_RELATIONS = NO # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -INCLUDE_GRAPH = YES +INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then doxygen will generate a graph for each documented file showing @@ -2483,7 +2483,7 @@ INCLUDE_GRAPH = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -INCLUDED_BY_GRAPH = YES +INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH tag is set to YES then doxygen will generate a call # dependency graph for every global function or class method. @@ -2495,7 +2495,7 @@ INCLUDED_BY_GRAPH = YES # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALL_GRAPH = NO +CALL_GRAPH = NO # If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller # dependency graph for every global function or class method. @@ -2507,14 +2507,14 @@ CALL_GRAPH = NO # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -CALLER_GRAPH = NO +CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -GRAPHICAL_HIERARCHY = YES +GRAPHICAL_HIERARCHY = YES # 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 @@ -2523,7 +2523,7 @@ GRAPHICAL_HIERARCHY = YES # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -DIRECTORY_GRAPH = YES +DIRECTORY_GRAPH = YES # 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 @@ -2540,7 +2540,7 @@ DIRECTORY_GRAPH = YES # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_IMAGE_FORMAT = png +DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. @@ -2552,32 +2552,32 @@ DOT_IMAGE_FORMAT = png # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -INTERACTIVE_SVG = NO +INTERACTIVE_SVG = NO # The DOT_PATH tag can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile # command). # This tag requires that the tag HAVE_DOT is set to YES. -DOTFILE_DIRS = +DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile # command). -MSCFILE_DIRS = +MSCFILE_DIRS = # 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 # command). -DIAFILE_DIRS = +DIAFILE_DIRS = # 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 @@ -2585,17 +2585,17 @@ DIAFILE_DIRS = # generate a warning when it encounters a \startuml command in this case and # will not generate output for the diagram. -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. -PLANTUML_CFG_FILE = +PLANTUML_CFG_FILE = # When using plantuml, the specified paths are searched for files specified by # the !include statement in a plantuml block. -PLANTUML_INCLUDE_PATH = +PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes @@ -2607,7 +2607,7 @@ PLANTUML_INCLUDE_PATH = # Minimum value: 0, maximum value: 10000, default value: 50. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_GRAPH_MAX_NODES = 50 +DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs # generated by dot. A depth value of 3 means that only nodes reachable from the @@ -2619,7 +2619,7 @@ DOT_GRAPH_MAX_NODES = 50 # Minimum value: 0, maximum value: 1000, default value: 0. # This tag requires that the tag HAVE_DOT is set to YES. -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 @@ -2631,7 +2631,7 @@ MAX_DOT_GRAPH_DEPTH = 0 # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_TRANSPARENT = NO +DOT_TRANSPARENT = NO # 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 @@ -2640,7 +2640,7 @@ DOT_TRANSPARENT = NO # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_MULTI_TARGETS = NO +DOT_MULTI_TARGETS = NO # 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 @@ -2648,7 +2648,7 @@ DOT_MULTI_TARGETS = NO # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. -GENERATE_LEGEND = YES +GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. @@ -2657,4 +2657,4 @@ GENERATE_LEGEND = YES # plantuml temporary files. # The default value is: YES. -DOT_CLEANUP = YES +DOT_CLEANUP = YES diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..ffab4fa --- /dev/null +++ b/docs/README.md @@ -0,0 +1,129 @@ +![IoD_Sim ](docs/logo_extended.png) + +[IoD_Sim](https://telematics.poliba.it/iod-sim) is an open source and +system-level simulator for the IoD ([Internet of +Drones](https://ieeexplore.ieee.org/document/7423671)). + +Developed on top of the well-known [ns-3](https://www.nsnam.org/) (Network +Simulator 3), it implements the key networking elements (drones, network access +points, and Zone Service Provider), a standard-compliant communication stack +based on the IEEE 802.11 and LTE technology, and scenarios with various mobility +models. + +The source code presents the implementation of models and examples scripts, +also known as _scenarios_, that use such models to simulate a variable number +of drones that: + +- Move according to the mobility model associated to the reference scenario. +- Exchange messages with network access points deployed on a cartesian or geographic 3D space. + +For more details on how IoD_Sim works and all its features, the following +research publications are highly recommended: + +- [G. Grieco, G. Iacovelli, P. Boccadoro and L. A. Grieco, "Internet of Drones Simulator: Design, Implementation, and Performance Evaluation," in IEEE Internet of Things Journal, vol. 10, no. 2, pp. 1476-1498, 15 Jan.15, 2023, doi: 10.1109/JIOT.2022.3207324.](https://doi.org/10.1109/JIOT.2022.3207324) +- [G. Grieco, G. Iacovelli, M. Sandri, M. Giordani, M. Zorzi and L. A. Grieco, "Preliminary Performance Evaluation of avSatellite-to-HAP Communication Link," European Wireless 2023; 28th European Wireless Conference, Rome, Italy, 2023, pp. 340-345.](https://ieeexplore.ieee.org/abstract/document/10461435) +- [G. Grieco, G. Iacovelli, D. Pugliese, D. Striccoli and L. A. Grieco, "A System-Level Simulation Module for Multi-UAV IRS-Assisted Communications," in IEEE Transactions on Vehicular Technology, vol. 73, no. 5, pp. 6740-6751, May 2024, doi: 10.1109/TVT.2023.3342298.](https://dx.doi.org/10.1109/TVT.2023.3342298) + +Older publications that might still be useful: + +- [G. Grieco, R. Artuso, P. Boccadoro, G. Piro and L. A. Grieco, "An Open Source and System-Level Simulator for the Internet of Drones," 2019 IEEE 30th International Symposium on Personal, Indoor and Mobile Radio Communications (PIMRC Workshops), Istanbul, Turkey, 2019, pp. 1-6, doi: 10.1109/PIMRCW.2019.8880832.](https://ieeexplore.ieee.org/document/8880832) + +You can head over to the [Releases](https://github.com/telematics-lab/IoD_Sim/releases) section to download a copy of a +stable version of the software. + +The IoD_Sim repository is where this software is developed and there are many +ways in which you can participate in the project, for example: + +- [Submit bugs and feature requests](https://github.com/telematics-lab/IoD_Sim/issues) and help us verify as they are + checked in. +- Review [source code changes](https://github.com/telematics-lab/IoD_Sim/commits/main/). +- Review the [documentation](https://github.com/telematics-lab/IoD_Sim/tree/main/docs) and make pull requests for anything, from + typos to new content. + +IoD_Sim is primarily compatible with **Linux**-based operating systems. You can +test it on macOS, altough we are not focused on providing first-class support +for it. For macOS, Windows, or any other operating system, you are encouraged +to use [Docker](https://www.docker.com/), +[WSL](https://docs.microsoft.com/en-us/windows/wsl/about) or any other +(pseudo)virtualization platform that can provide you a stable Linux-based work +environment. You are welcome to provide new compatibility solutions any time. + +Want to build scenarios through a GUI? [Airflow](https://github.com/GiovanniGrieco/IoD_Sim-airflow) +is a Visual Programming Editor ad-hoc for IoD_Sim! It relies on +[splash](https://github.com/GiovanniGrieco/IoD_Sim-splash) to transpile C++ +models in Python visual blocks. + +## Getting Started + +The following quick start has been tested on Ubuntu 22.04 LTS. Please note that +this process may be similar in other distros as well. In case of any difficulties, +you are welcome to raise a pull request and propose some adjustments. + +First of all, clone this repository, then open the folder with VSCode and execute +the following tasks: + +1. Install dependencies, +2. Integrate IoD Sim with ns3 +3. Configure IoD Sim +4. Build IoD Sim + +Otherwise, run the following commands: + +``` +./tools/install-dependencies.sh +./tools/prepare-ns3.sh +cd ns3/ +./ns3 configure --enable-examples --disable-mpi --disable-python --enable-modules=iodsim +./ns3 build +``` + +To run a JSON scenario configuration, execute the following command: + +``` +cd ns3/ +./ns3 run iodsim -- --config=../scenario/simple_wifi.json +``` + +## Generate documentation + +Before proceeding with the simulator, it may be helpful to generate the respective documentation. IoD_Sim relies on the [Doxygen](https://www.doxygen.nl/index.html) tool, which should already be installed with the other dependencies (if not, refer to the specific installation procedure for your distribution). + +The documentation can be generated in HTML and LaTeX formats by running: + +``` +doxygen ./docs/IoD_Sim_doc +``` + +## Working with docker + +After creating your own scenario through the JSON file, you can use [Docker](https://docs.docker.com/engine/) to quickly proceed to simulation in a few steps. The first time, the container image must be built by running the following command in the main directory of the repository: + +``` +docker build . -t docker_iod_sim +``` + +Next, the simulation can be run by launching: + +``` +sudo docker run --rm -v ./results:/IoD_Sim/results -v ./scenario:/IoD_Sim/scenario docker_iod_sim [--help] +``` + +When completed, the `results` folder will contain the results of the simulation. It should be noted that if a new scenario is placed in `./scenario`, there will be no need to rebuild the container. + +## License + +Copyright (C) 2018-2024 [The IoD_Sim Authors](AUTHORS). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +[GNU General Public License](LICENSE) for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. diff --git a/docs/analysis.md b/docs/analysis.md new file mode 100644 index 0000000..df0270c --- /dev/null +++ b/docs/analysis.md @@ -0,0 +1,40 @@ +# Analysis Scripts + +The `analysis` directory contains various scripts used to generate graphs and analyze data. They have been used in the various scientific publications involving IoD_Sim and can be a useful starting point for users utilizing the simulator. + +## Python Scripts + +- **drone_peripheral_consumption_to_state.py**: Analyzes drone peripheral power consumption and maps it to different operational states. +- **geo2kml-line.py**: Converts geographical coordinates into KML format as a line. +- **geo2kml.py**: Transforms geographical data into KML format. +- **geosnr-single.py**: Visualizes Signal-to-Noise Ratio (SNR) for a single simulation with a GEO satellite. +- **geosnr.py**: Computes and visualizes mean SNR over multiple simulations. +- **get_rssi.py**: Extracts Received Signal Strength Indicator (RSSI) from the XML summary file. +- **latency_lte.py**: Analyzes and plots latency data for scenarios in which LTE technology is employed. +- **latency_wifi+lte.py**: Analyzes and plots latency data for scenarios in which both Wi-Fi and LTE technologies are adopted. +- **lte-split_MacUlStats_per_drone.py**: Parse LTE MAC Ul Stats file and output one CSV per drone containing LTE Cell ID and TB size. +- **lte-split_RlcUlStats_per_drone.py**: Parse LTE Rlc Ul Stats file and output one file per drone/IMSI containing the LTE Cell ID. +- **lte-throughput_per_drone.py**: Computes LTE throughput statistics per drone. +- **merge_trajectory_powerconsumption.py**: Merges drone trajectory data with power consumption statistics. +- **pcap-get_pdr.py**: Given a pcap file, for each drone connected to the LTE network extrapolate tcp payload length and export everything in CSV. +- **plr_datarate.py**: Plot PDR/PLR data over distance for different simulations with different datarate. +- **plr_\*.py**: Scripts to evaluate packet loss rate in different scenarios. +- **preview.py**: Provides a preview of a given simulation configuration in terms of drone trajectories and ZSPs position.. +- **progress.py**: Tracks the progress of data processing and analysis tasks. +- **rem-2d-preview.py**: This script generates the plot of a 2D Radio Environment Map using a .rem file. +- **rem-3d-preview.py**: This script generates the plot of a 3D Radio Environment Map using a .rem file. +- **sinr_lte.py**: Computes Signal-to-Interference-plus-Noise Ratio (SINR) for LTE scenarios. +- **sinr_wifi.py**: Calculates SINR for Wi-Fi scenarios. +- **trajectory+cellid.py**: Combine LTE RLC data and trajectory in a single CSV per drone. +- **trajectory2csv.py**: Parse drone trajectories from summary file. +- **txt2ply.py**: Converts text-based data into PLY format for 3D visualization. + +## Shell Scripts + +- **drone_storage_memory.sh**: Parse storage memory from debug log file and output a CSV file per drone. +- **get_drones_peripheral_power_consumption.sh**: Gathers power consumption data for drone peripherals. +- **pcap-get_ip.sh**: Given a pcap file, for each drone connected to the LTE network extrapolate ip packet length and export everything in CSV. +- **pcap-get_lte_tcp_len.sh**: Given a pcap file, for each drone connected to the LTE network extrapolate tcp payload length and export everything in CSV. +- **pcap-get_udp.sh**: Given a pcap file, for each drone connected to the LTE network extrapolate udp payload length and export everything in CSV. +- **pcap-throughput_per_drone.py**: Translate TCP traffic from CSV in throughput. +- **total_power_consumption_drones.sh**: Aggregates and analyzes total power consumption data for drones. \ No newline at end of file diff --git a/docs/logo_extended.png b/docs/logo_extended.png new file mode 100644 index 0000000000000000000000000000000000000000..798dde2e21a87ca228c8c7ee9776f98739044711 GIT binary patch literal 60746 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

Y8hB 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 KQ>#$14*fqRzSm3u literal 0 HcmV?d00001