From f42ffaed3decb19a00597ea90fb4a1ba00ab7194 Mon Sep 17 00:00:00 2001 From: Blake Leverington Date: Fri, 11 Aug 2023 14:09:43 +0200 Subject: [PATCH] first push --- .gitignore | 4 + LICENSE | 674 +++++ README.md | 28 +- scripts/marchposter.png | Bin 0 -> 70853 bytes ...lloscope_15ps_320Hz_singlechannelsplit.png | Bin 0 -> 20268 bytes scripts/oscilloscope_20ps_320Hz.png | Bin 0 -> 21222 bytes scripts/oscilloscope_20ps_320Hz_2v5input.png | Bin 0 -> 18827 bytes scripts/plottdc.py | 35 + scripts/plottdc_dump.py | 49 + source/.gitignore | 2 + source/CMakeLists.txt | 14 + .../.gitignore | 2 + .../CMakeLists.txt | 126 + .../README.md | 2 + .../cmake/version.cmake | 3 + .../config/changelog | 5 + .../config/copyright | 24 + .../config/license | 24 + .../config/triggers | 1 + .../config/version.h | 10 + .../doxygen/Doxyfile.in | 2495 +++++++++++++++++ .../include/config.h | 58 + .../include/gpx2.h | 46 + .../include/version.h | 10 + .../src/config.cpp | 138 + .../src/gpx2.cpp | 196 ++ source/gpx2-raspi-readout-program/.gitignore | 2 + .../gpx2-raspi-readout-program/CMakeLists.txt | 72 + .../cmake/version.cmake | 3 + .../config/version.h | 10 + .../gpx2-raspi-readout-program/include/gpio.h | 128 + .../include/readout.h | 56 + .../include/version.h | 10 + .../gpx2-raspi-readout-program/src/gpio.cpp | 290 ++ .../gpx2-raspi-readout-program/src/main.cpp | 27 + .../src/readout.cpp | 249 ++ source/spi/CMakeLists.txt | 131 + source/spi/cmake/version.cmake | 3 + source/spi/config/changelog | 5 + source/spi/config/copyright | 24 + source/spi/config/license | 24 + source/spi/config/triggers | 1 + source/spi/config/version.h | 10 + source/spi/doxygen/Doxyfile.in | 2495 +++++++++++++++++ source/spi/include/spidevices/gpx2/config.h | 62 + source/spi/include/spidevices/gpx2/gpx2.h | 119 + source/spi/include/spidevices/spidevice.h | 73 + source/spi/include/version.h | 10 + source/spi/spidevices.h | 4 + source/spi/src/spidevices/gpx2/config.cpp | 169 ++ source/spi/src/spidevices/gpx2/gpx2.cpp | 226 ++ source/spi/src/spidevices/spidevice.cpp | 184 ++ 52 files changed, 8328 insertions(+), 5 deletions(-) create mode 100644 LICENSE create mode 100644 scripts/marchposter.png create mode 100644 scripts/oscilloscope_15ps_320Hz_singlechannelsplit.png create mode 100644 scripts/oscilloscope_20ps_320Hz.png create mode 100644 scripts/oscilloscope_20ps_320Hz_2v5input.png create mode 100644 scripts/plottdc.py create mode 100644 scripts/plottdc_dump.py create mode 100644 source/.gitignore create mode 100644 source/CMakeLists.txt create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/.gitignore create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/CMakeLists.txt create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/README.md create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/cmake/version.cmake create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/config/changelog create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/config/copyright create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/config/license create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/config/triggers create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/config/version.h create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/doxygen/Doxyfile.in create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/include/config.h create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/include/gpx2.h create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/include/version.h create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/src/config.cpp create mode 100644 source/gpx2-raspi-pigpiod-lib-deprecated/src/gpx2.cpp create mode 100644 source/gpx2-raspi-readout-program/.gitignore create mode 100644 source/gpx2-raspi-readout-program/CMakeLists.txt create mode 100644 source/gpx2-raspi-readout-program/cmake/version.cmake create mode 100644 source/gpx2-raspi-readout-program/config/version.h create mode 100644 source/gpx2-raspi-readout-program/include/gpio.h create mode 100644 source/gpx2-raspi-readout-program/include/readout.h create mode 100644 source/gpx2-raspi-readout-program/include/version.h create mode 100644 source/gpx2-raspi-readout-program/src/gpio.cpp create mode 100644 source/gpx2-raspi-readout-program/src/main.cpp create mode 100644 source/gpx2-raspi-readout-program/src/readout.cpp create mode 100644 source/spi/CMakeLists.txt create mode 100644 source/spi/cmake/version.cmake create mode 100644 source/spi/config/changelog create mode 100644 source/spi/config/copyright create mode 100644 source/spi/config/license create mode 100644 source/spi/config/triggers create mode 100644 source/spi/config/version.h create mode 100644 source/spi/doxygen/Doxyfile.in create mode 100644 source/spi/include/spidevices/gpx2/config.h create mode 100644 source/spi/include/spidevices/gpx2/gpx2.h create mode 100644 source/spi/include/spidevices/spidevice.h create mode 100644 source/spi/include/version.h create mode 100644 source/spi/spidevices.h create mode 100644 source/spi/src/spidevices/gpx2/config.cpp create mode 100644 source/spi/src/spidevices/gpx2/gpx2.cpp create mode 100644 source/spi/src/spidevices/spidevice.cpp diff --git a/.gitignore b/.gitignore index 2210e40..121dd22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +#my stuff +data/* +*.dat + # ---> C++ # Prerequisites *.d diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 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 for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 1672887..bced521 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,24 @@ -# tdc_gpx2 +# Software for RPi compatible shield for TDC-GPX2 chip +The TDC-GPX2 is a time-to-digital converter from ScioSense with up to 10ps timing accuracy. This software uses the linux kernel for GPIO and SPI-Bus to readout the GPX2 and calculate time intervals between signals. There is also the possibility of reading out the TDC using a FPGA which will then give much faster readout. -readout software for 2 channels [0 and 1] of the tdc-gpx2 board with raspberry pi 3B SPI readout. - -This code is a fork of the original design by marvin.peter@physik.uni-giessen.de -https://github.com/marvin5300/tdc-gpx2_software \ No newline at end of file +# TDC-GPX2_Software +Files for building readout software for the TDC-GPX2 from ScioSense. +| Folder | Description | +| ------ | ----------- | +| source/gpx2-raspi-readout-program| Contains a readout loop, buffer and calculations to measure time intervals between two signals with good accuracy. +| source/spi | Folder containing gpx2 source files for making the tdc board library containing all options and an high level access for readout. +| source/gpx2-fpga | tba | +
+Readout via SPI: + +Required: +- linux operating system (preferrably raspberry pi OS) +- up-to-date c++ compiler (C++17 compatible), tested with clang 11 and newer + +How to build: +- This software packages is build with cmake +- builds the gpx2 library and optionally the readout program + +
+Readout via LVDS using an FPGA:
+coming soon diff --git a/scripts/marchposter.png b/scripts/marchposter.png new file mode 100644 index 0000000000000000000000000000000000000000..c632dc902825b0f678ea77607b954a3eb6a8083d GIT binary patch literal 70853 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�>XxR*9j6A20ZPjFT6aH}a`5hMc~&?HtoVq)tS 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 literal 0 HcmV?d00001 diff --git a/scripts/oscilloscope_15ps_320Hz_singlechannelsplit.png b/scripts/oscilloscope_15ps_320Hz_singlechannelsplit.png new file mode 100644 index 0000000000000000000000000000000000000000..161c2b974e3043182c095e2de291b9e61bf75942 GIT binary patch literal 20268 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 V!vI&<3(y!!`qa6T@y9RS`Y%9Pn5O^$ literal 0 HcmV?d00001 diff --git a/scripts/plottdc.py b/scripts/plottdc.py new file mode 100644 index 0000000..82cfef9 --- /dev/null +++ b/scripts/plottdc.py @@ -0,0 +1,35 @@ +import numpy as np +import matplotlib.pyplot as plt + +# Open the file and read in the data +with open('../data/test02.dat', 'r') as f: + lines = f.readlines() + +# Extract the second column of data +data = [] +for line in lines: + values = line.strip().split() + data.append(float(values[1])) + +#determine histrange from data +hist_range = 5 * np.std(data) +hist_mean = np.mean(data) +hist_start = hist_mean - hist_range +hist_end = hist_mean + hist_range + +# Create the histogram with range +hist, bins, _ = plt.hist(data, bins=100, range=(hist_start,hist_end)) + +# Calculate the mean and RMS +bin_centers = 0.5 * (bins[:-1] + bins[1:]) + +# Set the x-axis label and title +plt.xlabel('Data') +plt.title('Histogram of Data') + +# Show the plot +plt.show() + +# Print the mean and RMS +print(f"Mean: {np.mean(data):.3g}") +print(f"RMS: {np.std(data):.3g}") diff --git a/scripts/plottdc_dump.py b/scripts/plottdc_dump.py new file mode 100644 index 0000000..719013b --- /dev/null +++ b/scripts/plottdc_dump.py @@ -0,0 +1,49 @@ +import argparse +import numpy as np +import matplotlib.pyplot as plt + + +#parse the command line arguments +parser = argparse.ArgumentParser(description="Plot a histogram") +parser.add_argument("input_file",help="Path to the input data set with 7 columns") +args = parser.parse_args() + +# Open the file and read in the data +with open(args.input_file, 'r') as f: + lines = f.readlines() + +# Extract the second column of data +data = [] +for line in lines: + values = line.strip().split() + if len(values) >= 7 and float(values[5]) == 0: + data.append(float(values[6])) + +#determine histrange from data +hist_range = 10 * np.std(data) +hist_mean = np.mean(data) +hist_start = hist_mean - hist_range +hist_end = hist_mean + hist_range + +# Create the histogram with range +hist, bins, _ = plt.hist(data, bins=200, range=(hist_start,hist_end)) + +# Calculate the mean and RMS +bin_centers = 0.5 * (bins[:-1] + bins[1:]) +mean = np.average(bin_centers, weights=hist) +rms = np.sqrt(np.average((bin_centers - mean)**2, weights=hist )) + +# Set the x-axis label and title +plt.xlabel('time difference / seconds') +plt.title(' - ') + +plt.annotate(f"Mean: {mean:.3g}\nRMS; {rms:.3g}", + xy=(0.75, 0.85), + xycoords='axes fraction', + fontsize=12, + bbox=dict(boxstyle="round,pad=0.3", edgecolor="gray", facecolor="lightgray")) + +# Show the plot +plt.show() + + diff --git a/source/.gitignore b/source/.gitignore new file mode 100644 index 0000000..8f403f3 --- /dev/null +++ b/source/.gitignore @@ -0,0 +1,2 @@ +.vs/ +out/ diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..8d98764 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required (VERSION 3.10) +project (gpx2) + +option(BUILD_TIDY "Use clang tidy to build" OFF) +option(BUILD_TOOLS "Build additional tools (like readout program) in addition to the library" ON) +option(BUILD_DOCS "Build doxygen files" OFF) + +set(CMAKE_BUILD_TYPE Release) +message("${CMAKE_HOST_SYSTEM_PROCESSOR}") +add_subdirectory(spi) +if (BUILD_TOOLS) +add_subdirectory(gpx2-raspi-readout-program) +endif (BUILD_TOOLS) + diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/.gitignore b/source/gpx2-raspi-pigpiod-lib-deprecated/.gitignore new file mode 100644 index 0000000..8f403f3 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/.gitignore @@ -0,0 +1,2 @@ +.vs/ +out/ diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/CMakeLists.txt b/source/gpx2-raspi-pigpiod-lib-deprecated/CMakeLists.txt new file mode 100644 index 0000000..c8d59d2 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/CMakeLists.txt @@ -0,0 +1,126 @@ +cmake_minimum_required(VERSION 3.10) +project(gpx2 LANGUAGES CXX C) + +set(PROJECT_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src") +set(PROJECT_HEADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include") +set(PROJECT_CONFIG_DIR "${CMAKE_CURRENT_SOURCE_DIR}/config") + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../lib") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../lib") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../bin") + +include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake") + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) + +# check if Doxygen is installed (from https://vicrucann.github.io/tutorials/quick-cmake-doxygen/) +find_package(Doxygen) +if (DOXYGEN_FOUND AND BUILD_DOCS) + # set input and output files + set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/Doxyfile.in) + set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen/Doxyfile) + + # request to configure the file + configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) + + # note the option ALL which allows to build the docs together with the application + add_custom_target( doc_doxygen ALL + COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Generating API documentation with Doxygen" + VERBATIM ) +elseif (BUILD_DOCS) + message("doxygen need to be installed to generate the doxygen documentation. for generating tree views graphviz is needed.") +else () + message("Selected option doxygen build OFF. Doxygen will not be build.") +endif () + +find_library(PIGPIOD_IF2 pigpiod_if2 REQUIRED) + +add_compile_options( + -Wall + -Wextra + -Wshadow + -Wpedantic + -O3 +) + +configure_file( + "${PROJECT_CONFIG_DIR}/version.h" + "${PROJECT_HEADER_DIR}/version.h" +) + +set(GPX2_SOURCE_FILES + "${PROJECT_SRC_DIR}/gpx2.cpp" + "${PROJECT_SRC_DIR}/config.cpp" +) + +set(GPX2_HEADER_FILES + "${PROJECT_HEADER_DIR}/gpx2.h" + "${PROJECT_HEADER_DIR}/config.h" +) + +add_definitions(-Dgpx2_objlib_LIBRARY_EXPORT) + +add_library(gpx2_objlib OBJECT ${GPX2_SOURCE_FILES} ${GPX2_HEADER_FILES}) + +add_library(gpx2 SHARED $) +add_library(gpx2_static STATIC $) + +target_include_directories(gpx2_objlib PUBLIC + ${PROJECT_HEADER_DIR} +) + +set_property(TARGET gpx2_objlib PROPERTY POSITION_INDEPENDENT_CODE 1) + +target_link_libraries(gpx2_objlib + pigpiod_if2 +) + +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s") + +set_target_properties( +gpx2 +PROPERTIES +SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" +) + +include(GNUInstallDirs) +set(GPX2_PACKAGE_NAME "gpx2") +add_custom_target(changelog ALL COMMAND gzip -cn9 "${PROJECT_CONFIG_DIR}/changelog" > "${CMAKE_CURRENT_BINARY_DIR}/changelog.gz") +install(TARGETS gpx2 DESTINATION lib COMPONENT "${GPX2_PACKAGE_NAME}") +install(FILES ${GPX2_HEADER_FILES} DESTINATION include COMPONENT "${GPX2_PACKAGE_NAME}") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/changelog.gz" DESTINATION "${CMAKE_INSTALL_DOCDIR}" COMPONENT "${GPX2_PACKAGE_NAME}") +install(FILES "${PROJECT_CONFIG_DIR}/copyright" DESTINATION "${CMAKE_INSTALL_DOCDIR}" COMPONENT "${GPX2_PACKAGE_NAME}") + +set(CPACK_GENERATOR "DEB") +set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) +set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_CONFIG_DIR}/copyright") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "pigpiod") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_CONFIG_DIR}/license") +set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${PROJECT_CONFIG_DIR}/triggers") +set(CPACK_PACKAGE_VENDOR "Marvin Peter") +set(CPACK_DEBIAN_PACKAGE_SECTION "libs") +set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/marvin5300/GPX2-TDC") +set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") +set(CPACK_PACKAGE_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") +set(CPACK_PACKAGE_VERSION_MINOR "${PROJECT_VERSION_MINOR}") +set(CPACK_PACKAGE_VERSION_PATCH "${PROJECT_VERSION_PATCH}") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Library for GPX2 TDC control") +set(CPACK_DEBIAN_PACKAGE_DESCRIPTION " It makes connecting to TDC board possible. + It is licensed under the GNU Lesser General Public License version 3 (LGPL v3).") +set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Marvin Peter ") +set(CPACK_PACKAGE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../packages/") +set(CPACK_STRIP_FILES "${CMAKE_CURRENT_BINARY_DIR}/../lib/${GPX2_PACKAGE_NAME}") +set(CPACK_PACKAGE_NAME "${GPX2_PACKAGE_NAME}") +set(CPACK_SOURCE_PACKAGE_FILE_NAME "${GPX2_PACKAGE_NAME}") +set(CPACK_SYSTEM_NAME "Linux-armv7l") +set(CPACK_TOPLEVEL_TAG "Linux-armv7l") +set(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS ON) + +include(CPack) \ No newline at end of file diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/README.md b/source/gpx2-raspi-pigpiod-lib-deprecated/README.md new file mode 100644 index 0000000..b7b04e9 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/README.md @@ -0,0 +1,2 @@ +This library is deprecated, it uses pigpiod to communicate via spi. +It is recommended to use the new spi library with gpx2 device implemented inside using spidev c api. diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/cmake/version.cmake b/source/gpx2-raspi-pigpiod-lib-deprecated/cmake/version.cmake new file mode 100644 index 0000000..9086f0f --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/cmake/version.cmake @@ -0,0 +1,3 @@ +set(PROJECT_VERSION_MAJOR 1) +set(PROJECT_VERSION_MINOR 0) +set(PROJECT_VERSION_PATCH 0) diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/config/changelog b/source/gpx2-raspi-pigpiod-lib-deprecated/config/changelog new file mode 100644 index 0000000..5cfdbc0 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/config/changelog @@ -0,0 +1,5 @@ +gpx2 (1.0.0) ; urgency=low + + * Initial release. + + -- Marvin Peter Fri, 12 Feb 2021 19:20:00 +0100 diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/config/copyright b/source/gpx2-raspi-pigpiod-lib-deprecated/config/copyright new file mode 100644 index 0000000..ce8c2a7 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/config/copyright @@ -0,0 +1,24 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +#Upstream-Name: gpx2 +#Source: https://github.com/marvin5300/GPX2-TDC + +Files: * +Copyright: 2021 Marvin Peter +License: GPL-3.0+ + +License: GPL-3.0+ + 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 3 of the License, or + (at your option) any later version. + . + This package 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 for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/config/license b/source/gpx2-raspi-pigpiod-lib-deprecated/config/license new file mode 100644 index 0000000..ce8c2a7 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/config/license @@ -0,0 +1,24 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +#Upstream-Name: gpx2 +#Source: https://github.com/marvin5300/GPX2-TDC + +Files: * +Copyright: 2021 Marvin Peter +License: GPL-3.0+ + +License: GPL-3.0+ + 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 3 of the License, or + (at your option) any later version. + . + This package 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 for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/config/triggers b/source/gpx2-raspi-pigpiod-lib-deprecated/config/triggers new file mode 100644 index 0000000..72850ac --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/config/triggers @@ -0,0 +1 @@ +activate-noawait ldconfig \ No newline at end of file diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/config/version.h b/source/gpx2-raspi-pigpiod-lib-deprecated/config/version.h new file mode 100644 index 0000000..0b96992 --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/config/version.h @@ -0,0 +1,10 @@ +#ifndef GPX2_VERSION_H +#define GPX2_VERSION_H + +namespace GPX2_TDC::CMake::Version { +constexpr int major { @PROJECT_VERSION_MAJOR@ }; +constexpr int minor { @PROJECT_VERSION_MINOR@ }; +constexpr int patch { @PROJECT_VERSION_PATCH@ }; +} + +#endif // GPX2_VERSION_H diff --git a/source/gpx2-raspi-pigpiod-lib-deprecated/doxygen/Doxyfile.in b/source/gpx2-raspi-pigpiod-lib-deprecated/doxygen/Doxyfile.in new file mode 100644 index 0000000..9b5897a --- /dev/null +++ b/source/gpx2-raspi-pigpiod-lib-deprecated/doxygen/Doxyfile.in @@ -0,0 +1,2495 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: 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 +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = gpx2 + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 1.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "TDC-GPX2 library to readout gpx2 chip via spi on raspberry pi" + +# 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 = @CMAKE_CURRENT_SOURCE_DIR@/../../documentation/content/figures/jlu-logo.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 = @CMAKE_RUNTIME_OUTPUT_DIRECTORY@/doxygen_doc + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: 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 +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: 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 +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: 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 +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and 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 + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: 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 = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# 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 = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: 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 +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# 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 + +# 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 + +# 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 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: 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 +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: 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 + +# 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 + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = cu=c++ + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: 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 +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: 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 +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: 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 + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: 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 +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +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 +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: 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) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: 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 +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: 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 +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# 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 = YES + +# 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 + +# 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 = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: 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 +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: 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 +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: 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 +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# 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 + +# 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 + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +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 + +# 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 + +# 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 + +# 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 + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: 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 +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: 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 +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: 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 +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: 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 + +# 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 + +# 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 + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +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 +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 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 + +# 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 + +# 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 + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: 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 + +# 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 +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: 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 +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: 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. +# The default value is: 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 +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $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 = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../../README.md @CMAKE_CURRENT_SOURCE_DIR@ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: 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 +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cu \ + *.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 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf + +# 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 + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# 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 + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = */HighFive/* *catch.hpp *json.hpp + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: 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 = @CMAKE_CURRENT_SOURCE_DIR@/../../documentation/content/figures + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +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 + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: 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 + +# 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 + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: 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 +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to 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 +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: 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 +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +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 + +# 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 +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# 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 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# 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 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +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 +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +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. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# 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 + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# 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 + +# 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 + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +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 = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +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 = + +# 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 +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +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 + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +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 = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +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 +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# 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 + +# 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 +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +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. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# 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 + +# 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 + +# 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 + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +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: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# 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 = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +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 +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /