diff options
Diffstat (limited to 'Source/3rdParty/SDL2/src/hidapi')
70 files changed, 0 insertions, 13601 deletions
diff --git a/Source/3rdParty/SDL2/src/hidapi/AUTHORS.txt b/Source/3rdParty/SDL2/src/hidapi/AUTHORS.txt deleted file mode 100644 index 7acafd7..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/AUTHORS.txt +++ /dev/null @@ -1,16 +0,0 @@ - -HIDAPI Authors: - -Alan Ott <alan@signal11.us>: - Original Author and Maintainer - Linux, Windows, and Mac implementations - -Ludovic Rousseau <rousseau@debian.org>: - Formatting for Doxygen documentation - Bug fixes - Correctness fixes - - -For a comprehensive list of contributions, see the commit list at github: - http://github.com/signal11/hidapi/commits/master - diff --git a/Source/3rdParty/SDL2/src/hidapi/HACKING.txt b/Source/3rdParty/SDL2/src/hidapi/HACKING.txt deleted file mode 100644 index 761d4b6..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/HACKING.txt +++ /dev/null @@ -1,15 +0,0 @@ -This file is mostly for the maintainer. - -1. Build hidapi.dll -2. Build hidtest.exe in DEBUG and RELEASE -3. Commit all - -4. Run the Following - export VERSION=0.1.0 - export TAG_NAME=hidapi-$VERSION - git tag $TAG_NAME - git archive --format zip --prefix $TAG_NAME/ $TAG_NAME >../$TAG_NAME.zip -5. Test the zip file. -6. Run the following: - git push origin $TAG_NAME - diff --git a/Source/3rdParty/SDL2/src/hidapi/LICENSE-bsd.txt b/Source/3rdParty/SDL2/src/hidapi/LICENSE-bsd.txt deleted file mode 100644 index 538cdf9..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/LICENSE-bsd.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2010, Alan Ott, Signal 11 Software -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Signal 11 Software nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. diff --git a/Source/3rdParty/SDL2/src/hidapi/LICENSE-gpl3.txt b/Source/3rdParty/SDL2/src/hidapi/LICENSE-gpl3.txt deleted file mode 100644 index 94a9ed0..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/LICENSE-gpl3.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - 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. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 <http://www.gnu.org/licenses/>. - -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: - - <program> Copyright (C) <year> <name of author> - 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 -<http://www.gnu.org/licenses/>. - - 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 -<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/Source/3rdParty/SDL2/src/hidapi/LICENSE-orig.txt b/Source/3rdParty/SDL2/src/hidapi/LICENSE-orig.txt deleted file mode 100644 index e3f3380..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/LICENSE-orig.txt +++ /dev/null @@ -1,9 +0,0 @@ - HIDAPI - Multi-Platform library for - communication with HID devices. - - Copyright 2009, Alan Ott, Signal 11 Software. - All Rights Reserved. - - This software may be used by anyone for any reason so - long as the copyright notice in the source files - remains intact. diff --git a/Source/3rdParty/SDL2/src/hidapi/LICENSE.txt b/Source/3rdParty/SDL2/src/hidapi/LICENSE.txt deleted file mode 100644 index e1676d4..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ -HIDAPI can be used under one of three licenses. - -1. The GNU General Public License, version 3.0, in LICENSE-gpl3.txt -2. A BSD-Style License, in LICENSE-bsd.txt. -3. The more liberal original HIDAPI license. LICENSE-orig.txt - -The license chosen is at the discretion of the user of HIDAPI. For example: -1. An author of GPL software would likely use HIDAPI under the terms of the -GPL. - -2. An author of commercial closed-source software would likely use HIDAPI -under the terms of the BSD-style license or the original HIDAPI license. - diff --git a/Source/3rdParty/SDL2/src/hidapi/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/Makefile.am deleted file mode 100644 index 3382a1f..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/Makefile.am +++ /dev/null @@ -1,85 +0,0 @@ - -ACLOCAL_AMFLAGS = -I m4 - -if OS_FREEBSD -pkgconfigdir=$(prefix)/libdata/pkgconfig -else -pkgconfigdir=$(libdir)/pkgconfig -endif - -if OS_LINUX -pkgconfig_DATA=pc/hidapi-hidraw.pc pc/hidapi-libusb.pc -else -pkgconfig_DATA=pc/hidapi.pc -endif - -SUBDIRS= - -if OS_LINUX -SUBDIRS += linux libusb -endif - -if OS_DARWIN -SUBDIRS += mac -endif - -if OS_IOS -SUBDIRS += ios -endif - -if OS_FREEBSD -SUBDIRS += libusb -endif - -if OS_KFREEBSD -SUBDIRS += libusb -endif - -if OS_WINDOWS -SUBDIRS += windows -endif - -SUBDIRS += hidtest - -if BUILD_TESTGUI -SUBDIRS += testgui -endif - -EXTRA_DIST = udev doxygen - -dist_doc_DATA = \ - README.txt \ - AUTHORS.txt \ - LICENSE-bsd.txt \ - LICENSE-gpl3.txt \ - LICENSE-orig.txt \ - LICENSE.txt - -SCMCLEAN_TARGETS= \ - aclocal.m4 \ - config.guess \ - config.sub \ - configure \ - config.h.in \ - depcomp \ - install-sh \ - ltmain.sh \ - missing \ - mac/Makefile.in \ - testgui/Makefile.in \ - libusb/Makefile.in \ - Makefile.in \ - linux/Makefile.in \ - windows/Makefile.in \ - m4/libtool.m4 \ - m4/lt~obsolete.m4 \ - m4/ltoptions.m4 \ - m4/ltsugar.m4 \ - m4/ltversion.m4 - -SCMCLEAN_DIR_TARGETS = \ - autom4te.cache - -scm-clean: distclean - rm -f $(SCMCLEAN_TARGETS) - rm -Rf $(SCMCLEAN_DIR_TARGETS) diff --git a/Source/3rdParty/SDL2/src/hidapi/README.txt b/Source/3rdParty/SDL2/src/hidapi/README.txt deleted file mode 100644 index f19dae4..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/README.txt +++ /dev/null @@ -1,339 +0,0 @@ - HIDAPI library for Windows, Linux, FreeBSD and Mac OS X - ========================================================= - -About -====== - -HIDAPI is a multi-platform library which allows an application to interface -with USB and Bluetooth HID-Class devices on Windows, Linux, FreeBSD, and Mac -OS X. HIDAPI can be either built as a shared library (.so or .dll) or -can be embedded directly into a target application by adding a single source -file (per platform) and a single header. - -HIDAPI has four back-ends: - * Windows (using hid.dll) - * Linux/hidraw (using the Kernel's hidraw driver) - * Linux/libusb (using libusb-1.0) - * FreeBSD (using libusb-1.0) - * Mac (using IOHidManager) - -On Linux, either the hidraw or the libusb back-end can be used. There are -tradeoffs, and the functionality supported is slightly different. - -Linux/hidraw (linux/hid.c): -This back-end uses the hidraw interface in the Linux kernel. While this -back-end will support both USB and Bluetooth, it has some limitations on -kernels prior to 2.6.39, including the inability to send or receive feature -reports. In addition, it will only communicate with devices which have -hidraw nodes associated with them. Keyboards, mice, and some other devices -which are blacklisted from having hidraw nodes will not work. Fortunately, -for nearly all the uses of hidraw, this is not a problem. - -Linux/FreeBSD/libusb (libusb/hid.c): -This back-end uses libusb-1.0 to communicate directly to a USB device. This -back-end will of course not work with Bluetooth devices. - -HIDAPI also comes with a Test GUI. The Test GUI is cross-platform and uses -Fox Toolkit (http://www.fox-toolkit.org). It will build on every platform -which HIDAPI supports. Since it relies on a 3rd party library, building it -is optional but recommended because it is so useful when debugging hardware. - -What Does the API Look Like? -============================= -The API provides the the most commonly used HID functions including sending -and receiving of input, output, and feature reports. The sample program, -which communicates with a heavily hacked up version of the Microchip USB -Generic HID sample looks like this (with error checking removed for -simplicity): - -#ifdef WIN32 -#include <windows.h> -#endif -#include <stdio.h> -#include <stdlib.h> -#include "hidapi.h" - -#define MAX_STR 255 - -int main(int argc, char* argv[]) -{ - int res; - unsigned char buf[65]; - wchar_t wstr[MAX_STR]; - hid_device *handle; - int i; - - // Initialize the hidapi library - res = hid_init(); - - // Open the device using the VID, PID, - // and optionally the Serial number. - handle = hid_open(0x4d8, 0x3f, NULL); - - // Read the Manufacturer String - res = hid_get_manufacturer_string(handle, wstr, MAX_STR); - wprintf(L"Manufacturer String: %s\n", wstr); - - // Read the Product String - res = hid_get_product_string(handle, wstr, MAX_STR); - wprintf(L"Product String: %s\n", wstr); - - // Read the Serial Number String - res = hid_get_serial_number_string(handle, wstr, MAX_STR); - wprintf(L"Serial Number String: (%d) %s\n", wstr[0], wstr); - - // Read Indexed String 1 - res = hid_get_indexed_string(handle, 1, wstr, MAX_STR); - wprintf(L"Indexed String 1: %s\n", wstr); - - // Toggle LED (cmd 0x80). The first byte is the report number (0x0). - buf[0] = 0x0; - buf[1] = 0x80; - res = hid_write(handle, buf, 65); - - // Request state (cmd 0x81). The first byte is the report number (0x0). - buf[0] = 0x0; - buf[1] = 0x81; - res = hid_write(handle, buf, 65); - - // Read requested state - res = hid_read(handle, buf, 65); - - // Print out the returned buffer. - for (i = 0; i < 4; i++) - printf("buf[%d]: %d\n", i, buf[i]); - - // Finalize the hidapi library - res = hid_exit(); - - return 0; -} - -If you have your own simple test programs which communicate with standard -hardware development boards (such as those from Microchip, TI, Atmel, -FreeScale and others), please consider sending me something like the above -for inclusion into the HIDAPI source. This will help others who have the -same hardware as you do. - -License -======== -HIDAPI may be used by one of three licenses as outlined in LICENSE.txt. - -Download -========= -HIDAPI can be downloaded from github - git clone git://github.com/signal11/hidapi.git - -Build Instructions -=================== - -This section is long. Don't be put off by this. It's not long because it's -complicated to build HIDAPI; it's quite the opposite. This section is long -because of the flexibility of HIDAPI and the large number of ways in which -it can be built and used. You will likely pick a single build method. - -HIDAPI can be built in several different ways. If you elect to build a -shared library, you will need to build it from the HIDAPI source -distribution. If you choose instead to embed HIDAPI directly into your -application, you can skip the building and look at the provided platform -Makefiles for guidance. These platform Makefiles are located in linux/ -libusb/ mac/ and windows/ and are called Makefile-manual. In addition, -Visual Studio projects are provided. Even if you're going to embed HIDAPI -into your project, it is still beneficial to build the example programs. - - -Prerequisites: ---------------- - - Linux: - ------- - On Linux, you will need to install development packages for libudev, - libusb and optionally Fox-toolkit (for the test GUI). On - Debian/Ubuntu systems these can be installed by running: - sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev - - If you downloaded the source directly from the git repository (using - git clone), you'll need Autotools: - sudo apt-get install autotools-dev autoconf automake libtool - - FreeBSD: - --------- - On FreeBSD you will need to install GNU make, libiconv, and - optionally Fox-Toolkit (for the test GUI). This is done by running - the following: - pkg_add -r gmake libiconv fox16 - - If you downloaded the source directly from the git repository (using - git clone), you'll need Autotools: - pkg_add -r autotools - - Mac: - ----- - On Mac, you will need to install Fox-Toolkit if you wish to build - the Test GUI. There are two ways to do this, and each has a slight - complication. Which method you use depends on your use case. - - If you wish to build the Test GUI just for your own testing on your - own computer, then the easiest method is to install Fox-Toolkit - using ports: - sudo port install fox - - If you wish to build the TestGUI app bundle to redistribute to - others, you will need to install Fox-toolkit from source. This is - because the version of fox that gets installed using ports uses the - ports X11 libraries which are not compatible with the Apple X11 - libraries. If you install Fox with ports and then try to distribute - your built app bundle, it will simply fail to run on other systems. - To install Fox-Toolkit manually, download the source package from - http://www.fox-toolkit.org, extract it, and run the following from - within the extracted source: - ./configure && make && make install - - Windows: - --------- - On Windows, if you want to build the test GUI, you will need to get - the hidapi-externals.zip package from the download site. This - contains pre-built binaries for Fox-toolkit. Extract - hidapi-externals.zip just outside of hidapi, so that - hidapi-externals and hidapi are on the same level, as shown: - - Parent_Folder - | - +hidapi - +hidapi-externals - - Again, this step is not required if you do not wish to build the - test GUI. - - -Building HIDAPI into a shared library on Unix Platforms: ---------------------------------------------------------- - -On Unix-like systems such as Linux, FreeBSD, Mac, and even Windows, using -Mingw or Cygwin, the easiest way to build a standard system-installed shared -library is to use the GNU Autotools build system. If you checked out the -source from the git repository, run the following: - - ./bootstrap - ./configure - make - make install <----- as root, or using sudo - -If you downloaded a source package (ie: if you did not run git clone), you -can skip the ./bootstrap step. - -./configure can take several arguments which control the build. The two most -likely to be used are: - --enable-testgui - Enable build of the Test GUI. This requires Fox toolkit to - be installed. Instructions for installing Fox-Toolkit on - each platform are in the Prerequisites section above. - - --prefix=/usr - Specify where you want the output headers and libraries to - be installed. The example above will put the headers in - /usr/include and the binaries in /usr/lib. The default is to - install into /usr/local which is fine on most systems. - -Building the manual way on Unix platforms: -------------------------------------------- - -Manual Makefiles are provided mostly to give the user and idea what it takes -to build a program which embeds HIDAPI directly inside of it. These should -really be used as examples only. If you want to build a system-wide shared -library, use the Autotools method described above. - - To build HIDAPI using the manual makefiles, change to the directory - of your platform and run make. For example, on Linux run: - cd linux/ - make -f Makefile-manual - - To build the Test GUI using the manual makefiles: - cd testgui/ - make -f Makefile-manual - -Building on Windows: ---------------------- - -To build the HIDAPI DLL on Windows using Visual Studio, build the .sln file -in the windows/ directory. - -To build the Test GUI on windows using Visual Studio, build the .sln file in -the testgui/ directory. - -To build HIDAPI using MinGW or Cygwin using Autotools, use the instructions -in the section titled "Building HIDAPI into a shared library on Unix -Platforms" above. Note that building the Test GUI with MinGW or Cygwin will -require the Windows procedure in the Prerequisites section above (ie: -hidapi-externals.zip). - -To build HIDAPI using MinGW using the Manual Makefiles, see the section -"Building the manual way on Unix platforms" above. - -HIDAPI can also be built using the Windows DDK (now also called the Windows -Driver Kit or WDK). This method was originally required for the HIDAPI build -but not anymore. However, some users still prefer this method. It is not as -well supported anymore but should still work. Patches are welcome if it does -not. To build using the DDK: - - 1. Install the Windows Driver Kit (WDK) from Microsoft. - 2. From the Start menu, in the Windows Driver Kits folder, select Build - Environments, then your operating system, then the x86 Free Build - Environment (or one that is appropriate for your system). - 3. From the console, change directory to the windows/ddk_build/ directory, - which is part of the HIDAPI distribution. - 4. Type build. - 5. You can find the output files (DLL and LIB) in a subdirectory created - by the build system which is appropriate for your environment. On - Windows XP, this directory is objfre_wxp_x86/i386. - -Cross Compiling -================ - -This section talks about cross compiling HIDAPI for Linux using autotools. -This is useful for using HIDAPI on embedded Linux targets. These -instructions assume the most raw kind of embedded Linux build, where all -prerequisites will need to be built first. This process will of course vary -based on your embedded Linux build system if you are using one, such as -OpenEmbedded or Buildroot. - -For the purpose of this section, it will be assumed that the following -environment variables are exported. - - $ export STAGING=$HOME/out - $ export HOST=arm-linux - -STAGING and HOST can be modified to suit your setup. - -Prerequisites --------------- - -Note that the build of libudev is the very basic configuration. - -Build Libusb. From the libusb source directory, run: - ./configure --host=$HOST --prefix=$STAGING - make - make install - -Build libudev. From the libudev source directory, run: - ./configure --disable-gudev --disable-introspection --disable-hwdb \ - --host=$HOST --prefix=$STAGING - make - make install - -Building HIDAPI ----------------- - -Build HIDAPI: - - PKG_CONFIG_DIR= \ - PKG_CONFIG_LIBDIR=$STAGING/lib/pkgconfig:$STAGING/share/pkgconfig \ - PKG_CONFIG_SYSROOT_DIR=$STAGING \ - ./configure --host=$HOST --prefix=$STAGING - - -Signal 11 Software - 2010-04-11 - 2010-07-28 - 2011-09-10 - 2012-05-01 - 2012-07-03 diff --git a/Source/3rdParty/SDL2/src/hidapi/android/hid.cpp b/Source/3rdParty/SDL2/src/hidapi/android/hid.cpp deleted file mode 100644 index 7b8d41c..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/android/hid.cpp +++ /dev/null @@ -1,1159 +0,0 @@ -//=================== Copyright Valve Corporation, All rights reserved. ======= -// -// Purpose: A wrapper implementing "HID" API for Android -// -// This layer glues the hidapi API to Android's USB and BLE stack. -// -//============================================================================= - -#include <jni.h> -#include <android/log.h> -#include <pthread.h> -#include <errno.h> // For ETIMEDOUT and ECONNRESET -#include <stdlib.h> // For malloc() and free() -#include <string.h> // For memcpy() - -#define TAG "hidapi" - -// Have error log always available -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) - -#ifdef DEBUG -#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__) -#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) -#else -#define LOGV(...) -#define LOGD(...) -#endif - -#define SDL_JAVA_PREFIX org_libsdl_app -#define CONCAT1(prefix, class, function) CONCAT2(prefix, class, function) -#define CONCAT2(prefix, class, function) Java_ ## prefix ## _ ## class ## _ ## function -#define HID_DEVICE_MANAGER_JAVA_INTERFACE(function) CONCAT1(SDL_JAVA_PREFIX, HIDDeviceManager, function) - -#include "../hidapi/hidapi.h" - -typedef uint32_t uint32; -typedef uint64_t uint64; - - -struct hid_device_ -{ - int m_nId; - int m_nDeviceRefCount; -}; - -static JavaVM *g_JVM; -static pthread_key_t g_ThreadKey; - -template<class T> -class hid_device_ref -{ -public: - hid_device_ref( T *pObject = nullptr ) : m_pObject( nullptr ) - { - SetObject( pObject ); - } - - hid_device_ref( const hid_device_ref &rhs ) : m_pObject( nullptr ) - { - SetObject( rhs.GetObject() ); - } - - ~hid_device_ref() - { - SetObject( nullptr ); - } - - void SetObject( T *pObject ) - { - if ( m_pObject && m_pObject->DecrementRefCount() == 0 ) - { - delete m_pObject; - } - - m_pObject = pObject; - - if ( m_pObject ) - { - m_pObject->IncrementRefCount(); - } - } - - hid_device_ref &operator =( T *pObject ) - { - SetObject( pObject ); - return *this; - } - - hid_device_ref &operator =( const hid_device_ref &rhs ) - { - SetObject( rhs.GetObject() ); - return *this; - } - - T *GetObject() const - { - return m_pObject; - } - - T* operator->() const - { - return m_pObject; - } - - operator bool() const - { - return ( m_pObject != nullptr ); - } - -private: - T *m_pObject; -}; - -class hid_mutex_guard -{ -public: - hid_mutex_guard( pthread_mutex_t *pMutex ) : m_pMutex( pMutex ) - { - pthread_mutex_lock( m_pMutex ); - } - ~hid_mutex_guard() - { - pthread_mutex_unlock( m_pMutex ); - } - -private: - pthread_mutex_t *m_pMutex; -}; - -class hid_buffer -{ -public: - hid_buffer() : m_pData( nullptr ), m_nSize( 0 ), m_nAllocated( 0 ) - { - } - - hid_buffer( const uint8_t *pData, size_t nSize ) : m_pData( nullptr ), m_nSize( 0 ), m_nAllocated( 0 ) - { - assign( pData, nSize ); - } - - ~hid_buffer() - { - delete[] m_pData; - } - - void assign( const uint8_t *pData, size_t nSize ) - { - if ( nSize > m_nAllocated ) - { - delete[] m_pData; - m_pData = new uint8_t[ nSize ]; - m_nAllocated = nSize; - } - - m_nSize = nSize; - memcpy( m_pData, pData, nSize ); - } - - void clear() - { - m_nSize = 0; - } - - size_t size() const - { - return m_nSize; - } - - const uint8_t *data() const - { - return m_pData; - } - -private: - uint8_t *m_pData; - size_t m_nSize; - size_t m_nAllocated; -}; - -class hid_buffer_pool -{ -public: - hid_buffer_pool() : m_nSize( 0 ), m_pHead( nullptr ), m_pTail( nullptr ), m_pFree( nullptr ) - { - } - - ~hid_buffer_pool() - { - clear(); - - while ( m_pFree ) - { - hid_buffer_entry *pEntry = m_pFree; - m_pFree = m_pFree->m_pNext; - delete pEntry; - } - } - - size_t size() const { return m_nSize; } - - const hid_buffer &front() const { return m_pHead->m_buffer; } - - void pop_front() - { - hid_buffer_entry *pEntry = m_pHead; - if ( pEntry ) - { - m_pHead = pEntry->m_pNext; - if ( !m_pHead ) - { - m_pTail = nullptr; - } - pEntry->m_pNext = m_pFree; - m_pFree = pEntry; - --m_nSize; - } - } - - void emplace_back( const uint8_t *pData, size_t nSize ) - { - hid_buffer_entry *pEntry; - - if ( m_pFree ) - { - pEntry = m_pFree; - m_pFree = m_pFree->m_pNext; - } - else - { - pEntry = new hid_buffer_entry; - } - pEntry->m_pNext = nullptr; - - if ( m_pTail ) - { - m_pTail->m_pNext = pEntry; - } - else - { - m_pHead = pEntry; - } - m_pTail = pEntry; - - pEntry->m_buffer.assign( pData, nSize ); - ++m_nSize; - } - - void clear() - { - while ( size() > 0 ) - { - pop_front(); - } - } - -private: - struct hid_buffer_entry - { - hid_buffer m_buffer; - hid_buffer_entry *m_pNext; - }; - - size_t m_nSize; - hid_buffer_entry *m_pHead; - hid_buffer_entry *m_pTail; - hid_buffer_entry *m_pFree; -}; - -static jbyteArray NewByteArray( JNIEnv* env, const uint8_t *pData, size_t nDataLen ) -{ - jbyteArray array = env->NewByteArray( nDataLen ); - jbyte *pBuf = env->GetByteArrayElements( array, NULL ); - memcpy( pBuf, pData, nDataLen ); - env->ReleaseByteArrayElements( array, pBuf, 0 ); - - return array; -} - -static char *CreateStringFromJString( JNIEnv *env, const jstring &sString ) -{ - size_t nLength = env->GetStringUTFLength( sString ); - const char *pjChars = env->GetStringUTFChars( sString, NULL ); - char *psString = (char*)malloc( nLength + 1 ); - memcpy( psString, pjChars, nLength ); - psString[ nLength ] = '\0'; - env->ReleaseStringUTFChars( sString, pjChars ); - return psString; -} - -static wchar_t *CreateWStringFromJString( JNIEnv *env, const jstring &sString ) -{ - size_t nLength = env->GetStringLength( sString ); - const jchar *pjChars = env->GetStringChars( sString, NULL ); - wchar_t *pwString = (wchar_t*)malloc( ( nLength + 1 ) * sizeof( wchar_t ) ); - wchar_t *pwChars = pwString; - for ( size_t iIndex = 0; iIndex < nLength; ++iIndex ) - { - pwChars[ iIndex ] = pjChars[ iIndex ]; - } - pwString[ nLength ] = '\0'; - env->ReleaseStringChars( sString, pjChars ); - return pwString; -} - -static wchar_t *CreateWStringFromWString( const wchar_t *pwSrc ) -{ - size_t nLength = wcslen( pwSrc ); - wchar_t *pwString = (wchar_t*)malloc( ( nLength + 1 ) * sizeof( wchar_t ) ); - memcpy( pwString, pwSrc, nLength * sizeof( wchar_t ) ); - pwString[ nLength ] = '\0'; - return pwString; -} - -static hid_device_info *CopyHIDDeviceInfo( const hid_device_info *pInfo ) -{ - hid_device_info *pCopy = new hid_device_info; - *pCopy = *pInfo; - pCopy->path = strdup( pInfo->path ); - pCopy->product_string = CreateWStringFromWString( pInfo->product_string ); - pCopy->manufacturer_string = CreateWStringFromWString( pInfo->manufacturer_string ); - pCopy->serial_number = CreateWStringFromWString( pInfo->serial_number ); - return pCopy; -} - -static void FreeHIDDeviceInfo( hid_device_info *pInfo ) -{ - free( pInfo->path ); - free( pInfo->serial_number ); - free( pInfo->manufacturer_string ); - free( pInfo->product_string ); - delete pInfo; -} - -static jclass g_HIDDeviceManagerCallbackClass; -static jobject g_HIDDeviceManagerCallbackHandler; -static jmethodID g_midHIDDeviceManagerOpen; -static jmethodID g_midHIDDeviceManagerSendOutputReport; -static jmethodID g_midHIDDeviceManagerSendFeatureReport; -static jmethodID g_midHIDDeviceManagerGetFeatureReport; -static jmethodID g_midHIDDeviceManagerClose; - -static uint64_t get_timespec_ms( const struct timespec &ts ) -{ - return (uint64_t)ts.tv_sec * 1000 + ts.tv_nsec / 1000000; -} - -class CHIDDevice -{ -public: - CHIDDevice( int nDeviceID, hid_device_info *pInfo ) - { - m_nId = nDeviceID; - m_pInfo = pInfo; - - // The Bluetooth Steam Controller needs special handling - const int VALVE_USB_VID = 0x28DE; - const int D0G_BLE2_PID = 0x1106; - if ( pInfo->vendor_id == VALVE_USB_VID && pInfo->product_id == D0G_BLE2_PID ) - { - m_bIsBLESteamController = true; - } - } - - ~CHIDDevice() - { - FreeHIDDeviceInfo( m_pInfo ); - - // Note that we don't delete m_pDevice, as the app may still have a reference to it - } - - int IncrementRefCount() - { - int nValue; - pthread_mutex_lock( &m_refCountLock ); - nValue = ++m_nRefCount; - pthread_mutex_unlock( &m_refCountLock ); - return nValue; - } - - int DecrementRefCount() - { - int nValue; - pthread_mutex_lock( &m_refCountLock ); - nValue = --m_nRefCount; - pthread_mutex_unlock( &m_refCountLock ); - return nValue; - } - - int GetId() - { - return m_nId; - } - - const hid_device_info *GetDeviceInfo() - { - return m_pInfo; - } - - hid_device *GetDevice() - { - return m_pDevice; - } - - void ExceptionCheck( JNIEnv *env, const char *pszMethodName ) - { - if ( env->ExceptionCheck() ) - { - // Get our exception - jthrowable jExcept = env->ExceptionOccurred(); - - // Clear the exception so we can call JNI again - env->ExceptionClear(); - - // Get our exception message - jclass jExceptClass = env->GetObjectClass( jExcept ); - jmethodID jMessageMethod = env->GetMethodID( jExceptClass, "getMessage", "()Ljava/lang/String;" ); - jstring jMessage = (jstring)( env->CallObjectMethod( jExcept, jMessageMethod ) ); - const char *pszMessage = env->GetStringUTFChars( jMessage, NULL ); - - // ...and log it. - LOGE( "CHIDDevice::%s threw an exception: %s", pszMethodName, pszMessage ); - - // Cleanup - env->ReleaseStringUTFChars( jMessage, pszMessage ); - env->DeleteLocalRef( jMessage ); - env->DeleteLocalRef( jExceptClass ); - env->DeleteLocalRef( jExcept ); - } - } - - bool BOpen() - { - // Make sure thread is attached to JVM/env - JNIEnv *env; - g_JVM->AttachCurrentThread( &env, NULL ); - pthread_setspecific( g_ThreadKey, (void*)env ); - - m_bIsWaitingForOpen = false; - m_bOpenResult = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerOpen, m_nId ); - ExceptionCheck( env, "BOpen" ); - - if ( m_bIsWaitingForOpen ) - { - hid_mutex_guard cvl( &m_cvLock ); - - const int OPEN_TIMEOUT_SECONDS = 60; - struct timespec ts, endtime; - clock_gettime( CLOCK_REALTIME, &ts ); - endtime = ts; - endtime.tv_sec += OPEN_TIMEOUT_SECONDS; - do - { - if ( pthread_cond_timedwait( &m_cv, &m_cvLock, &endtime ) != 0 ) - { - break; - } - } - while ( m_bIsWaitingForOpen && get_timespec_ms( ts ) < get_timespec_ms( endtime ) ); - } - - if ( !m_bOpenResult ) - { - if ( m_bIsWaitingForOpen ) - { - LOGV( "Device open failed - timed out waiting for device permission" ); - } - else - { - LOGV( "Device open failed" ); - } - return false; - } - - m_pDevice = new hid_device; - m_pDevice->m_nId = m_nId; - m_pDevice->m_nDeviceRefCount = 1; - LOGD("Creating device %d (%p), refCount = 1\n", m_pDevice->m_nId, m_pDevice); - return true; - } - - void SetOpenPending() - { - m_bIsWaitingForOpen = true; - } - - void SetOpenResult( bool bResult ) - { - if ( m_bIsWaitingForOpen ) - { - m_bOpenResult = bResult; - m_bIsWaitingForOpen = false; - pthread_cond_signal( &m_cv ); - } - } - - void ProcessInput( const uint8_t *pBuf, size_t nBufSize ) - { - hid_mutex_guard l( &m_dataLock ); - - size_t MAX_REPORT_QUEUE_SIZE = 16; - if ( m_vecData.size() >= MAX_REPORT_QUEUE_SIZE ) - { - m_vecData.pop_front(); - } - m_vecData.emplace_back( pBuf, nBufSize ); - } - - int GetInput( unsigned char *data, size_t length ) - { - hid_mutex_guard l( &m_dataLock ); - - if ( m_vecData.size() == 0 ) - { -// LOGV( "hid_read_timeout no data available" ); - return 0; - } - - const hid_buffer &buffer = m_vecData.front(); - size_t nDataLen = buffer.size() > length ? length : buffer.size(); - if ( m_bIsBLESteamController ) - { - data[0] = 0x03; - memcpy( data + 1, buffer.data(), nDataLen ); - ++nDataLen; - } - else - { - memcpy( data, buffer.data(), nDataLen ); - } - m_vecData.pop_front(); - -// LOGV("Read %u bytes", nDataLen); -// LOGV("%02x %02x %02x %02x %02x %02x %02x %02x ....", -// data[0], data[1], data[2], data[3], -// data[4], data[5], data[6], data[7]); - - return nDataLen; - } - - int SendOutputReport( const unsigned char *pData, size_t nDataLen ) - { - // Make sure thread is attached to JVM/env - JNIEnv *env; - g_JVM->AttachCurrentThread( &env, NULL ); - pthread_setspecific( g_ThreadKey, (void*)env ); - - jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); - int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendOutputReport, m_nId, pBuf ); - ExceptionCheck( env, "SendOutputReport" ); - - env->DeleteLocalRef( pBuf ); - return nRet; - } - - int SendFeatureReport( const unsigned char *pData, size_t nDataLen ) - { - // Make sure thread is attached to JVM/env - JNIEnv *env; - g_JVM->AttachCurrentThread( &env, NULL ); - pthread_setspecific( g_ThreadKey, (void*)env ); - - jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); - int nRet = env->CallIntMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerSendFeatureReport, m_nId, pBuf ); - ExceptionCheck( env, "SendFeatureReport" ); - env->DeleteLocalRef( pBuf ); - return nRet; - } - - void ProcessFeatureReport( const uint8_t *pBuf, size_t nBufSize ) - { - hid_mutex_guard cvl( &m_cvLock ); - if ( m_bIsWaitingForFeatureReport ) - { - m_featureReport.assign( pBuf, nBufSize ); - - m_bIsWaitingForFeatureReport = false; - m_nFeatureReportError = 0; - pthread_cond_signal( &m_cv ); - } - } - - int GetFeatureReport( unsigned char *pData, size_t nDataLen ) - { - // Make sure thread is attached to JVM/env - JNIEnv *env; - g_JVM->AttachCurrentThread( &env, NULL ); - pthread_setspecific( g_ThreadKey, (void*)env ); - - { - hid_mutex_guard cvl( &m_cvLock ); - if ( m_bIsWaitingForFeatureReport ) - { - LOGV( "Get feature report already ongoing... bail" ); - return -1; // Read already ongoing, we currently do not serialize, TODO - } - m_bIsWaitingForFeatureReport = true; - } - - jbyteArray pBuf = NewByteArray( env, pData, nDataLen ); - int nRet = env->CallBooleanMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerGetFeatureReport, m_nId, pBuf ) ? 0 : -1; - ExceptionCheck( env, "GetFeatureReport" ); - env->DeleteLocalRef( pBuf ); - if ( nRet < 0 ) - { - LOGV( "GetFeatureReport failed" ); - m_bIsWaitingForFeatureReport = false; - return -1; - } - - { - hid_mutex_guard cvl( &m_cvLock ); - if ( m_bIsWaitingForFeatureReport ) - { - LOGV("=== Going to sleep" ); - // Wait in CV until we are no longer waiting for a feature report. - const int FEATURE_REPORT_TIMEOUT_SECONDS = 2; - struct timespec ts, endtime; - clock_gettime( CLOCK_REALTIME, &ts ); - endtime = ts; - endtime.tv_sec += FEATURE_REPORT_TIMEOUT_SECONDS; - do - { - if ( pthread_cond_timedwait( &m_cv, &m_cvLock, &endtime ) != 0 ) - { - break; - } - } - while ( m_bIsWaitingForFeatureReport && get_timespec_ms( ts ) < get_timespec_ms( endtime ) ); - - // We are back - if ( m_bIsWaitingForFeatureReport ) - { - m_nFeatureReportError = -ETIMEDOUT; - m_bIsWaitingForFeatureReport = false; - } - LOGV( "=== Got feature report err=%d", m_nFeatureReportError ); - if ( m_nFeatureReportError != 0 ) - { - return m_nFeatureReportError; - } - } - - size_t uBytesToCopy = m_featureReport.size() > nDataLen ? nDataLen : m_featureReport.size(); - memcpy( pData, m_featureReport.data(), uBytesToCopy ); - m_featureReport.clear(); - LOGV( "=== Got %u bytes", uBytesToCopy ); - - return uBytesToCopy; - } - } - - void Close( bool bDeleteDevice ) - { - // Make sure thread is attached to JVM/env - JNIEnv *env; - g_JVM->AttachCurrentThread( &env, NULL ); - pthread_setspecific( g_ThreadKey, (void*)env ); - - env->CallVoidMethod( g_HIDDeviceManagerCallbackHandler, g_midHIDDeviceManagerClose, m_nId ); - ExceptionCheck( env, "Close" ); - - hid_mutex_guard dataLock( &m_dataLock ); - m_vecData.clear(); - - // Clean and release pending feature report reads - hid_mutex_guard cvLock( &m_cvLock ); - m_featureReport.clear(); - m_bIsWaitingForFeatureReport = false; - m_nFeatureReportError = -ECONNRESET; - pthread_cond_broadcast( &m_cv ); - - if ( bDeleteDevice ) - { - delete m_pDevice; - m_pDevice = nullptr; - } - } - -private: - pthread_mutex_t m_refCountLock = PTHREAD_MUTEX_INITIALIZER; - int m_nRefCount = 0; - int m_nId = 0; - hid_device_info *m_pInfo = nullptr; - hid_device *m_pDevice = nullptr; - bool m_bIsBLESteamController = false; - - pthread_mutex_t m_dataLock = PTHREAD_MUTEX_INITIALIZER; // This lock has to be held to access m_vecData - hid_buffer_pool m_vecData; - - // For handling get_feature_report - pthread_mutex_t m_cvLock = PTHREAD_MUTEX_INITIALIZER; // This lock has to be held to access any variables below - pthread_cond_t m_cv = PTHREAD_COND_INITIALIZER; - bool m_bIsWaitingForOpen = false; - bool m_bOpenResult = false; - bool m_bIsWaitingForFeatureReport = false; - int m_nFeatureReportError = 0; - hid_buffer m_featureReport; - -public: - hid_device_ref<CHIDDevice> next; -}; - -class CHIDDevice; -static pthread_mutex_t g_DevicesMutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t g_DevicesRefCountMutex = PTHREAD_MUTEX_INITIALIZER; -static hid_device_ref<CHIDDevice> g_Devices; - -static hid_device_ref<CHIDDevice> FindDevice( int nDeviceId ) -{ - hid_device_ref<CHIDDevice> pDevice; - - hid_mutex_guard l( &g_DevicesMutex ); - for ( pDevice = g_Devices; pDevice; pDevice = pDevice->next ) - { - if ( pDevice->GetId() == nDeviceId ) - { - break; - } - } - return pDevice; -} - -static void ThreadDestroyed(void* value) -{ - /* The thread is being destroyed, detach it from the Java VM and set the g_ThreadKey value to NULL as required */ - JNIEnv *env = (JNIEnv*) value; - if (env != NULL) { - g_JVM->DetachCurrentThread(); - pthread_setspecific(g_ThreadKey, NULL); - } -} - - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceRegisterCallback)(JNIEnv *env, jobject thiz); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceReleaseCallback)(JNIEnv *env, jobject thiz); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceConnected)(JNIEnv *env, jobject thiz, int nDeviceID, jstring sIdentifier, int nVendorId, int nProductId, jstring sSerialNumber, int nReleaseNumber, jstring sManufacturer, jstring sProduct, int nInterface ); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceOpenPending)(JNIEnv *env, jobject thiz, int nDeviceID); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceOpenResult)(JNIEnv *env, jobject thiz, int nDeviceID, bool bOpened); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceDisconnected)(JNIEnv *env, jobject thiz, int nDeviceID); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceInputReport)(JNIEnv *env, jobject thiz, int nDeviceID, jbyteArray value); - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceFeatureReport)(JNIEnv *env, jobject thiz, int nDeviceID, jbyteArray value); - - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceRegisterCallback)(JNIEnv *env, jobject thiz ) -{ - LOGV( "HIDDeviceRegisterCallback()"); - - env->GetJavaVM( &g_JVM ); - - /* - * Create mThreadKey so we can keep track of the JNIEnv assigned to each thread - * Refer to http://developer.android.com/guide/practices/design/jni.html for the rationale behind this - */ - if (pthread_key_create(&g_ThreadKey, ThreadDestroyed) != 0) { - __android_log_print(ANDROID_LOG_ERROR, TAG, "Error initializing pthread key"); - } - - if ( g_HIDDeviceManagerCallbackHandler != NULL ) - { - env->DeleteGlobalRef( g_HIDDeviceManagerCallbackClass ); - g_HIDDeviceManagerCallbackClass = NULL; - env->DeleteGlobalRef( g_HIDDeviceManagerCallbackHandler ); - g_HIDDeviceManagerCallbackHandler = NULL; - } - - g_HIDDeviceManagerCallbackHandler = env->NewGlobalRef( thiz ); - jclass objClass = env->GetObjectClass( thiz ); - if ( objClass ) - { - g_HIDDeviceManagerCallbackClass = reinterpret_cast< jclass >( env->NewGlobalRef( objClass ) ); - g_midHIDDeviceManagerOpen = env->GetMethodID( g_HIDDeviceManagerCallbackClass, "openDevice", "(I)Z" ); - if ( !g_midHIDDeviceManagerOpen ) - { - __android_log_print(ANDROID_LOG_ERROR, TAG, "HIDDeviceRegisterCallback: callback class missing openDevice" ); - } - g_midHIDDeviceManagerSendOutputReport = env->GetMethodID( g_HIDDeviceManagerCallbackClass, "sendOutputReport", "(I[B)I" ); - if ( !g_midHIDDeviceManagerSendOutputReport ) - { - __android_log_print(ANDROID_LOG_ERROR, TAG, "HIDDeviceRegisterCallback: callback class missing sendOutputReport" ); - } - g_midHIDDeviceManagerSendFeatureReport = env->GetMethodID( g_HIDDeviceManagerCallbackClass, "sendFeatureReport", "(I[B)I" ); - if ( !g_midHIDDeviceManagerSendFeatureReport ) - { - __android_log_print(ANDROID_LOG_ERROR, TAG, "HIDDeviceRegisterCallback: callback class missing sendFeatureReport" ); - } - g_midHIDDeviceManagerGetFeatureReport = env->GetMethodID( g_HIDDeviceManagerCallbackClass, "getFeatureReport", "(I[B)Z" ); - if ( !g_midHIDDeviceManagerGetFeatureReport ) - { - __android_log_print(ANDROID_LOG_ERROR, TAG, "HIDDeviceRegisterCallback: callback class missing getFeatureReport" ); - } - g_midHIDDeviceManagerClose = env->GetMethodID( g_HIDDeviceManagerCallbackClass, "closeDevice", "(I)V" ); - if ( !g_midHIDDeviceManagerClose ) - { - __android_log_print(ANDROID_LOG_ERROR, TAG, "HIDDeviceRegisterCallback: callback class missing closeDevice" ); - } - env->DeleteLocalRef( objClass ); - } -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceReleaseCallback)(JNIEnv *env, jobject thiz) -{ - LOGV("HIDDeviceReleaseCallback"); - if ( env->IsSameObject( thiz, g_HIDDeviceManagerCallbackHandler ) ) - { - env->DeleteGlobalRef( g_HIDDeviceManagerCallbackClass ); - g_HIDDeviceManagerCallbackClass = NULL; - env->DeleteGlobalRef( g_HIDDeviceManagerCallbackHandler ); - g_HIDDeviceManagerCallbackHandler = NULL; - } -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceConnected)(JNIEnv *env, jobject thiz, int nDeviceID, jstring sIdentifier, int nVendorId, int nProductId, jstring sSerialNumber, int nReleaseNumber, jstring sManufacturer, jstring sProduct, int nInterface ) -{ - LOGV( "HIDDeviceConnected() id=%d VID/PID = %.4x/%.4x, interface %d\n", nDeviceID, nVendorId, nProductId, nInterface ); - - hid_device_info *pInfo = new hid_device_info; - memset( pInfo, 0, sizeof( *pInfo ) ); - pInfo->path = CreateStringFromJString( env, sIdentifier ); - pInfo->vendor_id = nVendorId; - pInfo->product_id = nProductId; - pInfo->serial_number = CreateWStringFromJString( env, sSerialNumber ); - pInfo->release_number = nReleaseNumber; - pInfo->manufacturer_string = CreateWStringFromJString( env, sManufacturer ); - pInfo->product_string = CreateWStringFromJString( env, sProduct ); - pInfo->interface_number = nInterface; - - hid_device_ref<CHIDDevice> pDevice( new CHIDDevice( nDeviceID, pInfo ) ); - - hid_mutex_guard l( &g_DevicesMutex ); - hid_device_ref<CHIDDevice> pLast, pCurr; - for ( pCurr = g_Devices; pCurr; pLast = pCurr, pCurr = pCurr->next ) - { - continue; - } - if ( pLast ) - { - pLast->next = pDevice; - } - else - { - g_Devices = pDevice; - } -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceOpenPending)(JNIEnv *env, jobject thiz, int nDeviceID) -{ - LOGV( "HIDDeviceOpenPending() id=%d\n", nDeviceID ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( nDeviceID ); - if ( pDevice ) - { - pDevice->SetOpenPending(); - } -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceOpenResult)(JNIEnv *env, jobject thiz, int nDeviceID, bool bOpened) -{ - LOGV( "HIDDeviceOpenResult() id=%d, result=%s\n", nDeviceID, bOpened ? "true" : "false" ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( nDeviceID ); - if ( pDevice ) - { - pDevice->SetOpenResult( bOpened ); - } -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceDisconnected)(JNIEnv *env, jobject thiz, int nDeviceID) -{ - LOGV( "HIDDeviceDisconnected() id=%d\n", nDeviceID ); - hid_device_ref<CHIDDevice> pDevice; - { - hid_mutex_guard l( &g_DevicesMutex ); - hid_device_ref<CHIDDevice> pLast, pCurr; - for ( pCurr = g_Devices; pCurr; pLast = pCurr, pCurr = pCurr->next ) - { - if ( pCurr->GetId() == nDeviceID ) - { - pDevice = pCurr; - - if ( pLast ) - { - pLast->next = pCurr->next; - } - else - { - g_Devices = pCurr->next; - } - } - } - } - if ( pDevice ) - { - pDevice->Close( false ); - } -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceInputReport)(JNIEnv *env, jobject thiz, int nDeviceID, jbyteArray value) -{ - jbyte *pBuf = env->GetByteArrayElements(value, NULL); - jsize nBufSize = env->GetArrayLength(value); - -// LOGV( "HIDDeviceInput() id=%d len=%u\n", nDeviceID, nBufSize ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( nDeviceID ); - if ( pDevice ) - { - pDevice->ProcessInput( reinterpret_cast< const uint8_t* >( pBuf ), nBufSize ); - } - - env->ReleaseByteArrayElements(value, pBuf, 0); -} - -extern "C" -JNIEXPORT void JNICALL HID_DEVICE_MANAGER_JAVA_INTERFACE(HIDDeviceFeatureReport)(JNIEnv *env, jobject thiz, int nDeviceID, jbyteArray value) -{ - jbyte *pBuf = env->GetByteArrayElements(value, NULL); - jsize nBufSize = env->GetArrayLength(value); - - LOGV( "HIDDeviceFeatureReport() id=%d len=%u\n", nDeviceID, nBufSize ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( nDeviceID ); - if ( pDevice ) - { - pDevice->ProcessFeatureReport( reinterpret_cast< const uint8_t* >( pBuf ), nBufSize ); - } - - env->ReleaseByteArrayElements(value, pBuf, 0); -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -extern "C" -{ - -int hid_init(void) -{ - return 0; -} - -struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - struct hid_device_info *root = NULL; - hid_mutex_guard l( &g_DevicesMutex ); - for ( hid_device_ref<CHIDDevice> pDevice = g_Devices; pDevice; pDevice = pDevice->next ) - { - const hid_device_info *info = pDevice->GetDeviceInfo(); - if ( ( vendor_id == 0 && product_id == 0 ) || - ( vendor_id == info->vendor_id && product_id == info->product_id ) ) - { - hid_device_info *dev = CopyHIDDeviceInfo( info ); - dev->next = root; - root = dev; - } - } - return root; -} - -void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) -{ - while ( devs ) - { - struct hid_device_info *next = devs->next; - FreeHIDDeviceInfo( devs ); - devs = next; - } -} - -HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - // TODO: Implement - return NULL; -} - -HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path, int bExclusive) -{ - LOGV( "hid_open_path( %s )", path ); - - hid_device_ref< CHIDDevice > pDevice; - { - hid_mutex_guard r( &g_DevicesRefCountMutex ); - hid_mutex_guard l( &g_DevicesMutex ); - for ( hid_device_ref<CHIDDevice> pCurr = g_Devices; pCurr; pCurr = pCurr->next ) - { - if ( strcmp( pCurr->GetDeviceInfo()->path, path ) == 0 ) - { - hid_device *pValue = pCurr->GetDevice(); - if ( pValue ) - { - ++pValue->m_nDeviceRefCount; - LOGD("Incrementing device %d (%p), refCount = %d\n", pValue->m_nId, pValue, pValue->m_nDeviceRefCount); - return pValue; - } - - // Hold a shared pointer to the controller for the duration - pDevice = pCurr; - break; - } - } - } - if ( pDevice && pDevice->BOpen() ) - { - return pDevice->GetDevice(); - } - return NULL; -} - -int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length) -{ - LOGV( "hid_write id=%d length=%u", device->m_nId, length ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - return pDevice->SendOutputReport( data, length ); - } - return -1; // Controller was disconnected -} - -// TODO: Implement timeout? -int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned char *data, size_t length, int milliseconds) -{ -// LOGV( "hid_read_timeout id=%d length=%u timeout=%d", device->m_nId, length, milliseconds ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - return pDevice->GetInput( data, length ); - } - LOGV( "controller was disconnected" ); - return -1; // Controller was disconnected -} - -// TODO: Implement blocking -int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length) -{ - LOGV( "hid_read id=%d length=%u", device->m_nId, length ); - return hid_read_timeout( device, data, length, 0 ); -} - -// TODO: Implement? -int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock) -{ - return -1; -} - -int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length) -{ - LOGV( "hid_send_feature_report id=%d length=%u", device->m_nId, length ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - return pDevice->SendFeatureReport( data, length ); - } - return -1; // Controller was disconnected -} - - -// Synchronous operation. Will block until completed. -int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length) -{ - LOGV( "hid_get_feature_report id=%d length=%u", device->m_nId, length ); - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - return pDevice->GetFeatureReport( data, length ); - } - return -1; // Controller was disconnected -} - - -void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device) -{ - LOGV( "hid_close id=%d", device->m_nId ); - hid_mutex_guard r( &g_DevicesRefCountMutex ); - LOGD("Decrementing device %d (%p), refCount = %d\n", device->m_nId, device, device->m_nDeviceRefCount - 1); - if ( --device->m_nDeviceRefCount == 0 ) - { - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - pDevice->Close( true ); - } - else - { - delete device; - } - LOGD("Deleted device %p\n", device); - } - -} - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen) -{ - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - wcsncpy( string, pDevice->GetDeviceInfo()->manufacturer_string, maxlen ); - return 0; - } - return -1; -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen) -{ - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - wcsncpy( string, pDevice->GetDeviceInfo()->product_string, maxlen ); - return 0; - } - return -1; -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen) -{ - hid_device_ref<CHIDDevice> pDevice = FindDevice( device->m_nId ); - if ( pDevice ) - { - wcsncpy( string, pDevice->GetDeviceInfo()->serial_number, maxlen ); - return 0; - } - return -1; -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen) -{ - return -1; -} - -HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device) -{ - return NULL; -} - -int hid_exit(void) -{ - return 0; -} - -} diff --git a/Source/3rdParty/SDL2/src/hidapi/android/jni/Android.mk b/Source/3rdParty/SDL2/src/hidapi/android/jni/Android.mk deleted file mode 100644 index 4462e88..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/android/jni/Android.mk +++ /dev/null @@ -1,16 +0,0 @@ -LOCAL_PATH:= $(call my-dir) - -HIDAPI_ROOT_REL:= ../.. -HIDAPI_ROOT_ABS:= $(LOCAL_PATH)/../.. - -include $(CLEAR_VARS) - -LOCAL_CPPFLAGS += -std=c++11 - -LOCAL_SRC_FILES := \ - $(HIDAPI_ROOT_REL)/android/hid.cpp - -LOCAL_MODULE := libhidapi -LOCAL_LDLIBS := -llog - -include $(BUILD_SHARED_LIBRARY) diff --git a/Source/3rdParty/SDL2/src/hidapi/android/jni/Application.mk b/Source/3rdParty/SDL2/src/hidapi/android/jni/Application.mk deleted file mode 100644 index 4fc6ba5..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/android/jni/Application.mk +++ /dev/null @@ -1,2 +0,0 @@ -APP_STL := gnustl_static -APP_ABI := armeabi-v7a diff --git a/Source/3rdParty/SDL2/src/hidapi/android/project.properties b/Source/3rdParty/SDL2/src/hidapi/android/project.properties deleted file mode 100644 index 6e18427..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/android/project.properties +++ /dev/null @@ -1,14 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-21 diff --git a/Source/3rdParty/SDL2/src/hidapi/bootstrap b/Source/3rdParty/SDL2/src/hidapi/bootstrap deleted file mode 100644 index 81e9b74..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/bootstrap +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -x -autoreconf --install --verbose --force diff --git a/Source/3rdParty/SDL2/src/hidapi/configure.ac b/Source/3rdParty/SDL2/src/hidapi/configure.ac deleted file mode 100644 index c6747f9..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/configure.ac +++ /dev/null @@ -1,236 +0,0 @@ -AC_PREREQ(2.63) - -# Version number. This is currently the only place. -m4_define([HIDAPI_MAJOR], 0) -m4_define([HIDAPI_MINOR], 8) -m4_define([HIDAPI_RELEASE], 0) -m4_define([HIDAPI_RC], -rc1) -m4_define([VERSION_STRING], HIDAPI_MAJOR[.]HIDAPI_MINOR[.]HIDAPI_RELEASE[]HIDAPI_RC) - -AC_INIT([hidapi],[VERSION_STRING],[alan@signal11.us]) - -# Library soname version -# Follow the following rules (particularly the ones in the second link): -# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -# http://sourceware.org/autobook/autobook/autobook_91.html -lt_current="0" -lt_revision="0" -lt_age="0" -LTLDFLAGS="-version-info ${lt_current}:${lt_revision}:${lt_age}" - -AC_CONFIG_MACRO_DIR([m4]) -AM_INIT_AUTOMAKE([foreign -Wall -Werror]) -AC_CONFIG_MACRO_DIR([m4]) - -m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) -LT_INIT - -AC_PROG_CC -AC_PROG_CXX -AC_PROG_OBJC -PKG_PROG_PKG_CONFIG - - -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - -hidapi_lib_error() { - echo "" - echo " Library $1 was not found on this system." - echo " Please install it and re-run ./configure" - echo "" - exit 1 -} - -hidapi_prog_error() { - echo "" - echo " Program $1 was not found on this system." - echo " This program is part of $2." - echo " Please install it and re-run ./configure" - echo "" - exit 1 -} - -AC_MSG_CHECKING([operating system]) -AC_MSG_RESULT($host) -case $host in -*-linux*) - AC_MSG_RESULT([ (Linux back-end)]) - AC_DEFINE(OS_LINUX, 1, [Linux implementations]) - AC_SUBST(OS_LINUX) - backend="linux" - os="linux" - threads="pthreads" - - # HIDAPI/hidraw libs - PKG_CHECK_MODULES([libudev], [libudev], true, [hidapi_lib_error libudev]) - LIBS_HIDRAW_PR+=" $libudev_LIBS" - CFLAGS_HIDRAW+=" $libudev_CFLAGS" - - # HIDAPI/libusb libs - AC_CHECK_LIB([rt], [clock_gettime], [LIBS_LIBUSB_PRIVATE+=" -lrt"], [hidapi_lib_error librt]) - PKG_CHECK_MODULES([libusb], [libusb-1.0 >= 1.0.9], true, [hidapi_lib_error libusb-1.0]) - LIBS_LIBUSB_PRIVATE+=" $libusb_LIBS" - CFLAGS_LIBUSB+=" $libusb_CFLAGS" - ;; -*-darwin*) - AC_MSG_RESULT([ (Mac OS X back-end)]) - AC_DEFINE(OS_DARWIN, 1, [Mac implementation]) - AC_SUBST(OS_DARWIN) - backend="mac" - os="darwin" - threads="pthreads" - LIBS="${LIBS} -framework IOKit -framework CoreFoundation" - ;; -*-freebsd*) - AC_MSG_RESULT([ (FreeBSD back-end)]) - AC_DEFINE(OS_FREEBSD, 1, [FreeBSD implementation]) - AC_SUBST(OS_FREEBSD) - backend="libusb" - os="freebsd" - threads="pthreads" - - CFLAGS="$CFLAGS -I/usr/local/include" - LDFLAGS="$LDFLAGS -L/usr/local/lib" - LIBS="${LIBS}" - AC_CHECK_LIB([usb], [libusb_init], [LIBS_LIBUSB_PRIVATE="${LIBS_LIBUSB_PRIVATE} -lusb"], [hidapi_lib_error libusb]) - AC_CHECK_LIB([iconv], [iconv_open], [LIBS_LIBUSB_PRIVATE="${LIBS_LIBUSB_PRIVATE} -liconv"], [hidapi_lib_error libiconv]) - echo libs_priv: $LIBS_LIBUSB_PRIVATE - ;; -*-kfreebsd*) - AC_MSG_RESULT([ (kFreeBSD back-end)]) - AC_DEFINE(OS_KFREEBSD, 1, [kFreeBSD implementation]) - AC_SUBST(OS_KFREEBSD) - backend="libusb" - os="kfreebsd" - threads="pthreads" - - AC_CHECK_LIB([usb], [libusb_init], [LIBS_LIBUSB_PRIVATE="${LIBS_LIBUSB_PRIVATE} -lusb"], [hidapi_lib_error libusb]) - echo libs_priv: $LIBS_LIBUSB_PRIVATE - ;; -*-mingw*) - AC_MSG_RESULT([ (Windows back-end, using MinGW)]) - backend="windows" - os="windows" - threads="windows" - win_implementation="mingw" - ;; -*-cygwin*) - AC_MSG_RESULT([ (Windows back-end, using Cygwin)]) - backend="windows" - os="windows" - threads="windows" - win_implementation="cygwin" - ;; -*) - AC_MSG_ERROR([HIDAPI is not supported on your operating system yet]) -esac - -LIBS_HIDRAW="${LIBS} ${LIBS_HIDRAW_PR}" -LIBS_LIBUSB="${LIBS} ${LIBS_LIBUSB_PRIVATE}" -AC_SUBST([LIBS_HIDRAW]) -AC_SUBST([LIBS_LIBUSB]) -AC_SUBST([CFLAGS_LIBUSB]) -AC_SUBST([CFLAGS_HIDRAW]) - -if test "x$os" = xwindows; then - AC_DEFINE(OS_WINDOWS, 1, [Windows implementations]) - AC_SUBST(OS_WINDOWS) - LDFLAGS="${LDFLAGS} -no-undefined" - LIBS="${LIBS} -lsetupapi" -fi - -if test "x$threads" = xpthreads; then - AX_PTHREAD([found_pthreads=yes], [found_pthreads=no]) - - if test "x$found_pthreads" = xyes; then - if test "x$os" = xlinux; then - # Only use pthreads for libusb implementation on Linux. - LIBS_LIBUSB="$PTHREAD_LIBS $LIBS_LIBUSB" - CFLAGS_LIBUSB="$CFLAGS_LIBUSB $PTHREAD_CFLAGS" - # There's no separate CC on Linux for threading, - # so it's ok that both implementations use $PTHREAD_CC - CC="$PTHREAD_CC" - else - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - CC="$PTHREAD_CC" - fi - fi -fi - -# Test GUI -AC_ARG_ENABLE([testgui], - [AS_HELP_STRING([--enable-testgui], - [enable building of test GUI (default n)])], - [testgui_enabled=$enableval], - [testgui_enabled='no']) -AM_CONDITIONAL([BUILD_TESTGUI], [test "x$testgui_enabled" != "xno"]) - -# Configure the MacOS TestGUI app bundle -rm -Rf testgui/TestGUI.app -mkdir -p testgui/TestGUI.app -cp -R ${srcdir}/testgui/TestGUI.app.in/* testgui/TestGUI.app -chmod -R u+w testgui/TestGUI.app -mkdir testgui/TestGUI.app/Contents/MacOS/ - -if test "x$testgui_enabled" != "xno"; then - if test "x$os" = xdarwin; then - # On Mac OS, don't use pkg-config. - AC_CHECK_PROG([foxconfig], [fox-config], [fox-config], false) - if test "x$foxconfig" = "xfalse"; then - hidapi_prog_error fox-config "FOX Toolkit" - fi - LIBS_TESTGUI+=`$foxconfig --libs` - LIBS_TESTGUI+=" -framework Cocoa -L/usr/X11R6/lib" - CFLAGS_TESTGUI+=`$foxconfig --cflags` - OBJCFLAGS+=" -x objective-c++" - elif test "x$os" = xwindows; then - # On Windows, just set the paths for Fox toolkit - if test "x$win_implementation" = xmingw; then - CFLAGS_TESTGUI="-I\$(srcdir)/../../hidapi-externals/fox/include -g -c" - LIBS_TESTGUI=" -mwindows \$(srcdir)/../../hidapi-externals/fox/lib/libFOX-1.6.a -lgdi32 -Wl,--enable-auto-import -static-libgcc -static-libstdc++ -lkernel32" - else - # Cygwin - CFLAGS_TESTGUI="-DWIN32 -I\$(srcdir)/../../hidapi-externals/fox/include -g -c" - LIBS_TESTGUI="\$(srcdir)/../../hidapi-externals/fox/lib/libFOX-cygwin-1.6.a -lgdi32 -Wl,--enable-auto-import -static-libgcc -static-libstdc++ -lkernel32" - fi - else - # On Linux and FreeBSD platforms, use pkg-config to find fox. - PKG_CHECK_MODULES([fox], [fox17], [], [PKG_CHECK_MODULES([fox], [fox])]) - LIBS_TESTGUI="${LIBS_TESTGUI} $fox_LIBS" - if test "x$os" = xfreebsd; then - LIBS_TESTGUI="${LIBS_TESTGUI} -L/usr/local/lib" - fi - CFLAGS_TESTGUI="${CFLAGS_TESTGUI} $fox_CFLAGS" - fi -fi -AC_SUBST([LIBS_TESTGUI]) -AC_SUBST([CFLAGS_TESTGUI]) -AC_SUBST([backend]) - -# OS info for Automake -AM_CONDITIONAL(OS_LINUX, test "x$os" = xlinux) -AM_CONDITIONAL(OS_DARWIN, test "x$os" = xdarwin) -AM_CONDITIONAL(OS_FREEBSD, test "x$os" = xfreebsd) -AM_CONDITIONAL(OS_KFREEBSD, test "x$os" = xkfreebsd) -AM_CONDITIONAL(OS_WINDOWS, test "x$os" = xwindows) - -AC_CONFIG_HEADERS([config.h]) - -if test "x$os" = "xlinux"; then - AC_CONFIG_FILES([pc/hidapi-hidraw.pc]) - AC_CONFIG_FILES([pc/hidapi-libusb.pc]) -else - AC_CONFIG_FILES([pc/hidapi.pc]) -fi - -AC_SUBST(LTLDFLAGS) - -AC_CONFIG_FILES([Makefile \ - hidtest/Makefile \ - libusb/Makefile \ - linux/Makefile \ - mac/Makefile \ - testgui/Makefile \ - windows/Makefile]) -AC_OUTPUT diff --git a/Source/3rdParty/SDL2/src/hidapi/doxygen/Doxyfile b/Source/3rdParty/SDL2/src/hidapi/doxygen/Doxyfile deleted file mode 100644 index 9d983e9..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/doxygen/Doxyfile +++ /dev/null @@ -1,1630 +0,0 @@ -# Doxyfile 1.7.1 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project -# -# All text after a 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. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded -# by quotes) that should identify the project. - -PROJECT_NAME = hidapi - -# 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 = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# 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 = - -# 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 cause performance problems for the file system. - -CREATE_SUBDIRS = 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. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) 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. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) 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. - -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" "the" - -ABBREVIATE_BRIEF = - -# 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. - -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. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then 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. - -FULL_PATH_NAMES = YES - -# If the FULL_PATH_NAMES tag is set to YES then 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. - -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 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. - -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 -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -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 behaviour. -# 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 behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -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. - -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. - -TAB_SIZE = 8 - -# This tag can be used to specify a number of aliases that acts -# 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 = - -# 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. - -OPTIMIZE_OUTPUT_FOR_C = YES - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -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. - -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, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. 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 that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. - -EXTENSION_MAPPING = - -# 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); v.s. -# func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip 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. - -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 (the default) -# 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. - -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. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) 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. - -SUBGROUPING = YES - -# When TYPEDEF_HIDES_STRUCT 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. - -TYPEDEF_HIDES_STRUCT = NO - -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penality. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will rougly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols - -SYMBOL_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 and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When 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 (the default) only methods in the interface are included. - -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. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) 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. - -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 (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -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 (the default) these declarations will be included in the -# documentation. - -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 (the default) these blocks will be appended to the -# function's detailed documentation block. - -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 (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -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. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# 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. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) 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. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -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 default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to 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 default) -# the group names will appear in their defined order. - -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 default), 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. - -SORT_BY_SCOPE_NAME = 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. - -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. - -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. - -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. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or define consists of 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 initializer of individual variables and defines in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -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. - -SHOW_USED_FILES = YES - -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# 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 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 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. See the manual for examples. - -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. The 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. - -LAYOUT_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED 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. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR 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. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be abled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = 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) - -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 stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be 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. - -INPUT = ../hidapi - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. 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. - -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 pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx -# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should -# 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. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used select whether or not files or -# directories that are symbolic links (a Unix filesystem feature) are excluded -# from the input. - -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 = - -# 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 - -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. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# 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 <filter> <input-file>, where <filter> -# is the value of the INPUT_FILTER tag, and <input-file> 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. - -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 -# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -# is applied to all files. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -#--------------------------------------------------------------------------- -# 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 also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. - -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. - -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. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# 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. - -REFERENCES_LINK_SOURCE = 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. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) 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. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# 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. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -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 one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -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. If left blank `html' will be used as the default path. - -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). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# stylesheet in the HTML output directory as well, or it will be erased! - -HTML_STYLESHEET = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the stylesheet 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. -# The allowed range is 0 to 359. - -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. - -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. - -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 NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). - -HTML_DYNAMIC_SECTIONS = NO - -# 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, 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. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# 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. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, 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. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_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. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, 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. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, 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. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, 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). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, 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. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -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. - -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. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -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 -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> -# Qt Help Project / Custom Filters</a>. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> -# Qt Help Project / Filter Attributes</a>. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, 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. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, 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. - -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. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index at -# top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. - -DISABLE_INDEX = NO - -# This tag can be used to set the number of enum values (range [1..20]) -# that doxygen will group on one line in the generated HTML documentation. - -ENUM_VALUES_PER_LINE = 4 - -# 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. - -GENERATE_TREEVIEW = NO - -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# 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. - -TREEVIEW_WIDTH = 250 - -# When 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. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# 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. - -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 before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# 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. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvances is that it is more difficult to setup -# and does not have live searching capabilities. - -SERVER_BASED_SEARCH = NO - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, a4wide, letter, legal and -# executive. If left blank a4wide will be used. - -PAPER_TYPE = a4wide - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load stylesheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# in the INCLUDE_PATH (see below) will be search if a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all function-like macros that are alone -# on a line, have an all uppercase name, and do not end with a semicolon. Such -# function macros are typically used for boiler-plate code, and will confuse -# the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option is superseded by the HAVE_DOT option below. This is only a -# fallback. It is recommended to install and use dot, since it yields more -# powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will write a font called FreeSans.ttf to the output -# directory and reference it in all dot files that doxygen generates. This -# font does not include all possible unicode characters however, so when you need -# these (or just want a differently looking font) you can specify the font name -# using DOT_FONTNAME. You need need to make sure dot is able to find the font, -# which can be done by putting it in a standard location or by setting the -# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory -# containing the font. - -DOT_FONTNAME = FreeSans.ttf - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the output directory to look for the -# FreeSans.ttf font (which doxygen will put there itself). If you specify a -# different font using DOT_FONTNAME you can set the path where dot -# can find it using this tag. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# the CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are png, jpg, or gif -# If left blank png will be used. - -DOT_IMAGE_FORMAT = png - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = YES - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/Source/3rdParty/SDL2/src/hidapi/hidapi/hidapi.h b/Source/3rdParty/SDL2/src/hidapi/hidapi/hidapi.h deleted file mode 100644 index 15d6323..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/hidapi/hidapi.h +++ /dev/null @@ -1,398 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ - -/** @file - * @defgroup API hidapi API - */ - -#ifndef HIDAPI_H__ -#define HIDAPI_H__ - -#include <wchar.h> - -#if defined(_WIN32) && !defined(NAMESPACE) && (0) /* SDL: don't export hidapi syms */ - #define HID_API_EXPORT __declspec(dllexport) - #define HID_API_CALL -#else - #define HID_API_EXPORT /**< API export macro */ - #define HID_API_CALL /**< API call macro */ -#endif - -#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ - -#if defined(__cplusplus) && !defined(NAMESPACE) -extern "C" { -#endif -#ifdef NAMESPACE -namespace NAMESPACE { -#endif - - struct hid_device_; - typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ - - /** hidapi info structure */ - struct hid_device_info { - /** Platform-specific device path */ - char *path; - /** Device Vendor ID */ - unsigned short vendor_id; - /** Device Product ID */ - unsigned short product_id; - /** Serial Number */ - wchar_t *serial_number; - /** Device Release Number in binary-coded decimal, - also known as Device Version Number */ - unsigned short release_number; - /** Manufacturer String */ - wchar_t *manufacturer_string; - /** Product string */ - wchar_t *product_string; - /** Usage Page for this Device/Interface - (Windows/Mac only). */ - unsigned short usage_page; - /** Usage for this Device/Interface - (Windows/Mac only).*/ - unsigned short usage; - /** The USB interface which this logical device - represents. Valid on both Linux implementations - in all cases, and valid on the Windows implementation - only if the device contains more than one interface. */ - int interface_number; - - /** Pointer to the next device */ - struct hid_device_info *next; - }; - - - /** @brief Initialize the HIDAPI library. - - This function initializes the HIDAPI library. Calling it is not - strictly necessary, as it will be called automatically by - hid_enumerate() and any of the hid_open_*() functions if it is - needed. This function should be called at the beginning of - execution however, if there is a chance of HIDAPI handles - being opened by different threads simultaneously. - - @ingroup API - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_init(void); - - /** @brief Finalize the HIDAPI library. - - This function frees all of the static data associated with - HIDAPI. It should be called at the end of execution to avoid - memory leaks. - - @ingroup API - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_exit(void); - - /** @brief Enumerate the HID Devices. - - This function returns a linked list of all the HID devices - attached to the system which match vendor_id and product_id. - If @p vendor_id is set to 0 then any vendor matches. - If @p product_id is set to 0 then any product matches. - If @p vendor_id and @p product_id are both set to 0, then - all HID devices will be returned. - - @ingroup API - @param vendor_id The Vendor ID (VID) of the types of device - to open. - @param product_id The Product ID (PID) of the types of - device to open. - - @returns - This function returns a pointer to a linked list of type - struct #hid_device, containing information about the HID devices - attached to the system, or NULL in the case of failure. Free - this linked list by calling hid_free_enumeration(). - */ - struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); - - /** @brief Free an enumeration Linked List - - This function frees a linked list created by hid_enumerate(). - - @ingroup API - @param devs Pointer to a list of struct_device returned from - hid_enumerate(). - */ - void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); - - /** @brief Open a HID device using a Vendor ID (VID), Product ID - (PID) and optionally a serial number. - - If @p serial_number is NULL, the first device with the - specified VID and PID is opened. - - @ingroup API - @param vendor_id The Vendor ID (VID) of the device to open. - @param product_id The Product ID (PID) of the device to open. - @param serial_number The Serial Number of the device to open - (Optionally NULL). - - @returns - This function returns a pointer to a #hid_device object on - success or NULL on failure. - */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); - - /** @brief Open a HID device by its path name. - - The path name be determined by calling hid_enumerate(), or a - platform-specific path name can be used (eg: /dev/hidraw0 on - Linux). - - @ingroup API - @param path The path name of the device to open - - @returns - This function returns a pointer to a #hid_device object on - success or NULL on failure. - */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path, int bExclusive /* = false */); - - /** @brief Write an Output report to a HID device. - - The first byte of @p data[] must contain the Report ID. For - devices which only support a single report, this must be set - to 0x0. The remaining bytes contain the report data. Since - the Report ID is mandatory, calls to hid_write() will always - contain one more byte than the report contains. For example, - if a hid report is 16 bytes long, 17 bytes must be passed to - hid_write(), the Report ID (or 0x0, for devices with a - single report), followed by the report data (16 bytes). In - this example, the length passed in would be 17. - - hid_write() will send the data on the first OUT endpoint, if - one exists. If it does not, it will send the data through - the Control Endpoint (Endpoint 0). - - @ingroup API - @param device A device handle returned from hid_open(). - @param data The data to send, including the report number as - the first byte. - @param length The length in bytes of the data to send. - - @returns - This function returns the actual number of bytes written and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); - - /** @brief Read an Input report from a HID device with timeout. - - Input reports are returned - to the host through the INTERRUPT IN endpoint. The first byte will - contain the Report number if the device uses numbered reports. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into. - @param length The number of bytes to read. For devices with - multiple reports, make sure to read an extra byte for - the report number. - @param milliseconds timeout in milliseconds or -1 for blocking wait. - - @returns - This function returns the actual number of bytes read and - -1 on error. If no packet was available to be read within - the timeout period, this function returns 0. - */ - int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned char *data, size_t length, int milliseconds); - - /** @brief Read an Input report from a HID device. - - Input reports are returned - to the host through the INTERRUPT IN endpoint. The first byte will - contain the Report number if the device uses numbered reports. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into. - @param length The number of bytes to read. For devices with - multiple reports, make sure to read an extra byte for - the report number. - - @returns - This function returns the actual number of bytes read and - -1 on error. If no packet was available to be read and - the handle is in non-blocking mode, this function returns 0. - */ - int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); - - /** @brief Set the device handle to be non-blocking. - - In non-blocking mode calls to hid_read() will return - immediately with a value of 0 if there is no data to be - read. In blocking mode, hid_read() will wait (block) until - there is data to read before returning. - - Nonblocking can be turned on and off at any time. - - @ingroup API - @param device A device handle returned from hid_open(). - @param nonblock enable or not the nonblocking reads - - 1 to enable nonblocking - - 0 to disable nonblocking. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); - - /** @brief Send a Feature report to the device. - - Feature reports are sent over the Control endpoint as a - Set_Report transfer. The first byte of @p data[] must - contain the Report ID. For devices which only support a - single report, this must be set to 0x0. The remaining bytes - contain the report data. Since the Report ID is mandatory, - calls to hid_send_feature_report() will always contain one - more byte than the report contains. For example, if a hid - report is 16 bytes long, 17 bytes must be passed to - hid_send_feature_report(): the Report ID (or 0x0, for - devices which do not use numbered reports), followed by the - report data (16 bytes). In this example, the length passed - in would be 17. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data The data to send, including the report number as - the first byte. - @param length The length in bytes of the data to send, including - the report number. - - @returns - This function returns the actual number of bytes written and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); - - /** @brief Get a feature report from a HID device. - - Set the first byte of @p data[] to the Report ID of the - report to be read. Make sure to allow space for this - extra byte in @p data[]. Upon return, the first byte will - still contain the Report ID, and the report data will - start in data[1]. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into, including - the Report ID. Set the first byte of @p data[] to the - Report ID of the report to be read, or set it to zero - if your device does not use numbered reports. - @param length The number of bytes to read, including an - extra byte for the report ID. The buffer can be longer - than the actual report. - - @returns - This function returns the number of bytes read plus - one for the report ID (which is still in the first - byte), or -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); - - /** @brief Close a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - */ - void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); - - /** @brief Get The Manufacturer String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get The Product String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get The Serial Number String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get a string from a HID device, based on its string index. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string_index The index of the string to get. - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); - - /** @brief Get a string describing the last error which occurred. - - @ingroup API - @param device A device handle returned from hid_open(). - - @returns - This function returns a string containing the last error - which occurred or NULL if none has occurred. - */ - HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); - -#if defined(__cplusplus) && !defined(NAMESPACE) -} -#endif -#ifdef NAMESPACE -} -#endif - -#endif - diff --git a/Source/3rdParty/SDL2/src/hidapi/hidtest/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/hidtest/Makefile.am deleted file mode 100644 index d278644..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/hidtest/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ - -## Linux -if OS_LINUX -noinst_PROGRAMS = hidtest-libusb hidtest-hidraw - -hidtest_hidraw_SOURCES = hidtest.cpp -hidtest_hidraw_LDADD = $(top_builddir)/linux/libhidapi-hidraw.la - -hidtest_libusb_SOURCES = hidtest.cpp -hidtest_libusb_LDADD = $(top_builddir)/libusb/libhidapi-libusb.la -else - -# Other OS's -noinst_PROGRAMS = hidtest - -hidtest_SOURCES = hidtest.cpp -hidtest_LDADD = $(top_builddir)/$(backend)/libhidapi.la - -endif diff --git a/Source/3rdParty/SDL2/src/hidapi/hidtest/hidtest.cpp b/Source/3rdParty/SDL2/src/hidapi/hidtest/hidtest.cpp deleted file mode 100644 index 94f0a5c..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/hidtest/hidtest.cpp +++ /dev/null @@ -1,194 +0,0 @@ -/******************************************************* - Windows HID simplification - - Alan Ott - Signal 11 Software - - 8/22/2009 - - Copyright 2009 - - This contents of this file may be used by anyone - for any reason without any conditions and may be - used as a starting point for your own applications - which use HIDAPI. -********************************************************/ - -#include <stdio.h> -#include <wchar.h> -#include <string.h> -#include <stdlib.h> -#include "hidapi.h" - -// Headers needed for sleeping. -#ifdef _WIN32 - #include <windows.h> -#else - #include <unistd.h> -#endif - -int main(int argc, char* argv[]) -{ - int res; - unsigned char buf[256]; - #define MAX_STR 255 - wchar_t wstr[MAX_STR]; - hid_device *handle; - int i; - -#ifdef WIN32 - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); -#endif - - struct hid_device_info *devs, *cur_dev; - - if (hid_init()) - return -1; - - devs = hid_enumerate(0x0, 0x0); - cur_dev = devs; - while (cur_dev) { - printf("Device Found\n type: %04hx %04hx\n path: %s\n serial_number: %ls", cur_dev->vendor_id, cur_dev->product_id, cur_dev->path, cur_dev->serial_number); - printf("\n"); - printf(" Manufacturer: %ls\n", cur_dev->manufacturer_string); - printf(" Product: %ls\n", cur_dev->product_string); - printf(" Release: %hx\n", cur_dev->release_number); - printf(" Interface: %d\n", cur_dev->interface_number); - printf("\n"); - cur_dev = cur_dev->next; - } - hid_free_enumeration(devs); - - // Set up the command buffer. - memset(buf,0x00,sizeof(buf)); - buf[0] = 0x01; - buf[1] = 0x81; - - - // Open the device using the VID, PID, - // and optionally the Serial number. - ////handle = hid_open(0x4d8, 0x3f, L"12345"); - handle = hid_open(0x4d8, 0x3f, NULL); - if (!handle) { - printf("unable to open device\n"); - return 1; - } - - // Read the Manufacturer String - wstr[0] = 0x0000; - res = hid_get_manufacturer_string(handle, wstr, MAX_STR); - if (res < 0) - printf("Unable to read manufacturer string\n"); - printf("Manufacturer String: %ls\n", wstr); - - // Read the Product String - wstr[0] = 0x0000; - res = hid_get_product_string(handle, wstr, MAX_STR); - if (res < 0) - printf("Unable to read product string\n"); - printf("Product String: %ls\n", wstr); - - // Read the Serial Number String - wstr[0] = 0x0000; - res = hid_get_serial_number_string(handle, wstr, MAX_STR); - if (res < 0) - printf("Unable to read serial number string\n"); - printf("Serial Number String: (%d) %ls", wstr[0], wstr); - printf("\n"); - - // Read Indexed String 1 - wstr[0] = 0x0000; - res = hid_get_indexed_string(handle, 1, wstr, MAX_STR); - if (res < 0) - printf("Unable to read indexed string 1\n"); - printf("Indexed String 1: %ls\n", wstr); - - // Set the hid_read() function to be non-blocking. - hid_set_nonblocking(handle, 1); - - // Try to read from the device. There shoud be no - // data here, but execution should not block. - res = hid_read(handle, buf, 17); - - // Send a Feature Report to the device - buf[0] = 0x2; - buf[1] = 0xa0; - buf[2] = 0x0a; - buf[3] = 0x00; - buf[4] = 0x00; - res = hid_send_feature_report(handle, buf, 17); - if (res < 0) { - printf("Unable to send a feature report.\n"); - } - - memset(buf,0,sizeof(buf)); - - // Read a Feature Report from the device - buf[0] = 0x2; - res = hid_get_feature_report(handle, buf, sizeof(buf)); - if (res < 0) { - printf("Unable to get a feature report.\n"); - printf("%ls", hid_error(handle)); - } - else { - // Print out the returned buffer. - printf("Feature Report\n "); - for (i = 0; i < res; i++) - printf("%02hhx ", buf[i]); - printf("\n"); - } - - memset(buf,0,sizeof(buf)); - - // Toggle LED (cmd 0x80). The first byte is the report number (0x1). - buf[0] = 0x1; - buf[1] = 0x80; - res = hid_write(handle, buf, 17); - if (res < 0) { - printf("Unable to write()\n"); - printf("Error: %ls\n", hid_error(handle)); - } - - - // Request state (cmd 0x81). The first byte is the report number (0x1). - buf[0] = 0x1; - buf[1] = 0x81; - hid_write(handle, buf, 17); - if (res < 0) - printf("Unable to write() (2)\n"); - - // Read requested state. hid_read() has been set to be - // non-blocking by the call to hid_set_nonblocking() above. - // This loop demonstrates the non-blocking nature of hid_read(). - res = 0; - while (res == 0) { - res = hid_read(handle, buf, sizeof(buf)); - if (res == 0) - printf("waiting...\n"); - if (res < 0) - printf("Unable to read()\n"); - #ifdef WIN32 - Sleep(500); - #else - usleep(500*1000); - #endif - } - - printf("Data read:\n "); - // Print out the returned buffer. - for (i = 0; i < res; i++) - printf("%02hhx ", buf[i]); - printf("\n"); - - hid_close(handle); - - /* Free static HIDAPI objects. */ - hid_exit(); - -#ifdef WIN32 - system("pause"); -#endif - - return 0; -} diff --git a/Source/3rdParty/SDL2/src/hidapi/ios/Makefile-manual b/Source/3rdParty/SDL2/src/hidapi/ios/Makefile-manual deleted file mode 100644 index 939a077..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/ios/Makefile-manual +++ /dev/null @@ -1,32 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-07-03 -########################################### - -all: hidtest - -CC=gcc -CXX=g++ -COBJS=hid.o -CPPOBJS=../hidtest/hidtest.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS+=-I../hidapi -Wall -g -c -LIBS=-framework CoreBluetooth -framework CoreFoundation - - -hidtest: $(OBJS) - g++ -Wall -g $^ $(LIBS) -o hidtest - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -clean: - rm -f *.o hidtest $(CPPOBJS) - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/ios/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/ios/Makefile.am deleted file mode 100644 index 1f8f2ce..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/ios/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -lib_LTLIBRARIES = libhidapi.la -libhidapi_la_SOURCES = hid.m -libhidapi_la_LDFLAGS = $(LTLDFLAGS) -AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ - -hdrdir = $(includedir)/hidapi -hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h - -EXTRA_DIST = Makefile-manual diff --git a/Source/3rdParty/SDL2/src/hidapi/ios/hid.m b/Source/3rdParty/SDL2/src/hidapi/ios/hid.m deleted file mode 100644 index a0ca7cd..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/ios/hid.m +++ /dev/null @@ -1,914 +0,0 @@ -//======== Copyright (c) 2017 Valve Corporation, All rights reserved. ========= -// -// Purpose: HID device abstraction temporary stub -// -//============================================================================= -#include "../../SDL_internal.h" - -#ifdef SDL_JOYSTICK_HIDAPI - -#include <CoreBluetooth/CoreBluetooth.h> -#include <QuartzCore/QuartzCore.h> -#import <UIKit/UIKit.h> -#import <mach/mach_time.h> -#include <pthread.h> -#include <sys/time.h> -#include <unistd.h> -#include "../hidapi/hidapi.h" - -#define VALVE_USB_VID 0x28DE -#define D0G_BLE2_PID 0x1106 - -typedef uint32_t uint32; -typedef uint64_t uint64; - -// enables detailed NSLog logging of feature reports -#define FEATURE_REPORT_LOGGING 0 - -#define REPORT_SEGMENT_DATA_FLAG 0x80 -#define REPORT_SEGMENT_LAST_FLAG 0x40 - -#define VALVE_SERVICE @"100F6C32-1735-4313-B402-38567131E5F3" - -// (READ/NOTIFICATIONS) -#define VALVE_INPUT_CHAR @"100F6C33-1735-4313-B402-38567131E5F3" - -// (READ/WRITE) -#define VALVE_REPORT_CHAR @"100F6C34-1735-4313-B402-38567131E5F3" - -// TODO: create CBUUID's in __attribute__((constructor)) rather than doing [CBUUID UUIDWithString:...] everywhere - -#pragma pack(push,1) - -typedef struct -{ - uint8_t segmentHeader; - uint8_t featureReportMessageID; - uint8_t length; - uint8_t settingIdentifier; - union { - uint16_t usPayload; - uint32_t uPayload; - uint64_t ulPayload; - uint8_t ucPayload[15]; - }; -} bluetoothSegment; - -typedef struct { - uint8_t id; - union { - bluetoothSegment segment; - struct { - uint8_t segmentHeader; - uint8_t featureReportMessageID; - uint8_t length; - uint8_t settingIdentifier; - union { - uint16_t usPayload; - uint32_t uPayload; - uint64_t ulPayload; - uint8_t ucPayload[15]; - }; - }; - }; -} hidFeatureReport; - -#pragma pack(pop) - -size_t GetBluetoothSegmentSize(bluetoothSegment *segment) -{ - return segment->length + 3; -} - -#define RingBuffer_cbElem 19 -#define RingBuffer_nElem 4096 - -typedef struct { - int _first, _last; - uint8_t _data[ ( RingBuffer_nElem * RingBuffer_cbElem ) ]; - pthread_mutex_t accessLock; -} RingBuffer; - -static void RingBuffer_init( RingBuffer *this ) -{ - this->_first = -1; - this->_last = 0; - pthread_mutex_init( &this->accessLock, 0 ); -} - -static bool RingBuffer_write( RingBuffer *this, const uint8_t *src ) -{ - pthread_mutex_lock( &this->accessLock ); - memcpy( &this->_data[ this->_last ], src, RingBuffer_cbElem ); - if ( this->_first == -1 ) - { - this->_first = this->_last; - } - this->_last = ( this->_last + RingBuffer_cbElem ) % (RingBuffer_nElem * RingBuffer_cbElem); - if ( this->_last == this->_first ) - { - this->_first = ( this->_first + RingBuffer_cbElem ) % (RingBuffer_nElem * RingBuffer_cbElem); - pthread_mutex_unlock( &this->accessLock ); - return false; - } - pthread_mutex_unlock( &this->accessLock ); - return true; -} - -static bool RingBuffer_read( RingBuffer *this, uint8_t *dst ) -{ - pthread_mutex_lock( &this->accessLock ); - if ( this->_first == -1 ) - { - pthread_mutex_unlock( &this->accessLock ); - return false; - } - memcpy( dst, &this->_data[ this->_first ], RingBuffer_cbElem ); - this->_first = ( this->_first + RingBuffer_cbElem ) % (RingBuffer_nElem * RingBuffer_cbElem); - if ( this->_first == this->_last ) - { - this->_first = -1; - } - pthread_mutex_unlock( &this->accessLock ); - return true; -} - - -#pragma mark HIDBLEDevice Definition - -typedef enum -{ - BLEDeviceWaitState_None, - BLEDeviceWaitState_Waiting, - BLEDeviceWaitState_Complete, - BLEDeviceWaitState_Error -} BLEDeviceWaitState; - -@interface HIDBLEDevice : NSObject <CBPeripheralDelegate> -{ - RingBuffer _inputReports; - uint8_t _featureReport[20]; - BLEDeviceWaitState _waitStateForReadFeatureReport; - BLEDeviceWaitState _waitStateForWriteFeatureReport; -} - -@property (nonatomic, readwrite) bool connected; -@property (nonatomic, readwrite) bool ready; - -@property (nonatomic, strong) CBPeripheral *bleSteamController; -@property (nonatomic, strong) CBCharacteristic *bleCharacteristicInput; -@property (nonatomic, strong) CBCharacteristic *bleCharacteristicReport; - -- (id)initWithPeripheral:(CBPeripheral *)peripheral; - -@end - - -@interface HIDBLEManager : NSObject <CBCentralManagerDelegate> - -@property (nonatomic) int nPendingScans; -@property (nonatomic) int nPendingPairs; -@property (nonatomic, strong) CBCentralManager *centralManager; -@property (nonatomic, strong) NSMapTable<CBPeripheral *, HIDBLEDevice *> *deviceMap; -@property (nonatomic, retain) dispatch_queue_t bleSerialQueue; - -+ (instancetype)sharedInstance; -- (void)startScan:(int)duration; -- (void)stopScan; -- (int)updateConnectedSteamControllers:(BOOL) bForce; -- (void)appWillResignActiveNotification:(NSNotification *)note; -- (void)appDidBecomeActiveNotification:(NSNotification *)note; - -@end - - -// singleton class - access using HIDBLEManager.sharedInstance -@implementation HIDBLEManager - -+ (instancetype)sharedInstance -{ - static HIDBLEManager *sharedInstance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedInstance = [HIDBLEManager new]; - sharedInstance.nPendingScans = 0; - sharedInstance.nPendingPairs = 0; - - [[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(appWillResignActiveNotification:) name: UIApplicationWillResignActiveNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(appDidBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil]; - - // receive reports on a high-priority serial-queue. optionally put writes on the serial queue to avoid logical - // race conditions talking to the controller from multiple threads, although BLE fragmentation/assembly means - // that we can still screw this up. - // most importantly we need to consume reports at a high priority to avoid the OS thinking we aren't really - // listening to the BLE device, as iOS on slower devices may stop delivery of packets to the app WITHOUT ACTUALLY - // DISCONNECTING FROM THE DEVICE if we don't react quickly enough to their delivery. - // see also the error-handling states in the peripheral delegate to re-open the device if it gets closed - sharedInstance.bleSerialQueue = dispatch_queue_create( "com.valvesoftware.steamcontroller.ble", DISPATCH_QUEUE_SERIAL ); - dispatch_set_target_queue( sharedInstance.bleSerialQueue, dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 ) ); - - // creating a CBCentralManager will always trigger a future centralManagerDidUpdateState: - // where any scanning gets started or connecting to existing peripherals happens, it's never already in a - // powered-on state for a newly launched application. - sharedInstance.centralManager = [[CBCentralManager alloc] initWithDelegate:sharedInstance queue:sharedInstance.bleSerialQueue]; - sharedInstance.deviceMap = [[NSMapTable alloc] initWithKeyOptions:NSMapTableWeakMemory valueOptions:NSMapTableStrongMemory capacity:4]; - }); - return sharedInstance; -} - -// called for NSNotification UIApplicationWillResignActiveNotification -- (void)appWillResignActiveNotification:(NSNotification *)note -{ - // we'll get resign-active notification if pairing is happening. - if ( self.nPendingPairs > 0 ) - return; - - for ( CBPeripheral *peripheral in self.deviceMap ) - { - HIDBLEDevice *steamController = [self.deviceMap objectForKey:peripheral]; - if ( steamController ) - { - steamController.connected = NO; - steamController.ready = NO; - [self.centralManager cancelPeripheralConnection:peripheral]; - } - } - [self.deviceMap removeAllObjects]; -} - -// called for NSNotification UIApplicationDidBecomeActiveNotification -// whenever the application comes back from being inactive, trigger a 20s pairing scan and reconnect -// any devices that may have paired while we were inactive. -- (void)appDidBecomeActiveNotification:(NSNotification *)note -{ - [self updateConnectedSteamControllers:true]; - [self startScan:20]; -} - -- (int)updateConnectedSteamControllers:(BOOL) bForce -{ - static uint64_t s_unLastUpdateTick = 0; - static mach_timebase_info_data_t s_timebase_info; - - if (s_timebase_info.denom == 0) - { - mach_timebase_info( &s_timebase_info ); - } - - uint64_t ticksNow = mach_approximate_time(); - if ( !bForce && ( ( (ticksNow - s_unLastUpdateTick) * s_timebase_info.numer ) / s_timebase_info.denom ) < (5ull * NSEC_PER_SEC) ) - return (int)self.deviceMap.count; - - // we can see previously connected BLE peripherals but can't connect until the CBCentralManager - // is fully powered up - only do work when we are in that state - if ( self.centralManager.state != CBManagerStatePoweredOn ) - return (int)self.deviceMap.count; - - // only update our last-check-time if we actually did work, otherwise there can be a long delay during initial power-up - s_unLastUpdateTick = mach_approximate_time(); - - // if a pair is in-flight, the central manager may still give it back via retrieveConnected... and - // cause the SDL layer to attempt to initialize it while some of its endpoints haven't yet been established - if ( self.nPendingPairs > 0 ) - return (int)self.deviceMap.count; - - NSArray<CBPeripheral *> *peripherals = [self.centralManager retrieveConnectedPeripheralsWithServices: @[ [CBUUID UUIDWithString:@"180A"]]]; - for ( CBPeripheral *peripheral in peripherals ) - { - // we already know this peripheral - if ( [self.deviceMap objectForKey: peripheral] != nil ) - continue; - - NSLog( @"connected peripheral: %@", peripheral ); - if ( [peripheral.name isEqualToString:@"SteamController"] ) - { - HIDBLEDevice *steamController = [[HIDBLEDevice alloc] initWithPeripheral:peripheral]; - [self.deviceMap setObject:steamController forKey:peripheral]; - [self.centralManager connectPeripheral:peripheral options:nil]; - } - } - - return (int)self.deviceMap.count; -} - -// manual API for folks to start & stop scanning -- (void)startScan:(int)duration -{ - NSLog( @"BLE: requesting scan for %d seconds", duration ); - @synchronized (self) - { - if ( _nPendingScans++ == 0 ) - { - [self.centralManager scanForPeripheralsWithServices:nil options:nil]; - } - } - - if ( duration != 0 ) - { - dispatch_after( dispatch_time( DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self stopScan]; - }); - } -} - -- (void)stopScan -{ - NSLog( @"BLE: stopping scan" ); - @synchronized (self) - { - if ( --_nPendingScans <= 0 ) - { - _nPendingScans = 0; - [self.centralManager stopScan]; - } - } -} - - -#pragma mark CBCentralManagerDelegate Implementation - -// called whenever the BLE hardware state changes. -- (void)centralManagerDidUpdateState:(CBCentralManager *)central -{ - switch ( central.state ) - { - case CBCentralManagerStatePoweredOn: - { - NSLog( @"CoreBluetooth BLE hardware is powered on and ready" ); - - // at startup, if we have no already attached peripherals, do a 20s scan for new unpaired devices, - // otherwise callers should occaisionally do additional scans. we don't want to continuously be - // scanning because it drains battery, causes other nearby people to have a hard time pairing their - // Steam Controllers, and may also trigger firmware weirdness when a device attempts to start - // the pairing sequence multiple times concurrently - if ( [self updateConnectedSteamControllers:false] == 0 ) - { - // TODO: we could limit our scan to only peripherals supporting the SteamController service, but - // that service doesn't currently fit in the base advertising packet, we'd need to put it into an - // extended scan packet. Useful optimization downstream, but not currently necessary - // NSArray *services = @[[CBUUID UUIDWithString:VALVE_SERVICE]]; - [self startScan:20]; - } - break; - } - - case CBCentralManagerStatePoweredOff: - NSLog( @"CoreBluetooth BLE hardware is powered off" ); - break; - - case CBCentralManagerStateUnauthorized: - NSLog( @"CoreBluetooth BLE state is unauthorized" ); - break; - - case CBCentralManagerStateUnknown: - NSLog( @"CoreBluetooth BLE state is unknown" ); - break; - - case CBCentralManagerStateUnsupported: - NSLog( @"CoreBluetooth BLE hardware is unsupported on this platform" ); - break; - - case CBCentralManagerStateResetting: - NSLog( @"CoreBluetooth BLE manager is resetting" ); - break; - } -} - -- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral -{ - HIDBLEDevice *steamController = [_deviceMap objectForKey:peripheral]; - steamController.connected = YES; - self.nPendingPairs -= 1; -} - -- (void)centralManager:(CBCentralManager *)central didFailToConnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error -{ - NSLog( @"Failed to connect: %@", error ); - [_deviceMap removeObjectForKey:peripheral]; - self.nPendingPairs -= 1; -} - -- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI -{ - NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; - NSString *log = [NSString stringWithFormat:@"Found '%@'", localName]; - - if ( [localName isEqualToString:@"SteamController"] ) - { - NSLog( @"%@ : %@ - %@", log, peripheral, advertisementData ); - self.nPendingPairs += 1; - HIDBLEDevice *steamController = [[HIDBLEDevice alloc] initWithPeripheral:peripheral]; - [self.deviceMap setObject:steamController forKey:peripheral]; - [self.centralManager connectPeripheral:peripheral options:nil]; - } -} - -- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error -{ - HIDBLEDevice *steamController = [self.deviceMap objectForKey:peripheral]; - if ( steamController ) - { - steamController.connected = NO; - steamController.ready = NO; - [self.deviceMap removeObjectForKey:peripheral]; - } -} - -@end - - -// Core Bluetooth devices calling back on event boundaries of their run-loops. so annoying. -static void process_pending_events() -{ - CFRunLoopRunResult res; - do - { - res = CFRunLoopRunInMode( kCFRunLoopDefaultMode, 0.001, FALSE ); - } - while( res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut ); -} - -@implementation HIDBLEDevice - -- (id)init -{ - if ( self = [super init] ) - { - RingBuffer_init( &_inputReports ); - self.bleSteamController = nil; - self.bleCharacteristicInput = nil; - self.bleCharacteristicReport = nil; - _connected = NO; - _ready = NO; - } - return self; -} - -- (id)initWithPeripheral:(CBPeripheral *)peripheral -{ - if ( self = [super init] ) - { - RingBuffer_init( &_inputReports ); - _connected = NO; - _ready = NO; - self.bleSteamController = peripheral; - if ( peripheral ) - { - peripheral.delegate = self; - } - self.bleCharacteristicInput = nil; - self.bleCharacteristicReport = nil; - } - return self; -} - -- (void)setConnected:(bool)connected -{ - _connected = connected; - if ( _connected ) - { - [_bleSteamController discoverServices:nil]; - } - else - { - NSLog( @"Disconnected" ); - } -} - -- (size_t)read_input_report:(uint8_t *)dst -{ - if ( RingBuffer_read( &_inputReports, dst+1 ) ) - { - *dst = 0x03; - return 20; - } - return 0; -} - -- (int)send_report:(const uint8_t *)data length:(size_t)length -{ - [_bleSteamController writeValue:[NSData dataWithBytes:data length:length] forCharacteristic:_bleCharacteristicReport type:CBCharacteristicWriteWithResponse]; - return (int)length; -} - -- (int)send_feature_report:(hidFeatureReport *)report -{ -#if FEATURE_REPORT_LOGGING - uint8_t *reportBytes = (uint8_t *)report; - - NSLog( @"HIDBLE:send_feature_report (%02zu/19) [%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x]", GetBluetoothSegmentSize( report->segment ), - reportBytes[1], reportBytes[2], reportBytes[3], reportBytes[4], reportBytes[5], reportBytes[6], - reportBytes[7], reportBytes[8], reportBytes[9], reportBytes[10], reportBytes[11], reportBytes[12], - reportBytes[13], reportBytes[14], reportBytes[15], reportBytes[16], reportBytes[17], reportBytes[18], - reportBytes[19] ); -#endif - - int sendSize = (int)GetBluetoothSegmentSize( &report->segment ); - if ( sendSize > 20 ) - sendSize = 20; - -#if 1 - // fire-and-forget - we are going to not wait for the response here because all Steam Controller BLE send_feature_report's are ignored, - // except errors. - [_bleSteamController writeValue:[NSData dataWithBytes:&report->segment length:sendSize] forCharacteristic:_bleCharacteristicReport type:CBCharacteristicWriteWithResponse]; - - // pretend we received a result anybody cares about - return 19; - -#else - // this is technically the correct send_feature_report logic if you want to make sure it gets through and is - // acknowledged or errors out - _waitStateForWriteFeatureReport = BLEDeviceWaitState_Waiting; - [_bleSteamController writeValue:[NSData dataWithBytes:&report->segment length:sendSize - ] forCharacteristic:_bleCharacteristicReport type:CBCharacteristicWriteWithResponse]; - - while ( _waitStateForWriteFeatureReport == BLEDeviceWaitState_Waiting ) - { - process_pending_events(); - } - - if ( _waitStateForWriteFeatureReport == BLEDeviceWaitState_Error ) - { - _waitStateForWriteFeatureReport = BLEDeviceWaitState_None; - return -1; - } - - _waitStateForWriteFeatureReport = BLEDeviceWaitState_None; - return 19; -#endif -} - -- (int)get_feature_report:(uint8_t)feature into:(uint8_t *)buffer -{ - _waitStateForReadFeatureReport = BLEDeviceWaitState_Waiting; - [_bleSteamController readValueForCharacteristic:_bleCharacteristicReport]; - - while ( _waitStateForReadFeatureReport == BLEDeviceWaitState_Waiting ) - process_pending_events(); - - if ( _waitStateForReadFeatureReport == BLEDeviceWaitState_Error ) - { - _waitStateForReadFeatureReport = BLEDeviceWaitState_None; - return -1; - } - - memcpy( buffer, _featureReport, sizeof(_featureReport) ); - - _waitStateForReadFeatureReport = BLEDeviceWaitState_None; - -#if FEATURE_REPORT_LOGGING - NSLog( @"HIDBLE:get_feature_report (19) [%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x]", - buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], - buffer[7], buffer[8], buffer[9], buffer[10], buffer[11], buffer[12], - buffer[13], buffer[14], buffer[15], buffer[16], buffer[17], buffer[18], - buffer[19] ); -#endif - - return 19; -} - -#pragma mark CBPeripheralDelegate Implementation - -- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error -{ - for (CBService *service in peripheral.services) - { - NSLog( @"Found Service: %@", service ); - if ( [service.UUID isEqual:[CBUUID UUIDWithString:VALVE_SERVICE]] ) - { - [peripheral discoverCharacteristics:nil forService:service]; - } - } -} - -- (void)peripheral:(CBPeripheral *)peripheral didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error -{ - // nothing yet needed here, enable for logging - if ( /* DISABLES CODE */ (0) ) - { - for ( CBDescriptor *descriptor in characteristic.descriptors ) - { - NSLog( @" - Descriptor '%@'", descriptor ); - } - } -} - -- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error -{ - if ([service.UUID isEqual:[CBUUID UUIDWithString:VALVE_SERVICE]]) - { - for (CBCharacteristic *aChar in service.characteristics) - { - NSLog( @"Found Characteristic %@", aChar ); - - if ( [aChar.UUID isEqual:[CBUUID UUIDWithString:VALVE_INPUT_CHAR]] ) - { - self.bleCharacteristicInput = aChar; - } - else if ( [aChar.UUID isEqual:[CBUUID UUIDWithString:VALVE_REPORT_CHAR]] ) - { - self.bleCharacteristicReport = aChar; - [self.bleSteamController discoverDescriptorsForCharacteristic: aChar]; - } - } - } -} - -- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error -{ - static uint64_t s_ticksLastOverflowReport = 0; - - // receiving an input report is the final indicator that the user accepted a pairing - // request and that we successfully established notification. CoreBluetooth has no - // notification of the pairing acknowledgement, which is a bad oversight. - if ( self.ready == NO ) - { - self.ready = YES; - HIDBLEManager.sharedInstance.nPendingPairs -= 1; - } - - if ( [characteristic.UUID isEqual:_bleCharacteristicInput.UUID] ) - { - NSData *data = [characteristic value]; - if ( data.length != 19 ) - { - NSLog( @"HIDBLE: incoming data is %lu bytes should be exactly 19", (unsigned long)data.length ); - } - if ( !RingBuffer_write( &_inputReports, (const uint8_t *)data.bytes ) ) - { - uint64_t ticksNow = mach_approximate_time(); - if ( ticksNow - s_ticksLastOverflowReport > (5ull * NSEC_PER_SEC / 10) ) - { - NSLog( @"HIDBLE: input report buffer overflow" ); - s_ticksLastOverflowReport = ticksNow; - } - } - } - else if ( [characteristic.UUID isEqual:_bleCharacteristicReport.UUID] ) - { - memset( _featureReport, 0, sizeof(_featureReport) ); - - if ( error != nil ) - { - NSLog( @"HIDBLE: get_feature_report error: %@", error ); - _waitStateForReadFeatureReport = BLEDeviceWaitState_Error; - } - else - { - NSData *data = [characteristic value]; - if ( data.length != 20 ) - { - NSLog( @"HIDBLE: incoming data is %lu bytes should be exactly 20", (unsigned long)data.length ); - } - memcpy( _featureReport, data.bytes, MIN( data.length, sizeof(_featureReport) ) ); - _waitStateForReadFeatureReport = BLEDeviceWaitState_Complete; - } - } -} - -- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error -{ - if ( [characteristic.UUID isEqual:[CBUUID UUIDWithString:VALVE_REPORT_CHAR]] ) - { - if ( error != nil ) - { - NSLog( @"HIDBLE: write_feature_report error: %@", error ); - _waitStateForWriteFeatureReport = BLEDeviceWaitState_Error; - } - else - { - _waitStateForWriteFeatureReport = BLEDeviceWaitState_Complete; - } - } -} - -- (void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error -{ - NSLog( @"didUpdateNotifcationStateForCharacteristic %@ (%@)", characteristic, error ); -} - -@end - - -#pragma mark hid_api implementation - -struct hid_device_ { - void *device_handle; - int blocking; - hid_device *next; -}; - -int HID_API_EXPORT HID_API_CALL hid_init(void) -{ - return ( HIDBLEManager.sharedInstance == nil ) ? -1 : 0; -} - -int HID_API_EXPORT HID_API_CALL hid_exit(void) -{ - return 0; -} - -void HID_API_EXPORT HID_API_CALL hid_ble_scan( bool bStart ) -{ - HIDBLEManager *bleManager = HIDBLEManager.sharedInstance; - if ( bStart ) - { - [bleManager startScan:0]; - } - else - { - [bleManager stopScan]; - } -} - -hid_device * HID_API_EXPORT hid_open_path( const char *path, int bExclusive /* = false */ ) -{ - hid_device *result = NULL; - NSString *nssPath = [NSString stringWithUTF8String:path]; - HIDBLEManager *bleManager = HIDBLEManager.sharedInstance; - NSEnumerator<HIDBLEDevice *> *devices = [bleManager.deviceMap objectEnumerator]; - - for ( HIDBLEDevice *device in devices ) - { - // we have the device but it hasn't found its service or characteristics until it is connected - if ( !device.ready || !device.connected || !device.bleCharacteristicInput ) - continue; - - if ( [device.bleSteamController.identifier.UUIDString isEqualToString:nssPath] ) - { - result = (hid_device *)malloc( sizeof( hid_device ) ); - memset( result, 0, sizeof( hid_device ) ); - result->device_handle = (void*)CFBridgingRetain( device ); - result->blocking = NO; - // enable reporting input events on the characteristic - [device.bleSteamController setNotifyValue:YES forCharacteristic:device.bleCharacteristicInput]; - return result; - } - } - return result; -} - -void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) -{ - /* This function is identical to the Linux version. Platform independent. */ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - -int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) -{ - /* All Nonblocking operation is handled by the library. */ - dev->blocking = !nonblock; - - return 0; -} - -struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ @autoreleasepool { - struct hid_device_info *root = NULL; - - if ( ( vendor_id == 0 && product_id == 0 ) || - ( vendor_id == VALVE_USB_VID && product_id == D0G_BLE2_PID ) ) - { - HIDBLEManager *bleManager = HIDBLEManager.sharedInstance; - [bleManager updateConnectedSteamControllers:false]; - NSEnumerator<HIDBLEDevice *> *devices = [bleManager.deviceMap objectEnumerator]; - for ( HIDBLEDevice *device in devices ) - { - // there are several brief windows in connecting to an already paired device and - // one long window waiting for users to confirm pairing where we don't want - // to consider a device ready - if we hand it back to SDL or another - // Steam Controller consumer, their additional SC setup work will fail - // in unusual/silent ways and we can actually corrupt the BLE stack for - // the entire system and kill the appletv remote's Menu button (!) - if ( device.bleSteamController.state != CBPeripheralStateConnected || - device.connected == NO || device.ready == NO ) - { - if ( device.ready == NO && device.bleCharacteristicInput != nil ) - { - // attempt to register for input reports. this call will silently fail - // until the pairing finalizes with user acceptance. oh, apple. - [device.bleSteamController setNotifyValue:YES forCharacteristic:device.bleCharacteristicInput]; - } - continue; - } - struct hid_device_info *device_info = (struct hid_device_info *)malloc( sizeof(struct hid_device_info) ); - memset( device_info, 0, sizeof(struct hid_device_info) ); - device_info->next = root; - root = device_info; - device_info->path = strdup( device.bleSteamController.identifier.UUIDString.UTF8String ); - device_info->vendor_id = VALVE_USB_VID; - device_info->product_id = D0G_BLE2_PID; - device_info->product_string = wcsdup( L"Steam Controller" ); - device_info->manufacturer_string = wcsdup( L"Valve Corporation" ); - } - } - return root; -}} - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - static wchar_t s_wszManufacturer[] = L"Valve Corporation"; - wcsncpy( string, s_wszManufacturer, sizeof(s_wszManufacturer)/sizeof(s_wszManufacturer[0]) ); - return 0; -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - static wchar_t s_wszProduct[] = L"Steam Controller"; - wcsncpy( string, s_wszProduct, sizeof(s_wszProduct)/sizeof(s_wszProduct[0]) ); - return 0; -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - static wchar_t s_wszSerial[] = L"12345"; - wcsncpy( string, s_wszSerial, sizeof(s_wszSerial)/sizeof(s_wszSerial[0]) ); - return 0; -} - -int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - HIDBLEDevice *device_handle = (__bridge HIDBLEDevice *)dev->device_handle; - - if ( !device_handle.connected ) - return -1; - - return [device_handle send_report:data length:length]; -} - -void HID_API_EXPORT hid_close(hid_device *dev) -{ - HIDBLEDevice *device_handle = CFBridgingRelease( dev->device_handle ); - - // disable reporting input events on the characteristic - if ( device_handle.connected ) { - [device_handle.bleSteamController setNotifyValue:NO forCharacteristic:device_handle.bleCharacteristicInput]; - } - - free( dev ); -} - -int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - HIDBLEDevice *device_handle = (__bridge HIDBLEDevice *)dev->device_handle; - - if ( !device_handle.connected ) - return -1; - - return [device_handle send_feature_report:(hidFeatureReport *)(void *)data]; -} - -int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - HIDBLEDevice *device_handle = (__bridge HIDBLEDevice *)dev->device_handle; - - if ( !device_handle.connected ) - return -1; - - size_t written = [device_handle get_feature_report:data[0] into:data]; - - return written == length-1 ? (int)length : (int)written; -} - -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - HIDBLEDevice *device_handle = (__bridge HIDBLEDevice *)dev->device_handle; - - if ( !device_handle.connected ) - return -1; - - return hid_read_timeout(dev, data, length, 0); -} - -int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - HIDBLEDevice *device_handle = (__bridge HIDBLEDevice *)dev->device_handle; - - if ( !device_handle.connected ) - return -1; - - if ( milliseconds != 0 ) - { - NSLog( @"hid_read_timeout with non-zero wait" ); - } - int result = (int)[device_handle read_input_report:data]; -#if FEATURE_REPORT_LOGGING - NSLog( @"HIDBLE:hid_read_timeout (%d) [%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x]", result, - data[1], data[2], data[3], data[4], data[5], data[6], - data[7], data[8], data[9], data[10], data[11], data[12], - data[13], data[14], data[15], data[16], data[17], data[18], - data[19] ); -#endif - return result; -} - -#endif /* SDL_JOYSTICK_HIDAPI */ diff --git a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile-manual b/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile-manual deleted file mode 100644 index c0fe868..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile-manual +++ /dev/null @@ -1,18 +0,0 @@ - - -OS=$(shell uname) - -ifeq ($(OS), Linux) - FILE=Makefile.linux -endif - -ifeq ($(OS), FreeBSD) - FILE=Makefile.freebsd -endif - -ifeq ($(FILE), ) -all: - $(error Your platform ${OS} is not supported by hidapi/libusb at this time.) -endif - -include $(FILE) diff --git a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.am deleted file mode 100644 index 13c9d35..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -AM_CPPFLAGS = -I$(top_srcdir)/hidapi $(CFLAGS_LIBUSB) - -if OS_LINUX -lib_LTLIBRARIES = libhidapi-libusb.la -libhidapi_libusb_la_SOURCES = hid.c -libhidapi_libusb_la_LDFLAGS = $(LTLDFLAGS) $(PTHREAD_CFLAGS) -libhidapi_libusb_la_LIBADD = $(LIBS_LIBUSB) -endif - -if OS_FREEBSD -lib_LTLIBRARIES = libhidapi.la -libhidapi_la_SOURCES = hid.c -libhidapi_la_LDFLAGS = $(LTLDFLAGS) -libhidapi_la_LIBADD = $(LIBS_LIBUSB) -endif - -if OS_KFREEBSD -lib_LTLIBRARIES = libhidapi.la -libhidapi_la_SOURCES = hid.c -libhidapi_la_LDFLAGS = $(LTLDFLAGS) -libhidapi_la_LIBADD = $(LIBS_LIBUSB) -endif - -hdrdir = $(includedir)/hidapi -hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h - -EXTRA_DIST = Makefile-manual diff --git a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.freebsd b/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.freebsd deleted file mode 100644 index 5e69e77..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.freebsd +++ /dev/null @@ -1,46 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: hidtest libs - -libs: libhidapi.so - -CC ?= cc -CFLAGS ?= -Wall -g -fPIC - -CXX ?= c++ -CXXFLAGS ?= -Wall -g - -COBJS = hid.o -CPPOBJS = ../hidtest/hidtest.o -OBJS = $(COBJS) $(CPPOBJS) -INCLUDES = -I../hidapi -I/usr/local/include -LDFLAGS = -L/usr/local/lib -LIBS = -lusb -liconv -pthread - - -# Console Test Program -hidtest: $(OBJS) - $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS) - -# Shared Libs -libhidapi.so: $(COBJS) - $(CC) $(LDFLAGS) -shared -Wl,-soname,$@.0 $^ -o $@ $(LIBS) - -# Objects -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CXXFLAGS) -c $(INCLUDES) $< -o $@ - - -clean: - rm -f $(OBJS) hidtest libhidapi.so ../hidtest/hidtest.o - -.PHONY: clean libs diff --git a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.linux b/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.linux deleted file mode 100644 index 337b556..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/libusb/Makefile.linux +++ /dev/null @@ -1,49 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: hidtest-libusb libs - -libs: libhidapi-libusb.so - -CC ?= gcc -CFLAGS ?= -Wall -g -fpic - -CXX ?= g++ -CXXFLAGS ?= -Wall -g -fpic - -LDFLAGS ?= -Wall -g - -COBJS_LIBUSB = hid.o -COBJS = $(COBJS_LIBUSB) -CPPOBJS = ../hidtest/hidtest.o -OBJS = $(COBJS) $(CPPOBJS) -LIBS_USB = `pkg-config libusb-1.0 --libs` -lrt -lpthread -LIBS = $(LIBS_USB) -INCLUDES ?= -I../hidapi `pkg-config libusb-1.0 --cflags` - - -# Console Test Program -hidtest-libusb: $(COBJS_LIBUSB) $(CPPOBJS) - $(CXX) $(LDFLAGS) $^ $(LIBS_USB) -o $@ - -# Shared Libs -libhidapi-libusb.so: $(COBJS_LIBUSB) - $(CC) $(LDFLAGS) $(LIBS_USB) -shared -fpic -Wl,-soname,$@.0 $^ -o $@ - -# Objects -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CXXFLAGS) -c $(INCLUDES) $< -o $@ - - -clean: - rm -f $(OBJS) hidtest-libusb libhidapi-libusb.so ../hidtest/hidtest.o - -.PHONY: clean libs diff --git a/Source/3rdParty/SDL2/src/hidapi/libusb/hid.c b/Source/3rdParty/SDL2/src/hidapi/libusb/hid.c deleted file mode 100644 index 17378ff..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/libusb/hid.c +++ /dev/null @@ -1,1620 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - Linux Version - 6/2/2010 - Libusb Version - 8/13/2010 - FreeBSD Version - 11/1/2011 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ -#include "../../SDL_internal.h" - -#ifdef SDL_JOYSTICK_HIDAPI - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE /* needed for wcsdup() before glibc 2.10 */ -#endif - -/* C */ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <ctype.h> -#include <locale.h> -#include <errno.h> - -/* Unix */ -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <sys/utsname.h> -#include <fcntl.h> -#include <pthread.h> -#include <wchar.h> - -/* GNU / LibUSB */ -#include <libusb.h> -#ifndef __ANDROID__ -#include <iconv.h> -#endif - -#include "hidapi.h" - -#ifdef NAMESPACE -namespace NAMESPACE -{ -#endif - -#ifdef __ANDROID__ - -/* Barrier implementation because Android/Bionic don't have pthread_barrier. - This implementation came from Brent Priddy and was posted on - StackOverflow. It is used with his permission. */ -typedef int pthread_barrierattr_t; -typedef struct pthread_barrier { - pthread_mutex_t mutex; - pthread_cond_t cond; - int count; - int trip_count; -} pthread_barrier_t; - -static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) -{ - if(count == 0) { - errno = EINVAL; - return -1; - } - - if(pthread_mutex_init(&barrier->mutex, 0) < 0) { - return -1; - } - if(pthread_cond_init(&barrier->cond, 0) < 0) { - pthread_mutex_destroy(&barrier->mutex); - return -1; - } - barrier->trip_count = count; - barrier->count = 0; - - return 0; -} - -static int pthread_barrier_destroy(pthread_barrier_t *barrier) -{ - pthread_cond_destroy(&barrier->cond); - pthread_mutex_destroy(&barrier->mutex); - return 0; -} - -static int pthread_barrier_wait(pthread_barrier_t *barrier) -{ - pthread_mutex_lock(&barrier->mutex); - ++(barrier->count); - if(barrier->count >= barrier->trip_count) - { - barrier->count = 0; - pthread_cond_broadcast(&barrier->cond); - pthread_mutex_unlock(&barrier->mutex); - return 1; - } - else - { - pthread_cond_wait(&barrier->cond, &(barrier->mutex)); - pthread_mutex_unlock(&barrier->mutex); - return 0; - } -} - -#endif - -#if defined(__cplusplus) && !defined(NAMESPACE) -extern "C" { -#endif - -#ifdef DEBUG_PRINTF -#define LOG(...) fprintf(stderr, __VA_ARGS__) -#else -#define LOG(...) do {} while (0) -#endif - -#ifndef __FreeBSD__ -#define DETACH_KERNEL_DRIVER -#endif - -/* Uncomment to enable the retrieval of Usage and Usage Page in -hid_enumerate(). Warning, on platforms different from FreeBSD -this is very invasive as it requires the detach -and re-attach of the kernel driver. See comments inside hid_enumerate(). -libusb HIDAPI programs are encouraged to use the interface number -instead to differentiate between interfaces on a composite HID device. */ -/*#define INVASIVE_GET_USAGE*/ - -/* Linked List of input reports received from the device. */ -struct input_report { - uint8_t *data; - size_t len; - struct input_report *next; -}; - - -struct hid_device_ { - /* Handle to the actual device. */ - libusb_device_handle *device_handle; - - /* Endpoint information */ - int input_endpoint; - int output_endpoint; - int input_ep_max_packet_size; - - /* The interface number of the HID */ - int interface; - - /* Indexes of Strings */ - int manufacturer_index; - int product_index; - int serial_index; - - /* Whether blocking reads are used */ - int blocking; /* boolean */ - - /* Read thread objects */ - pthread_t thread; - pthread_mutex_t mutex; /* Protects input_reports */ - pthread_cond_t condition; - pthread_barrier_t barrier; /* Ensures correct startup sequence */ - int shutdown_thread; - int cancelled; - struct libusb_transfer *transfer; - - /* List of received input reports. */ - struct input_report *input_reports; -}; - -static libusb_context *usb_context = NULL; - -uint16_t get_usb_code_for_current_locale(void); -static int return_data(hid_device *dev, unsigned char *data, size_t length); - -static hid_device *new_hid_device(void) -{ - hid_device *dev = (hid_device *)calloc(1, sizeof(hid_device)); - dev->blocking = 1; - - pthread_mutex_init(&dev->mutex, NULL); - pthread_cond_init(&dev->condition, NULL); - pthread_barrier_init(&dev->barrier, NULL, 2); - - return dev; -} - -static void free_hid_device(hid_device *dev) -{ - /* Clean up the thread objects */ - pthread_barrier_destroy(&dev->barrier); - pthread_cond_destroy(&dev->condition); - pthread_mutex_destroy(&dev->mutex); - - /* Free the device itself */ - free(dev); -} - -#if 0 -/*TODO: Implement this funciton on hidapi/libusb.. */ -static void register_error(hid_device *device, const char *op) -{ - -} -#endif - -#ifdef INVASIVE_GET_USAGE -/* Get bytes from a HID Report Descriptor. - Only call with a num_bytes of 0, 1, 2, or 4. */ -static uint32_t get_bytes(uint8_t *rpt, size_t len, size_t num_bytes, size_t cur) -{ - /* Return if there aren't enough bytes. */ - if (cur + num_bytes >= len) - return 0; - - if (num_bytes == 0) - return 0; - else if (num_bytes == 1) { - return rpt[cur+1]; - } - else if (num_bytes == 2) { - return (rpt[cur+2] * 256 + rpt[cur+1]); - } - else if (num_bytes == 4) { - return (rpt[cur+4] * 0x01000000 + - rpt[cur+3] * 0x00010000 + - rpt[cur+2] * 0x00000100 + - rpt[cur+1] * 0x00000001); - } - else - return 0; -} - -/* Retrieves the device's Usage Page and Usage from the report - descriptor. The algorithm is simple, as it just returns the first - Usage and Usage Page that it finds in the descriptor. - The return value is 0 on success and -1 on failure. */ -static int get_usage(uint8_t *report_descriptor, size_t size, - unsigned short *usage_page, unsigned short *usage) -{ - unsigned int i = 0; - int size_code; - int data_len, key_size; - int usage_found = 0, usage_page_found = 0; - - while (i < size) { - int key = report_descriptor[i]; - int key_cmd = key & 0xfc; - - //printf("key: %02hhx\n", key); - - if ((key & 0xf0) == 0xf0) { - /* This is a Long Item. The next byte contains the - length of the data section (value) for this key. - See the HID specification, version 1.11, section - 6.2.2.3, titled "Long Items." */ - if (i+1 < size) - data_len = report_descriptor[i+1]; - else - data_len = 0; /* malformed report */ - key_size = 3; - } - else { - /* This is a Short Item. The bottom two bits of the - key contain the size code for the data section - (value) for this key. Refer to the HID - specification, version 1.11, section 6.2.2.2, - titled "Short Items." */ - size_code = key & 0x3; - switch (size_code) { - case 0: - case 1: - case 2: - data_len = size_code; - break; - case 3: - data_len = 4; - break; - default: - /* Can't ever happen since size_code is & 0x3 */ - data_len = 0; - break; - }; - key_size = 1; - } - - if (key_cmd == 0x4) { - *usage_page = get_bytes(report_descriptor, size, data_len, i); - usage_page_found = 1; - //printf("Usage Page: %x\n", (uint32_t)*usage_page); - } - if (key_cmd == 0x8) { - *usage = get_bytes(report_descriptor, size, data_len, i); - usage_found = 1; - //printf("Usage: %x\n", (uint32_t)*usage); - } - - if (usage_page_found && usage_found) - return 0; /* success */ - - /* Skip over this key and it's associated data */ - i += data_len + key_size; - } - - return -1; /* failure */ -} -#endif /* INVASIVE_GET_USAGE */ - -#if defined(__FreeBSD__) && __FreeBSD__ < 10 -/* The libusb version included in FreeBSD < 10 doesn't have this function. In - mainline libusb, it's inlined in libusb.h. This function will bear a striking - resemblance to that one, because there's about one way to code it. - - Note that the data parameter is Unicode in UTF-16LE encoding. - Return value is the number of bytes in data, or LIBUSB_ERROR_*. - */ -static inline int libusb_get_string_descriptor(libusb_device_handle *dev, - uint8_t descriptor_index, uint16_t lang_id, - unsigned char *data, int length) -{ - return libusb_control_transfer(dev, - LIBUSB_ENDPOINT_IN | 0x0, /* Endpoint 0 IN */ - LIBUSB_REQUEST_GET_DESCRIPTOR, - (LIBUSB_DT_STRING << 8) | descriptor_index, - lang_id, data, (uint16_t) length, 1000); -} - -#endif - - -/* Get the first language the device says it reports. This comes from - USB string #0. */ -static uint16_t get_first_language(libusb_device_handle *dev) -{ - uint16_t buf[32]; - int len; - - /* Get the string from libusb. */ - len = libusb_get_string_descriptor(dev, - 0x0, /* String ID */ - 0x0, /* Language */ - (unsigned char*)buf, - sizeof(buf)); - if (len < 4) - return 0x0; - - return buf[1]; /* First two bytes are len and descriptor type. */ -} - -static int is_language_supported(libusb_device_handle *dev, uint16_t lang) -{ - uint16_t buf[32]; - int len; - int i; - - /* Get the string from libusb. */ - len = libusb_get_string_descriptor(dev, - 0x0, /* String ID */ - 0x0, /* Language */ - (unsigned char*)buf, - sizeof(buf)); - if (len < 4) - return 0x0; - - - len /= 2; /* language IDs are two-bytes each. */ - /* Start at index 1 because there are two bytes of protocol data. */ - for (i = 1; i < len; i++) { - if (buf[i] == lang) - return 1; - } - - return 0; -} - - -/* This function returns a newly allocated wide string containing the USB - device string numbered by the index. The returned string must be freed - by using free(). */ -static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx) -{ - char buf[512]; - int len; - wchar_t *str = NULL; - -#ifndef __ANDROID__ /* we don't use iconv on Android */ - wchar_t wbuf[256]; - /* iconv variables */ - iconv_t ic; - size_t inbytes; - size_t outbytes; - size_t res; -#ifdef __FreeBSD__ - const char *inptr; -#else - char *inptr; -#endif - char *outptr; -#endif - - /* Determine which language to use. */ - uint16_t lang; - lang = get_usb_code_for_current_locale(); - if (!is_language_supported(dev, lang)) - lang = get_first_language(dev); - - /* Get the string from libusb. */ - len = libusb_get_string_descriptor(dev, - idx, - lang, - (unsigned char*)buf, - sizeof(buf)); - if (len < 0) - return NULL; - -#ifdef __ANDROID__ - - /* Bionic does not have iconv support nor wcsdup() function, so it - has to be done manually. The following code will only work for - code points that can be represented as a single UTF-16 character, - and will incorrectly convert any code points which require more - than one UTF-16 character. - - Skip over the first character (2-bytes). */ - len -= 2; - str = malloc((len / 2 + 1) * sizeof(wchar_t)); - int i; - for (i = 0; i < len / 2; i++) { - str[i] = buf[i * 2 + 2] | (buf[i * 2 + 3] << 8); - } - str[len / 2] = 0x00000000; - -#else - - /* buf does not need to be explicitly NULL-terminated because - it is only passed into iconv() which does not need it. */ - - /* Initialize iconv. */ - ic = iconv_open("WCHAR_T", "UTF-16LE"); - if (ic == (iconv_t)-1) { - LOG("iconv_open() failed\n"); - return NULL; - } - - /* Convert to native wchar_t (UTF-32 on glibc/BSD systems). - Skip the first character (2-bytes). */ - inptr = buf+2; - inbytes = len-2; - outptr = (char*) wbuf; - outbytes = sizeof(wbuf); - res = iconv(ic, &inptr, &inbytes, &outptr, &outbytes); - if (res == (size_t)-1) { - LOG("iconv() failed\n"); - goto err; - } - - /* Write the terminating NULL. */ - wbuf[sizeof(wbuf)/sizeof(wbuf[0])-1] = 0x00000000; - if (outbytes >= sizeof(wbuf[0])) - *((wchar_t*)outptr) = 0x00000000; - - /* Allocate and copy the string. */ - str = wcsdup(wbuf); - -err: - iconv_close(ic); - -#endif - - return str; -} - -static char *make_path(libusb_device *dev, int interface_number) -{ - char str[64]; - snprintf(str, sizeof(str), "%04x:%04x:%02x", - libusb_get_bus_number(dev), - libusb_get_device_address(dev), - interface_number); - str[sizeof(str)-1] = '\0'; - - return strdup(str); -} - - -int HID_API_EXPORT hid_init(void) -{ - if (!usb_context) { - const char *locale; - - /* Init Libusb */ - if (libusb_init(&usb_context)) - return -1; - - /* Set the locale if it's not set. */ - locale = setlocale(LC_CTYPE, NULL); - if (!locale) - setlocale(LC_CTYPE, ""); - } - - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ - if (usb_context) { - libusb_exit(usb_context); - usb_context = NULL; - } - - return 0; -} - -static int is_xbox360(unsigned short vendor_id, const struct libusb_interface_descriptor *intf_desc) -{ - static const int XB360_IFACE_SUBCLASS = 93; - static const int XB360_IFACE_PROTOCOL = 1; /* Wired only */ - static const int SUPPORTED_VENDORS[] = { - 0x0079, /* GPD Win 2 */ - 0x044f, /* Thrustmaster */ - 0x045e, /* Microsoft */ - 0x046d, /* Logitech */ - 0x056e, /* Elecom */ - 0x06a3, /* Saitek */ - 0x0738, /* Mad Catz */ - 0x07ff, /* Mad Catz */ - 0x0e6f, /* Unknown */ - 0x0f0d, /* Hori */ - 0x11c9, /* Nacon */ - 0x12ab, /* Unknown */ - 0x1430, /* RedOctane */ - 0x146b, /* BigBen */ - 0x1532, /* Razer Sabertooth */ - 0x15e4, /* Numark */ - 0x162e, /* Joytech */ - 0x1689, /* Razer Onza */ - 0x1bad, /* Harmonix */ - 0x24c6, /* PowerA */ - }; - - if (intf_desc->bInterfaceNumber == 0 && - intf_desc->bInterfaceClass == LIBUSB_CLASS_VENDOR_SPEC && - intf_desc->bInterfaceSubClass == XB360_IFACE_SUBCLASS && - intf_desc->bInterfaceProtocol == XB360_IFACE_PROTOCOL) { - int i; - for (i = 0; i < sizeof(SUPPORTED_VENDORS)/sizeof(SUPPORTED_VENDORS[0]); ++i) { - if (vendor_id == SUPPORTED_VENDORS[i]) { - return 1; - } - } - } - return 0; -} - -static int is_xboxone(unsigned short vendor_id, const struct libusb_interface_descriptor *intf_desc) -{ - static const int XB1_IFACE_SUBCLASS = 71; - static const int XB1_IFACE_PROTOCOL = 208; - static const int SUPPORTED_VENDORS[] = { - 0x045e, /* Microsoft */ - 0x0738, /* Mad Catz */ - 0x0e6f, /* Unknown */ - 0x0f0d, /* Hori */ - 0x1532, /* Razer Wildcat */ - 0x24c6, /* PowerA */ - }; - - if (intf_desc->bInterfaceNumber == 0 && - intf_desc->bInterfaceClass == LIBUSB_CLASS_VENDOR_SPEC && - intf_desc->bInterfaceSubClass == XB1_IFACE_SUBCLASS && - intf_desc->bInterfaceProtocol == XB1_IFACE_PROTOCOL) { - int i; - for (i = 0; i < sizeof(SUPPORTED_VENDORS)/sizeof(SUPPORTED_VENDORS[0]); ++i) { - if (vendor_id == SUPPORTED_VENDORS[i]) { - return 1; - } - } - } - return 0; -} - -static int should_enumerate_interface(unsigned short vendor_id, const struct libusb_interface_descriptor *intf_desc) -{ - if (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) - return 1; - - /* Also enumerate Xbox 360 controllers */ - if (is_xbox360(vendor_id, intf_desc)) - { - /* hid_write() to Xbox 360 controllers doesn't seem to work on Linux: - - xpad 1-2:1.0: xpad_try_sending_next_out_packet - usb_submit_urb failed with result -2 - Xbox 360 controller support is good on Linux anyway, so we'll ignore this for now. - return 1; - */ - } - - /* Also enumerate Xbox One controllers */ - if (is_xboxone(vendor_id, intf_desc)) - return 1; - - return 0; -} - -struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - libusb_device **devs; - libusb_device *dev; - libusb_device_handle *handle; - ssize_t num_devs; - int i = 0; - - struct hid_device_info *root = NULL; /* return object */ - struct hid_device_info *cur_dev = NULL; - - if(hid_init() < 0) - return NULL; - - num_devs = libusb_get_device_list(usb_context, &devs); - if (num_devs < 0) - return NULL; - while ((dev = devs[i++]) != NULL) { - struct libusb_device_descriptor desc; - struct libusb_config_descriptor *conf_desc = NULL; - int j, k; - int interface_num = 0; - - int res = libusb_get_device_descriptor(dev, &desc); - unsigned short dev_vid = desc.idVendor; - unsigned short dev_pid = desc.idProduct; - - res = libusb_get_active_config_descriptor(dev, &conf_desc); - if (res < 0) - libusb_get_config_descriptor(dev, 0, &conf_desc); - if (conf_desc) { - for (j = 0; j < conf_desc->bNumInterfaces; j++) { - const struct libusb_interface *intf = &conf_desc->interface[j]; - for (k = 0; k < intf->num_altsetting; k++) { - const struct libusb_interface_descriptor *intf_desc; - intf_desc = &intf->altsetting[k]; - if (should_enumerate_interface(dev_vid, intf_desc)) { - interface_num = intf_desc->bInterfaceNumber; - - /* Check the VID/PID against the arguments */ - if ((vendor_id == 0x0 || vendor_id == dev_vid) && - (product_id == 0x0 || product_id == dev_pid)) { - struct hid_device_info *tmp; - - /* VID/PID match. Create the record. */ - tmp = (struct hid_device_info *)calloc(1, sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - cur_dev = tmp; - - /* Fill out the record */ - cur_dev->next = NULL; - cur_dev->path = make_path(dev, interface_num); - - res = libusb_open(dev, &handle); - - if (res >= 0) { - /* Serial Number */ - if (desc.iSerialNumber > 0) - cur_dev->serial_number = - get_usb_string(handle, desc.iSerialNumber); - - /* Manufacturer and Product strings */ - if (desc.iManufacturer > 0) - cur_dev->manufacturer_string = - get_usb_string(handle, desc.iManufacturer); - if (desc.iProduct > 0) - cur_dev->product_string = - get_usb_string(handle, desc.iProduct); - -#ifdef INVASIVE_GET_USAGE -{ - /* - This section is removed because it is too - invasive on the system. Getting a Usage Page - and Usage requires parsing the HID Report - descriptor. Getting a HID Report descriptor - involves claiming the interface. Claiming the - interface involves detaching the kernel driver. - Detaching the kernel driver is hard on the system - because it will unclaim interfaces (if another - app has them claimed) and the re-attachment of - the driver will sometimes change /dev entry names. - It is for these reasons that this section is - #if 0. For composite devices, use the interface - field in the hid_device_info struct to distinguish - between interfaces. */ - unsigned char data[256]; -#ifdef DETACH_KERNEL_DRIVER - int detached = 0; - /* Usage Page and Usage */ - res = libusb_kernel_driver_active(handle, interface_num); - if (res == 1) { - res = libusb_detach_kernel_driver(handle, interface_num); - if (res < 0) - LOG("Couldn't detach kernel driver, even though a kernel driver was attached."); - else - detached = 1; - } -#endif - res = libusb_claim_interface(handle, interface_num); - if (res >= 0) { - /* Get the HID Report Descriptor. */ - res = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_INTERFACE, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_REPORT << 8)|interface_num, 0, data, sizeof(data), 5000); - if (res >= 0) { - unsigned short page=0, usage=0; - /* Parse the usage and usage page - out of the report descriptor. */ - get_usage(data, res, &page, &usage); - cur_dev->usage_page = page; - cur_dev->usage = usage; - } - else - LOG("libusb_control_transfer() for getting the HID report failed with %d\n", res); - - /* Release the interface */ - res = libusb_release_interface(handle, interface_num); - if (res < 0) - LOG("Can't release the interface.\n"); - } - else - LOG("Can't claim interface %d\n", res); -#ifdef DETACH_KERNEL_DRIVER - /* Re-attach kernel driver if necessary. */ - if (detached) { - res = libusb_attach_kernel_driver(handle, interface_num); - if (res < 0) - LOG("Couldn't re-attach kernel driver.\n"); - } -#endif -} -#endif /* INVASIVE_GET_USAGE */ - - libusb_close(handle); - } - /* VID/PID */ - cur_dev->vendor_id = dev_vid; - cur_dev->product_id = dev_pid; - - /* Release Number */ - cur_dev->release_number = desc.bcdDevice; - - /* Interface Number */ - cur_dev->interface_number = interface_num; - } - } - } /* altsettings */ - } /* interfaces */ - libusb_free_config_descriptor(conf_desc); - } - } - - libusb_free_device_list(devs, 1); - - return root; -} - -void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) -{ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - -hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device *handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (cur_dev->serial_number && - wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open, 0); - } - - hid_free_enumeration(devs); - - return handle; -} - -static void read_callback(struct libusb_transfer *transfer) -{ - hid_device *dev = (hid_device *)transfer->user_data; - int res; - - if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { - - struct input_report *rpt = (struct input_report *)malloc(sizeof(*rpt)); - rpt->data = (uint8_t *)malloc(transfer->actual_length); - memcpy(rpt->data, transfer->buffer, transfer->actual_length); - rpt->len = transfer->actual_length; - rpt->next = NULL; - - pthread_mutex_lock(&dev->mutex); - - /* Attach the new report object to the end of the list. */ - if (dev->input_reports == NULL) { - /* The list is empty. Put it at the root. */ - dev->input_reports = rpt; - pthread_cond_signal(&dev->condition); - } - else { - /* Find the end of the list and attach. */ - struct input_report *cur = dev->input_reports; - int num_queued = 0; - while (cur->next != NULL) { - cur = cur->next; - num_queued++; - } - cur->next = rpt; - - /* Pop one off if we've reached 30 in the queue. This - way we don't grow forever if the user never reads - anything from the device. */ - if (num_queued > 30) { - return_data(dev, NULL, 0); - } - } - pthread_mutex_unlock(&dev->mutex); - } - else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { - dev->shutdown_thread = 1; - dev->cancelled = 1; - return; - } - else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) { - dev->shutdown_thread = 1; - dev->cancelled = 1; - return; - } - else if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) { - //LOG("Timeout (normal)\n"); - } - else { - LOG("Unknown transfer code: %d\n", transfer->status); - } - - /* Re-submit the transfer object. */ - res = libusb_submit_transfer(transfer); - if (res != 0) { - LOG("Unable to submit URB. libusb error code: %d\n", res); - dev->shutdown_thread = 1; - dev->cancelled = 1; - } -} - - -static void *read_thread(void *param) -{ - hid_device *dev = (hid_device *)param; - unsigned char *buf; - const size_t length = dev->input_ep_max_packet_size; - - /* Set up the transfer object. */ - buf = (unsigned char *)malloc(length); - dev->transfer = libusb_alloc_transfer(0); - libusb_fill_interrupt_transfer(dev->transfer, - dev->device_handle, - dev->input_endpoint, - buf, - length, - read_callback, - dev, - 5000/*timeout*/); - - /* Make the first submission. Further submissions are made - from inside read_callback() */ - libusb_submit_transfer(dev->transfer); - - /* Notify the main thread that the read thread is up and running. */ - pthread_barrier_wait(&dev->barrier); - - /* Handle all the events. */ - while (!dev->shutdown_thread) { - int res; - res = libusb_handle_events(usb_context); - if (res < 0) { - /* There was an error. */ - LOG("read_thread(): libusb reports error # %d\n", res); - - /* Break out of this loop only on fatal error.*/ - if (res != LIBUSB_ERROR_BUSY && - res != LIBUSB_ERROR_TIMEOUT && - res != LIBUSB_ERROR_OVERFLOW && - res != LIBUSB_ERROR_INTERRUPTED) { - break; - } - } - } - - /* Cancel any transfer that may be pending. This call will fail - if no transfers are pending, but that's OK. */ - libusb_cancel_transfer(dev->transfer); - - while (!dev->cancelled) - libusb_handle_events_completed(usb_context, &dev->cancelled); - - /* Now that the read thread is stopping, Wake any threads which are - waiting on data (in hid_read_timeout()). Do this under a mutex to - make sure that a thread which is about to go to sleep waiting on - the condition actually will go to sleep before the condition is - signaled. */ - pthread_mutex_lock(&dev->mutex); - pthread_cond_broadcast(&dev->condition); - pthread_mutex_unlock(&dev->mutex); - - /* The dev->transfer->buffer and dev->transfer objects are cleaned up - in hid_close(). They are not cleaned up here because this thread - could end either due to a disconnect or due to a user - call to hid_close(). In both cases the objects can be safely - cleaned up after the call to pthread_join() (in hid_close()), but - since hid_close() calls libusb_cancel_transfer(), on these objects, - they can not be cleaned up here. */ - - return NULL; -} - - -hid_device * HID_API_EXPORT hid_open_path(const char *path, int bExclusive) -{ - hid_device *dev = NULL; - - libusb_device **devs; - libusb_device *usb_dev; - int res; - int d = 0; - int good_open = 0; - - if(hid_init() < 0) - return NULL; - - dev = new_hid_device(); - - libusb_get_device_list(usb_context, &devs); - while ((usb_dev = devs[d++]) != NULL) { - struct libusb_device_descriptor desc; - struct libusb_config_descriptor *conf_desc = NULL; - int i,j,k; - libusb_get_device_descriptor(usb_dev, &desc); - - if (libusb_get_active_config_descriptor(usb_dev, &conf_desc) < 0) - continue; - for (j = 0; j < conf_desc->bNumInterfaces; j++) { - const struct libusb_interface *intf = &conf_desc->interface[j]; - for (k = 0; k < intf->num_altsetting; k++) { - const struct libusb_interface_descriptor *intf_desc; - intf_desc = &intf->altsetting[k]; - if (should_enumerate_interface(desc.idVendor, intf_desc)) { - char *dev_path = make_path(usb_dev, intf_desc->bInterfaceNumber); - if (!strcmp(dev_path, path)) { - /* Matched Paths. Open this device */ - - /* OPEN HERE */ - res = libusb_open(usb_dev, &dev->device_handle); - if (res < 0) { - LOG("can't open device\n"); - free(dev_path); - break; - } - good_open = 1; -#ifdef DETACH_KERNEL_DRIVER - /* Detach the kernel driver, but only if the - device is managed by the kernel */ - if (libusb_kernel_driver_active(dev->device_handle, intf_desc->bInterfaceNumber) == 1) { - res = libusb_detach_kernel_driver(dev->device_handle, intf_desc->bInterfaceNumber); - if (res < 0) { - libusb_close(dev->device_handle); - LOG("Unable to detach Kernel Driver\n"); - free(dev_path); - good_open = 0; - break; - } - } -#endif - res = libusb_claim_interface(dev->device_handle, intf_desc->bInterfaceNumber); - if (res < 0) { - LOG("can't claim interface %d: %d\n", intf_desc->bInterfaceNumber, res); - free(dev_path); - libusb_close(dev->device_handle); - good_open = 0; - break; - } - - /* Store off the string descriptor indexes */ - dev->manufacturer_index = desc.iManufacturer; - dev->product_index = desc.iProduct; - dev->serial_index = desc.iSerialNumber; - - /* Store off the interface number */ - dev->interface = intf_desc->bInterfaceNumber; - - /* Find the INPUT and OUTPUT endpoints. An - OUTPUT endpoint is not required. */ - for (i = 0; i < intf_desc->bNumEndpoints; i++) { - const struct libusb_endpoint_descriptor *ep - = &intf_desc->endpoint[i]; - - /* Determine the type and direction of this - endpoint. */ - int is_interrupt = - (ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) - == LIBUSB_TRANSFER_TYPE_INTERRUPT; - int is_output = - (ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) - == LIBUSB_ENDPOINT_OUT; - int is_input = - (ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) - == LIBUSB_ENDPOINT_IN; - - /* Decide whether to use it for input or output. */ - if (dev->input_endpoint == 0 && - is_interrupt && is_input) { - /* Use this endpoint for INPUT */ - dev->input_endpoint = ep->bEndpointAddress; - dev->input_ep_max_packet_size = ep->wMaxPacketSize; - } - if (dev->output_endpoint == 0 && - is_interrupt && is_output) { - /* Use this endpoint for OUTPUT */ - dev->output_endpoint = ep->bEndpointAddress; - } - } - - pthread_create(&dev->thread, NULL, read_thread, dev); - - /* Wait here for the read thread to be initialized. */ - pthread_barrier_wait(&dev->barrier); - - } - free(dev_path); - } - } - } - libusb_free_config_descriptor(conf_desc); - - } - - libusb_free_device_list(devs, 1); - - /* If we have a good handle, return it. */ - if (good_open) { - return dev; - } - else { - /* Unable to open any devices. */ - free_hid_device(dev); - return NULL; - } -} - - -int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - int res; - int report_number = data[0]; - int skipped_report_id = 0; - - if (report_number == 0x0) { - data++; - length--; - skipped_report_id = 1; - } - - - if (dev->output_endpoint <= 0) { - /* No interrupt out endpoint. Use the Control Endpoint */ - res = libusb_control_transfer(dev->device_handle, - LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT, - 0x09/*HID Set_Report*/, - (2/*HID output*/ << 8) | report_number, - dev->interface, - (unsigned char *)data, length, - 1000/*timeout millis*/); - - if (res < 0) - return -1; - - if (skipped_report_id) - length++; - - return length; - } - else { - /* Use the interrupt out endpoint */ - int actual_length; - res = libusb_interrupt_transfer(dev->device_handle, - dev->output_endpoint, - (unsigned char*)data, - length, - &actual_length, 1000); - - if (res < 0) - return -1; - - if (skipped_report_id) - actual_length++; - - return actual_length; - } -} - -/* Helper function, to simplify hid_read(). - This should be called with dev->mutex locked. */ -static int return_data(hid_device *dev, unsigned char *data, size_t length) -{ - /* Copy the data out of the linked list item (rpt) into the - return buffer (data), and delete the liked list item. */ - struct input_report *rpt = dev->input_reports; - size_t len = (length < rpt->len)? length: rpt->len; - if (data && len > 0) - memcpy(data, rpt->data, len); - dev->input_reports = rpt->next; - free(rpt->data); - free(rpt); - return len; -} - -static void cleanup_mutex(void *param) -{ - hid_device *dev = (hid_device *)param; - pthread_mutex_unlock(&dev->mutex); -} - - -int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - int bytes_read = -1; - -#if 0 - int transferred; - int res = libusb_interrupt_transfer(dev->device_handle, dev->input_endpoint, data, length, &transferred, 5000); - LOG("transferred: %d\n", transferred); - return transferred; -#endif - - pthread_mutex_lock(&dev->mutex); - pthread_cleanup_push(&cleanup_mutex, dev); - - /* There's an input report queued up. Return it. */ - if (dev->input_reports) { - /* Return the first one */ - bytes_read = return_data(dev, data, length); - goto ret; - } - - if (dev->shutdown_thread) { - /* This means the device has been disconnected. - An error code of -1 should be returned. */ - bytes_read = -1; - goto ret; - } - - if (milliseconds == -1) { - /* Blocking */ - while (!dev->input_reports && !dev->shutdown_thread) { - pthread_cond_wait(&dev->condition, &dev->mutex); - } - if (dev->input_reports) { - bytes_read = return_data(dev, data, length); - } - } - else if (milliseconds > 0) { - /* Non-blocking, but called with timeout. */ - int res; - struct timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_sec += milliseconds / 1000; - ts.tv_nsec += (milliseconds % 1000) * 1000000; - if (ts.tv_nsec >= 1000000000L) { - ts.tv_sec++; - ts.tv_nsec -= 1000000000L; - } - - while (!dev->input_reports && !dev->shutdown_thread) { - res = pthread_cond_timedwait(&dev->condition, &dev->mutex, &ts); - if (res == 0) { - if (dev->input_reports) { - bytes_read = return_data(dev, data, length); - break; - } - - /* If we're here, there was a spurious wake up - or the read thread was shutdown. Run the - loop again (ie: don't break). */ - } - else if (res == ETIMEDOUT) { - /* Timed out. */ - bytes_read = 0; - break; - } - else { - /* Error. */ - bytes_read = -1; - break; - } - } - } - else { - /* Purely non-blocking */ - bytes_read = 0; - } - -ret: - pthread_mutex_unlock(&dev->mutex); - pthread_cleanup_pop(0); - - return bytes_read; -} - -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, dev->blocking ? -1 : 0); -} - -int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) -{ - dev->blocking = !nonblock; - - return 0; -} - - -int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - int res = -1; - int skipped_report_id = 0; - int report_number = data[0]; - - if (report_number == 0x0) { - data++; - length--; - skipped_report_id = 1; - } - - res = libusb_control_transfer(dev->device_handle, - LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT, - 0x09/*HID set_report*/, - (3/*HID feature*/ << 8) | report_number, - dev->interface, - (unsigned char *)data, length, - 1000/*timeout millis*/); - - if (res < 0) - return -1; - - /* Account for the report ID */ - if (skipped_report_id) - length++; - - return length; -} - -int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - int res = -1; - int skipped_report_id = 0; - int report_number = data[0]; - - if (report_number == 0x0) { - /* Offset the return buffer by 1, so that the report ID - will remain in byte 0. */ - data++; - length--; - skipped_report_id = 1; - } - res = libusb_control_transfer(dev->device_handle, - LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN, - 0x01/*HID get_report*/, - (3/*HID feature*/ << 8) | report_number, - dev->interface, - (unsigned char *)data, length, - 1000/*timeout millis*/); - - if (res < 0) - return -1; - - if (skipped_report_id) - res++; - - return res; -} - - -void HID_API_EXPORT hid_close(hid_device *dev) -{ - if (!dev) - return; - - /* Cause read_thread() to stop. */ - dev->shutdown_thread = 1; - libusb_cancel_transfer(dev->transfer); - - /* Wait for read_thread() to end. */ - pthread_join(dev->thread, NULL); - - /* Clean up the Transfer objects allocated in read_thread(). */ - free(dev->transfer->buffer); - libusb_free_transfer(dev->transfer); - - /* release the interface */ - libusb_release_interface(dev->device_handle, dev->interface); - - /* Close the handle */ - libusb_close(dev->device_handle); - - /* Clear out the queue of received reports. */ - pthread_mutex_lock(&dev->mutex); - while (dev->input_reports) { - return_data(dev, NULL, 0); - } - pthread_mutex_unlock(&dev->mutex); - - free_hid_device(dev); -} - - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return hid_get_indexed_string(dev, dev->manufacturer_index, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return hid_get_indexed_string(dev, dev->product_index, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return hid_get_indexed_string(dev, dev->serial_index, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - wchar_t *str; - - str = get_usb_string(dev->device_handle, string_index); - if (str) { - wcsncpy(string, str, maxlen); - string[maxlen-1] = L'\0'; - free(str); - return 0; - } - else - return -1; -} - - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - return NULL; -} - - -struct lang_map_entry { - const char *name; - const char *string_code; - uint16_t usb_code; -}; - -#define LANG(name,code,usb_code) { name, code, usb_code } -static struct lang_map_entry lang_map[] = { - LANG("Afrikaans", "af", 0x0436), - LANG("Albanian", "sq", 0x041C), - LANG("Arabic - United Arab Emirates", "ar_ae", 0x3801), - LANG("Arabic - Bahrain", "ar_bh", 0x3C01), - LANG("Arabic - Algeria", "ar_dz", 0x1401), - LANG("Arabic - Egypt", "ar_eg", 0x0C01), - LANG("Arabic - Iraq", "ar_iq", 0x0801), - LANG("Arabic - Jordan", "ar_jo", 0x2C01), - LANG("Arabic - Kuwait", "ar_kw", 0x3401), - LANG("Arabic - Lebanon", "ar_lb", 0x3001), - LANG("Arabic - Libya", "ar_ly", 0x1001), - LANG("Arabic - Morocco", "ar_ma", 0x1801), - LANG("Arabic - Oman", "ar_om", 0x2001), - LANG("Arabic - Qatar", "ar_qa", 0x4001), - LANG("Arabic - Saudi Arabia", "ar_sa", 0x0401), - LANG("Arabic - Syria", "ar_sy", 0x2801), - LANG("Arabic - Tunisia", "ar_tn", 0x1C01), - LANG("Arabic - Yemen", "ar_ye", 0x2401), - LANG("Armenian", "hy", 0x042B), - LANG("Azeri - Latin", "az_az", 0x042C), - LANG("Azeri - Cyrillic", "az_az", 0x082C), - LANG("Basque", "eu", 0x042D), - LANG("Belarusian", "be", 0x0423), - LANG("Bulgarian", "bg", 0x0402), - LANG("Catalan", "ca", 0x0403), - LANG("Chinese - China", "zh_cn", 0x0804), - LANG("Chinese - Hong Kong SAR", "zh_hk", 0x0C04), - LANG("Chinese - Macau SAR", "zh_mo", 0x1404), - LANG("Chinese - Singapore", "zh_sg", 0x1004), - LANG("Chinese - Taiwan", "zh_tw", 0x0404), - LANG("Croatian", "hr", 0x041A), - LANG("Czech", "cs", 0x0405), - LANG("Danish", "da", 0x0406), - LANG("Dutch - Netherlands", "nl_nl", 0x0413), - LANG("Dutch - Belgium", "nl_be", 0x0813), - LANG("English - Australia", "en_au", 0x0C09), - LANG("English - Belize", "en_bz", 0x2809), - LANG("English - Canada", "en_ca", 0x1009), - LANG("English - Caribbean", "en_cb", 0x2409), - LANG("English - Ireland", "en_ie", 0x1809), - LANG("English - Jamaica", "en_jm", 0x2009), - LANG("English - New Zealand", "en_nz", 0x1409), - LANG("English - Phillippines", "en_ph", 0x3409), - LANG("English - Southern Africa", "en_za", 0x1C09), - LANG("English - Trinidad", "en_tt", 0x2C09), - LANG("English - Great Britain", "en_gb", 0x0809), - LANG("English - United States", "en_us", 0x0409), - LANG("Estonian", "et", 0x0425), - LANG("Farsi", "fa", 0x0429), - LANG("Finnish", "fi", 0x040B), - LANG("Faroese", "fo", 0x0438), - LANG("French - France", "fr_fr", 0x040C), - LANG("French - Belgium", "fr_be", 0x080C), - LANG("French - Canada", "fr_ca", 0x0C0C), - LANG("French - Luxembourg", "fr_lu", 0x140C), - LANG("French - Switzerland", "fr_ch", 0x100C), - LANG("Gaelic - Ireland", "gd_ie", 0x083C), - LANG("Gaelic - Scotland", "gd", 0x043C), - LANG("German - Germany", "de_de", 0x0407), - LANG("German - Austria", "de_at", 0x0C07), - LANG("German - Liechtenstein", "de_li", 0x1407), - LANG("German - Luxembourg", "de_lu", 0x1007), - LANG("German - Switzerland", "de_ch", 0x0807), - LANG("Greek", "el", 0x0408), - LANG("Hebrew", "he", 0x040D), - LANG("Hindi", "hi", 0x0439), - LANG("Hungarian", "hu", 0x040E), - LANG("Icelandic", "is", 0x040F), - LANG("Indonesian", "id", 0x0421), - LANG("Italian - Italy", "it_it", 0x0410), - LANG("Italian - Switzerland", "it_ch", 0x0810), - LANG("Japanese", "ja", 0x0411), - LANG("Korean", "ko", 0x0412), - LANG("Latvian", "lv", 0x0426), - LANG("Lithuanian", "lt", 0x0427), - LANG("F.Y.R.O. Macedonia", "mk", 0x042F), - LANG("Malay - Malaysia", "ms_my", 0x043E), - LANG("Malay – Brunei", "ms_bn", 0x083E), - LANG("Maltese", "mt", 0x043A), - LANG("Marathi", "mr", 0x044E), - LANG("Norwegian - Bokml", "no_no", 0x0414), - LANG("Norwegian - Nynorsk", "no_no", 0x0814), - LANG("Polish", "pl", 0x0415), - LANG("Portuguese - Portugal", "pt_pt", 0x0816), - LANG("Portuguese - Brazil", "pt_br", 0x0416), - LANG("Raeto-Romance", "rm", 0x0417), - LANG("Romanian - Romania", "ro", 0x0418), - LANG("Romanian - Republic of Moldova", "ro_mo", 0x0818), - LANG("Russian", "ru", 0x0419), - LANG("Russian - Republic of Moldova", "ru_mo", 0x0819), - LANG("Sanskrit", "sa", 0x044F), - LANG("Serbian - Cyrillic", "sr_sp", 0x0C1A), - LANG("Serbian - Latin", "sr_sp", 0x081A), - LANG("Setsuana", "tn", 0x0432), - LANG("Slovenian", "sl", 0x0424), - LANG("Slovak", "sk", 0x041B), - LANG("Sorbian", "sb", 0x042E), - LANG("Spanish - Spain (Traditional)", "es_es", 0x040A), - LANG("Spanish - Argentina", "es_ar", 0x2C0A), - LANG("Spanish - Bolivia", "es_bo", 0x400A), - LANG("Spanish - Chile", "es_cl", 0x340A), - LANG("Spanish - Colombia", "es_co", 0x240A), - LANG("Spanish - Costa Rica", "es_cr", 0x140A), - LANG("Spanish - Dominican Republic", "es_do", 0x1C0A), - LANG("Spanish - Ecuador", "es_ec", 0x300A), - LANG("Spanish - Guatemala", "es_gt", 0x100A), - LANG("Spanish - Honduras", "es_hn", 0x480A), - LANG("Spanish - Mexico", "es_mx", 0x080A), - LANG("Spanish - Nicaragua", "es_ni", 0x4C0A), - LANG("Spanish - Panama", "es_pa", 0x180A), - LANG("Spanish - Peru", "es_pe", 0x280A), - LANG("Spanish - Puerto Rico", "es_pr", 0x500A), - LANG("Spanish - Paraguay", "es_py", 0x3C0A), - LANG("Spanish - El Salvador", "es_sv", 0x440A), - LANG("Spanish - Uruguay", "es_uy", 0x380A), - LANG("Spanish - Venezuela", "es_ve", 0x200A), - LANG("Southern Sotho", "st", 0x0430), - LANG("Swahili", "sw", 0x0441), - LANG("Swedish - Sweden", "sv_se", 0x041D), - LANG("Swedish - Finland", "sv_fi", 0x081D), - LANG("Tamil", "ta", 0x0449), - LANG("Tatar", "tt", 0X0444), - LANG("Thai", "th", 0x041E), - LANG("Turkish", "tr", 0x041F), - LANG("Tsonga", "ts", 0x0431), - LANG("Ukrainian", "uk", 0x0422), - LANG("Urdu", "ur", 0x0420), - LANG("Uzbek - Cyrillic", "uz_uz", 0x0843), - LANG("Uzbek – Latin", "uz_uz", 0x0443), - LANG("Vietnamese", "vi", 0x042A), - LANG("Xhosa", "xh", 0x0434), - LANG("Yiddish", "yi", 0x043D), - LANG("Zulu", "zu", 0x0435), - LANG(NULL, NULL, 0x0), -}; - -uint16_t get_usb_code_for_current_locale(void) -{ - char *locale; - char search_string[64]; - char *ptr; - struct lang_map_entry *lang; - - /* Get the current locale. */ - locale = setlocale(0, NULL); - if (!locale) - return 0x0; - - /* Make a copy of the current locale string. */ - strncpy(search_string, locale, sizeof(search_string)); - search_string[sizeof(search_string)-1] = '\0'; - - /* Chop off the encoding part, and make it lower case. */ - ptr = search_string; - while (*ptr) { - *ptr = tolower(*ptr); - if (*ptr == '.') { - *ptr = '\0'; - break; - } - ptr++; - } - - /* Find the entry which matches the string code of our locale. */ - lang = lang_map; - while (lang->string_code) { - if (!strcmp(lang->string_code, search_string)) { - return lang->usb_code; - } - lang++; - } - - /* There was no match. Find with just the language only. */ - /* Chop off the variant. Chop it off at the '_'. */ - ptr = search_string; - while (*ptr) { - *ptr = tolower(*ptr); - if (*ptr == '_') { - *ptr = '\0'; - break; - } - ptr++; - } - -#if 0 /* TODO: Do we need this? */ - /* Find the entry which matches the string code of our language. */ - lang = lang_map; - while (lang->string_code) { - if (!strcmp(lang->string_code, search_string)) { - return lang->usb_code; - } - lang++; - } -#endif - - /* Found nothing. */ - return 0x0; -} - -#if defined(__cplusplus) && !defined(NAMESPACE) -} -#endif - -#ifdef NAMESPACE -} -#endif - -#endif /* SDL_JOYSTICK_HIDAPI */ diff --git a/Source/3rdParty/SDL2/src/hidapi/libusb/hidusb.cpp b/Source/3rdParty/SDL2/src/hidapi/libusb/hidusb.cpp deleted file mode 100644 index 5006306..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/libusb/hidusb.cpp +++ /dev/null @@ -1,3 +0,0 @@ - -#define NAMESPACE HIDUSB -#include "hid.c" diff --git a/Source/3rdParty/SDL2/src/hidapi/linux/Makefile-manual b/Source/3rdParty/SDL2/src/hidapi/linux/Makefile-manual deleted file mode 100644 index 04ce1de..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/linux/Makefile-manual +++ /dev/null @@ -1,49 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: hidtest-hidraw libs - -libs: libhidapi-hidraw.so - -CC ?= gcc -CFLAGS ?= -Wall -g -fpic - -CXX ?= g++ -CXXFLAGS ?= -Wall -g -fpic - -LDFLAGS ?= -Wall -g - - -COBJS = hid.o -CPPOBJS = ../hidtest/hidtest.o -OBJS = $(COBJS) $(CPPOBJS) -LIBS_UDEV = `pkg-config libudev --libs` -lrt -LIBS = $(LIBS_UDEV) -INCLUDES ?= -I../hidapi `pkg-config libusb-1.0 --cflags` - - -# Console Test Program -hidtest-hidraw: $(COBJS) $(CPPOBJS) - $(CXX) $(LDFLAGS) $^ $(LIBS_UDEV) -o $@ - -# Shared Libs -libhidapi-hidraw.so: $(COBJS) - $(CC) $(LDFLAGS) $(LIBS_UDEV) -shared -fpic -Wl,-soname,$@.0 $^ -o $@ - -# Objects -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) -c $(INCLUDES) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CXXFLAGS) -c $(INCLUDES) $< -o $@ - - -clean: - rm -f $(OBJS) hidtest-hidraw libhidapi-hidraw.so ../hidtest/hidtest.o - -.PHONY: clean libs diff --git a/Source/3rdParty/SDL2/src/hidapi/linux/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/linux/Makefile.am deleted file mode 100644 index 230eeb7..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/linux/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -lib_LTLIBRARIES = libhidapi-hidraw.la -libhidapi_hidraw_la_SOURCES = hid.c -libhidapi_hidraw_la_LDFLAGS = $(LTLDFLAGS) -AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ $(CFLAGS_HIDRAW) -libhidapi_hidraw_la_LIBADD = $(LIBS_HIDRAW) - -hdrdir = $(includedir)/hidapi -hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h - -EXTRA_DIST = Makefile-manual diff --git a/Source/3rdParty/SDL2/src/hidapi/linux/README.txt b/Source/3rdParty/SDL2/src/hidapi/linux/README.txt deleted file mode 100644 index 8006694..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/linux/README.txt +++ /dev/null @@ -1,59 +0,0 @@ - -There are two implementations of HIDAPI for Linux. One (linux/hid.c) uses the -Linux hidraw driver, and the other (libusb/hid.c) uses libusb. Which one you -use depends on your application. Complete functionality of the hidraw -version depends on patches to the Linux kernel which are not currently in -the mainline. These patches have to do with sending and receiving feature -reports. The libusb implementation uses libusb to talk directly to the -device, bypassing any Linux HID driver. The disadvantage of the libusb -version is that it will only work with USB devices, while the hidraw -implementation will work with Bluetooth devices as well. - -To use HIDAPI, simply drop either linux/hid.c or libusb/hid.c into your -application and build using the build parameters in the Makefile. - - -Libusb Implementation notes ----------------------------- -For the libusb implementation, libusb-1.0 must be installed. Libusb 1.0 is -different than the legacy libusb 0.1 which is installed on many systems. To -install libusb-1.0 on Ubuntu and other Debian-based systems, run: - sudo apt-get install libusb-1.0-0-dev - - -Hidraw Implementation notes ----------------------------- -For the hidraw implementation, libudev headers and libraries are required to -build hidapi programs. To install libudev libraries on Ubuntu, -and other Debian-based systems, run: - sudo apt-get install libudev-dev - -On Redhat-based systems, run the following as root: - yum install libudev-devel - -Unfortunately, the hidraw driver, which the linux version of hidapi is based -on, contains bugs in kernel versions < 2.6.36, which the client application -should be aware of. - -Bugs (hidraw implementation only): ------------------------------------ -On Kernel versions < 2.6.34, if your device uses numbered reports, an extra -byte will be returned at the beginning of all reports returned from read() -for hidraw devices. This is worked around in the libary. No action should be -necessary in the client library. - -On Kernel versions < 2.6.35, reports will only be sent using a Set_Report -transfer on the CONTROL endpoint. No data will ever be sent on an Interrupt -Out endpoint if one exists. This is fixed in 2.6.35. In 2.6.35, OUTPUT -reports will be sent to the device on the first INTERRUPT OUT endpoint if it -exists; If it does not exist, OUTPUT reports will be sent on the CONTROL -endpoint. - -On Kernel versions < 2.6.36, add an extra byte containing the report number -to sent reports if numbered reports are used, and the device does not -contain an INTERRPUT OUT endpoint for OUTPUT transfers. For example, if -your device uses numbered reports and wants to send {0x2 0xff 0xff 0xff} to -the device (0x2 is the report number), you must send {0x2 0x2 0xff 0xff -0xff}. If your device has the optional Interrupt OUT endpoint, this does not -apply (but really on 2.6.35 only, because 2.6.34 won't use the interrupt -out endpoint). diff --git a/Source/3rdParty/SDL2/src/hidapi/linux/hid.c b/Source/3rdParty/SDL2/src/hidapi/linux/hid.c deleted file mode 100644 index b78e009..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/linux/hid.c +++ /dev/null @@ -1,898 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - Linux Version - 6/2/2009 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ -#include "../../SDL_internal.h" - -#ifdef SDL_JOYSTICK_HIDAPI - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE /* needed for wcsdup() before glibc 2.10 */ -#endif - -/* C */ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <locale.h> -#include <errno.h> - -/* Unix */ -#include <unistd.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/ioctl.h> -#include <sys/utsname.h> -#include <fcntl.h> -#include <poll.h> - -/* Linux */ -#include <linux/hidraw.h> -#include <linux/version.h> -#include <linux/input.h> -#include <libudev.h> - -#include "hidapi.h" - -#ifdef NAMESPACE -namespace NAMESPACE -{ -#endif - -/* Definitions from linux/hidraw.h. Since these are new, some distros - may not have header files which contain them. */ -#ifndef HIDIOCSFEATURE -#define HIDIOCSFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x06, len) -#endif -#ifndef HIDIOCGFEATURE -#define HIDIOCGFEATURE(len) _IOC(_IOC_WRITE|_IOC_READ, 'H', 0x07, len) -#endif - -/* USB HID device property names */ -const char *device_string_names[] = { - "manufacturer", - "product", - "serial", -}; - -/* Symbolic names for the properties above */ -enum device_string_id { - DEVICE_STRING_MANUFACTURER, - DEVICE_STRING_PRODUCT, - DEVICE_STRING_SERIAL, - - DEVICE_STRING_COUNT, -}; - -struct hid_device_ { - int device_handle; - int blocking; - int uses_numbered_reports; - int is_bluetooth; -}; - - -static __u32 kernel_version = 0; - -static __u32 detect_kernel_version(void) -{ - struct utsname name; - int major, minor, release; - int ret; - - uname(&name); - ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release); - if (ret == 3) { - return KERNEL_VERSION(major, minor, release); - } - - ret = sscanf(name.release, "%d.%d", &major, &minor); - if (ret == 2) { - return KERNEL_VERSION(major, minor, 0); - } - - printf("Couldn't determine kernel version from version string \"%s\"\n", name.release); - return 0; -} - -static hid_device *new_hid_device(void) -{ - hid_device *dev = (hid_device *)calloc(1, sizeof(hid_device)); - dev->device_handle = -1; - dev->blocking = 1; - dev->uses_numbered_reports = 0; - dev->is_bluetooth = 0; - - return dev; -} - - -/* The caller must free the returned string with free(). */ -static wchar_t *utf8_to_wchar_t(const char *utf8) -{ - wchar_t *ret = NULL; - - if (utf8) { - size_t wlen = mbstowcs(NULL, utf8, 0); - if ((size_t) -1 == wlen) { - return wcsdup(L""); - } - ret = (wchar_t *)calloc(wlen+1, sizeof(wchar_t)); - mbstowcs(ret, utf8, wlen+1); - ret[wlen] = 0x0000; - } - - return ret; -} - -/* Get an attribute value from a udev_device and return it as a whar_t - string. The returned string must be freed with free() when done.*/ -static wchar_t *copy_udev_string(struct udev_device *dev, const char *udev_name) -{ - return utf8_to_wchar_t(udev_device_get_sysattr_value(dev, udev_name)); -} - -/* uses_numbered_reports() returns 1 if report_descriptor describes a device - which contains numbered reports. */ -static int uses_numbered_reports(__u8 *report_descriptor, __u32 size) { - unsigned int i = 0; - int size_code; - int data_len, key_size; - - while (i < size) { - int key = report_descriptor[i]; - - /* Check for the Report ID key */ - if (key == 0x85/*Report ID*/) { - /* This device has a Report ID, which means it uses - numbered reports. */ - return 1; - } - - //printf("key: %02hhx\n", key); - - if ((key & 0xf0) == 0xf0) { - /* This is a Long Item. The next byte contains the - length of the data section (value) for this key. - See the HID specification, version 1.11, section - 6.2.2.3, titled "Long Items." */ - if (i+1 < size) - data_len = report_descriptor[i+1]; - else - data_len = 0; /* malformed report */ - key_size = 3; - } - else { - /* This is a Short Item. The bottom two bits of the - key contain the size code for the data section - (value) for this key. Refer to the HID - specification, version 1.11, section 6.2.2.2, - titled "Short Items." */ - size_code = key & 0x3; - switch (size_code) { - case 0: - case 1: - case 2: - data_len = size_code; - break; - case 3: - data_len = 4; - break; - default: - /* Can't ever happen since size_code is & 0x3 */ - data_len = 0; - break; - }; - key_size = 1; - } - - /* Skip over this key and it's associated data */ - i += data_len + key_size; - } - - /* Didn't find a Report ID key. Device doesn't use numbered reports. */ - return 0; -} - -/* - * The caller is responsible for free()ing the (newly-allocated) character - * strings pointed to by serial_number_utf8 and product_name_utf8 after use. - */ -static int -parse_uevent_info(const char *uevent, int *bus_type, - unsigned short *vendor_id, unsigned short *product_id, - char **serial_number_utf8, char **product_name_utf8) -{ - char *tmp = strdup(uevent); - char *saveptr = NULL; - char *line; - char *key; - char *value; - - int found_id = 0; - int found_serial = 0; - int found_name = 0; - - line = strtok_r(tmp, "\n", &saveptr); - while (line != NULL) { - /* line: "KEY=value" */ - key = line; - value = strchr(line, '='); - if (!value) { - goto next_line; - } - *value = '\0'; - value++; - - if (strcmp(key, "HID_ID") == 0) { - /** - * type vendor product - * HID_ID=0003:000005AC:00008242 - **/ - int ret = sscanf(value, "%x:%hx:%hx", bus_type, vendor_id, product_id); - if (ret == 3) { - found_id = 1; - } - } else if (strcmp(key, "HID_NAME") == 0) { - /* The caller has to free the product name */ - *product_name_utf8 = strdup(value); - found_name = 1; - } else if (strcmp(key, "HID_UNIQ") == 0) { - /* The caller has to free the serial number */ - *serial_number_utf8 = strdup(value); - found_serial = 1; - } - -next_line: - line = strtok_r(NULL, "\n", &saveptr); - } - - free(tmp); - return (found_id && found_name && found_serial); -} - -static int is_bluetooth(hid_device *dev) -{ - struct udev *udev; - struct udev_device *udev_dev, *hid_dev; - struct stat s; - int ret = -1; - - /* Create the udev object */ - udev = udev_new(); - if (!udev) { - printf("Can't create udev\n"); - return -1; - } - - /* Get the dev_t (major/minor numbers) from the file handle. */ - ret = fstat(dev->device_handle, &s); - if (-1 == ret) { - udev_unref(udev); - return ret; - } - - /* Open a udev device from the dev_t. 'c' means character device. */ - udev_dev = udev_device_new_from_devnum(udev, 'c', s.st_rdev); - if (udev_dev) { - hid_dev = udev_device_get_parent_with_subsystem_devtype( - udev_dev, - "hid", - NULL); - if (hid_dev) { - unsigned short dev_vid; - unsigned short dev_pid; - int bus_type; - char *serial_number_utf8 = NULL; - char *product_name_utf8 = NULL; - - ret = parse_uevent_info( - udev_device_get_sysattr_value(hid_dev, "uevent"), - &bus_type, - &dev_vid, - &dev_pid, - &serial_number_utf8, - &product_name_utf8); - free(serial_number_utf8); - free(product_name_utf8); - - ret = (bus_type == BUS_BLUETOOTH); - - /* hid_dev doesn't need to be (and can't be) unref'd. - I'm not sure why, but it'll throw double-free() errors. */ - } - udev_device_unref(udev_dev); - } - - udev_unref(udev); - - return ret; -} - - -static int get_device_string(hid_device *dev, enum device_string_id key, wchar_t *string, size_t maxlen) -{ - struct udev *udev; - struct udev_device *udev_dev, *parent, *hid_dev; - struct stat s; - int ret = -1; - char *serial_number_utf8 = NULL; - char *product_name_utf8 = NULL; - char *tmp; - - /* Create the udev object */ - udev = udev_new(); - if (!udev) { - printf("Can't create udev\n"); - return -1; - } - - /* Get the dev_t (major/minor numbers) from the file handle. */ - ret = fstat(dev->device_handle, &s); - if (-1 == ret) { - udev_unref(udev); - return ret; - } - /* Open a udev device from the dev_t. 'c' means character device. */ - udev_dev = udev_device_new_from_devnum(udev, 'c', s.st_rdev); - if (udev_dev) { - hid_dev = udev_device_get_parent_with_subsystem_devtype( - udev_dev, - "hid", - NULL); - if (hid_dev) { - unsigned short dev_vid; - unsigned short dev_pid; - int bus_type; - size_t retm; - - ret = parse_uevent_info( - udev_device_get_sysattr_value(hid_dev, "uevent"), - &bus_type, - &dev_vid, - &dev_pid, - &serial_number_utf8, - &product_name_utf8); - - if (bus_type == BUS_BLUETOOTH) { - switch (key) { - case DEVICE_STRING_MANUFACTURER: - wcsncpy(string, L"", maxlen); - ret = 0; - break; - case DEVICE_STRING_PRODUCT: - retm = mbstowcs(string, product_name_utf8, maxlen); - ret = (retm == (size_t)-1)? -1: 0; - break; - case DEVICE_STRING_SERIAL: - /* Bluetooth serial numbers are often the bluetooth device address - and we want that with the colons stripped out, which is the correct - serial number for PS4 controllers - */ - while ((tmp = strchr(serial_number_utf8, ':')) != NULL) { - memmove(tmp, tmp+1, strlen(tmp)); - } - retm = mbstowcs(string, serial_number_utf8, maxlen); - ret = (retm == (size_t)-1)? -1: 0; - break; - case DEVICE_STRING_COUNT: - default: - ret = -1; - break; - } - } - else { - /* This is a USB device. Find its parent USB Device node. */ - parent = udev_device_get_parent_with_subsystem_devtype( - udev_dev, - "usb", - "usb_device"); - if (parent) { - const char *str; - const char *key_str = NULL; - - if (key >= 0 && key < DEVICE_STRING_COUNT) { - key_str = device_string_names[key]; - } else { - ret = -1; - goto end; - } - - str = udev_device_get_sysattr_value(parent, key_str); - if (str) { - /* Convert the string from UTF-8 to wchar_t */ - retm = mbstowcs(string, str, maxlen); - ret = (retm == (size_t)-1)? -1: 0; - goto end; - } - } - } - } - } - -end: - free(serial_number_utf8); - free(product_name_utf8); - - udev_device_unref(udev_dev); - /* parent and hid_dev don't need to be (and can't be) unref'd. - I'm not sure why, but they'll throw double-free() errors. */ - udev_unref(udev); - - return ret; -} - -int HID_API_EXPORT hid_init(void) -{ - const char *locale; - - /* Set the locale if it's not set. */ - locale = setlocale(LC_CTYPE, NULL); - if (!locale) - setlocale(LC_CTYPE, ""); - - kernel_version = detect_kernel_version(); - - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ - /* Nothing to do for this in the Linux/hidraw implementation. */ - return 0; -} - - -struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - struct udev *udev; - struct udev_enumerate *enumerate; - struct udev_list_entry *devices, *dev_list_entry; - - struct hid_device_info *root = NULL; /* return object */ - struct hid_device_info *cur_dev = NULL; - struct hid_device_info *prev_dev = NULL; /* previous device */ - - hid_init(); - - /* Create the udev object */ - udev = udev_new(); - if (!udev) { - printf("Can't create udev\n"); - return NULL; - } - - /* Create a list of the devices in the 'hidraw' subsystem. */ - enumerate = udev_enumerate_new(udev); - udev_enumerate_add_match_subsystem(enumerate, "hidraw"); - udev_enumerate_scan_devices(enumerate); - devices = udev_enumerate_get_list_entry(enumerate); - /* For each item, see if it matches the vid/pid, and if so - create a udev_device record for it */ - udev_list_entry_foreach(dev_list_entry, devices) { - const char *sysfs_path; - const char *dev_path; - const char *str; - struct udev_device *raw_dev; /* The device's hidraw udev node. */ - struct udev_device *hid_dev; /* The device's HID udev node. */ - struct udev_device *usb_dev; /* The device's USB udev node. */ - struct udev_device *intf_dev; /* The device's interface (in the USB sense). */ - unsigned short dev_vid; - unsigned short dev_pid; - char *serial_number_utf8 = NULL; - char *product_name_utf8 = NULL; - int bus_type; - int result; - - /* Get the filename of the /sys entry for the device - and create a udev_device object (dev) representing it */ - sysfs_path = udev_list_entry_get_name(dev_list_entry); - raw_dev = udev_device_new_from_syspath(udev, sysfs_path); - dev_path = udev_device_get_devnode(raw_dev); - - hid_dev = udev_device_get_parent_with_subsystem_devtype( - raw_dev, - "hid", - NULL); - - if (!hid_dev) { - /* Unable to find parent hid device. */ - goto next; - } - - result = parse_uevent_info( - udev_device_get_sysattr_value(hid_dev, "uevent"), - &bus_type, - &dev_vid, - &dev_pid, - &serial_number_utf8, - &product_name_utf8); - - if (!result) { - /* parse_uevent_info() failed for at least one field. */ - goto next; - } - - if (bus_type != BUS_USB && bus_type != BUS_BLUETOOTH) { - /* We only know how to handle USB and BT devices. */ - goto next; - } - - if (access(dev_path, R_OK|W_OK) != 0) { - /* We can't open this device, ignore it */ - goto next; - } - - /* Check the VID/PID against the arguments */ - if ((vendor_id == 0x0 || vendor_id == dev_vid) && - (product_id == 0x0 || product_id == dev_pid)) { - struct hid_device_info *tmp; - - /* VID/PID match. Create the record. */ - tmp = (struct hid_device_info *)malloc(sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - prev_dev = cur_dev; - cur_dev = tmp; - - /* Fill out the record */ - cur_dev->next = NULL; - cur_dev->path = dev_path? strdup(dev_path): NULL; - - /* VID/PID */ - cur_dev->vendor_id = dev_vid; - cur_dev->product_id = dev_pid; - - /* Serial Number */ - cur_dev->serial_number = utf8_to_wchar_t(serial_number_utf8); - - /* Release Number */ - cur_dev->release_number = 0x0; - - /* Interface Number */ - cur_dev->interface_number = -1; - - switch (bus_type) { - case BUS_USB: - /* The device pointed to by raw_dev contains information about - the hidraw device. In order to get information about the - USB device, get the parent device with the - subsystem/devtype pair of "usb"/"usb_device". This will - be several levels up the tree, but the function will find - it. */ - usb_dev = udev_device_get_parent_with_subsystem_devtype( - raw_dev, - "usb", - "usb_device"); - - if (!usb_dev) { - /* Free this device */ - free(cur_dev->serial_number); - free(cur_dev->path); - free(cur_dev); - - /* Take it off the device list. */ - if (prev_dev) { - prev_dev->next = NULL; - cur_dev = prev_dev; - } - else { - cur_dev = root = NULL; - } - - goto next; - } - - /* Manufacturer and Product strings */ - cur_dev->manufacturer_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_MANUFACTURER]); - cur_dev->product_string = copy_udev_string(usb_dev, device_string_names[DEVICE_STRING_PRODUCT]); - - /* Release Number */ - str = udev_device_get_sysattr_value(usb_dev, "bcdDevice"); - cur_dev->release_number = (str)? strtol(str, NULL, 16): 0x0; - - /* Get a handle to the interface's udev node. */ - intf_dev = udev_device_get_parent_with_subsystem_devtype( - raw_dev, - "usb", - "usb_interface"); - if (intf_dev) { - str = udev_device_get_sysattr_value(intf_dev, "bInterfaceNumber"); - cur_dev->interface_number = (str)? strtol(str, NULL, 16): -1; - } - - break; - - case BUS_BLUETOOTH: - /* Manufacturer and Product strings */ - cur_dev->manufacturer_string = wcsdup(L""); - cur_dev->product_string = utf8_to_wchar_t(product_name_utf8); - - break; - - default: - /* Unknown device type - this should never happen, as we - * check for USB and Bluetooth devices above */ - break; - } - } - - next: - free(serial_number_utf8); - free(product_name_utf8); - udev_device_unref(raw_dev); - /* hid_dev, usb_dev and intf_dev don't need to be (and can't be) - unref()d. It will cause a double-free() error. I'm not - sure why. */ - } - /* Free the enumerator and udev objects. */ - udev_enumerate_unref(enumerate); - udev_unref(udev); - - return root; -} - -void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) -{ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - -hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device *handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open, 0); - } - - hid_free_enumeration(devs); - - return handle; -} - -hid_device * HID_API_EXPORT hid_open_path(const char *path, int bExclusive) -{ - hid_device *dev = NULL; - - hid_init(); - - dev = new_hid_device(); - - /* OPEN HERE */ - dev->device_handle = open(path, O_RDWR); - - /* If we have a good handle, return it. */ - if (dev->device_handle > 0) { - - /* Get the report descriptor */ - int res, desc_size = 0; - struct hidraw_report_descriptor rpt_desc; - - memset(&rpt_desc, 0x0, sizeof(rpt_desc)); - - /* Get Report Descriptor Size */ - res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size); - if (res < 0) - perror("HIDIOCGRDESCSIZE"); - - - /* Get Report Descriptor */ - rpt_desc.size = desc_size; - res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc); - if (res < 0) { - perror("HIDIOCGRDESC"); - } else { - /* Determine if this device uses numbered reports. */ - dev->uses_numbered_reports = - uses_numbered_reports(rpt_desc.value, - rpt_desc.size); - } - - dev->is_bluetooth = (is_bluetooth(dev) == 1); - - return dev; - } - else { - /* Unable to open any devices. */ - free(dev); - return NULL; - } -} - - -int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - int bytes_written; - - bytes_written = write(dev->device_handle, data, length); - - return bytes_written; -} - - -int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - int bytes_read; - - if (milliseconds >= 0) { - /* Milliseconds is either 0 (non-blocking) or > 0 (contains - a valid timeout). In both cases we want to call poll() - and wait for data to arrive. Don't rely on non-blocking - operation (O_NONBLOCK) since some kernels don't seem to - properly report device disconnection through read() when - in non-blocking mode. */ - int ret; - struct pollfd fds; - - fds.fd = dev->device_handle; - fds.events = POLLIN; - fds.revents = 0; - ret = poll(&fds, 1, milliseconds); - if (ret == -1 || ret == 0) { - /* Error or timeout */ - return ret; - } - else { - /* Check for errors on the file descriptor. This will - indicate a device disconnection. */ - if (fds.revents & (POLLERR | POLLHUP | POLLNVAL)) - return -1; - } - } - - bytes_read = read(dev->device_handle, data, length); - if (bytes_read < 0 && (errno == EAGAIN || errno == EINPROGRESS)) - bytes_read = 0; - - if (bytes_read >= 0 && - kernel_version != 0 && - kernel_version < KERNEL_VERSION(2,6,34) && - dev->uses_numbered_reports) { - /* Work around a kernel bug. Chop off the first byte. */ - memmove(data, data+1, bytes_read); - bytes_read--; - } - - return bytes_read; -} - -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); -} - -int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) -{ - /* Do all non-blocking in userspace using poll(), since it looks - like there's a bug in the kernel in some versions where - read() will not return -1 on disconnection of the USB device */ - - dev->blocking = !nonblock; - return 0; /* Success */ -} - - -int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - int res; - - res = ioctl(dev->device_handle, HIDIOCSFEATURE(length), data); - if (res < 0) - perror("ioctl (SFEATURE)"); - - return res; -} - -int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - int res; - - /* It looks like HIDIOCGFEATURE() on Bluetooth devices doesn't return the report number */ - if (dev->is_bluetooth) { - data[1] = data[0]; - ++data; - --length; - } - res = ioctl(dev->device_handle, HIDIOCGFEATURE(length), data); - if (res < 0) - perror("ioctl (GFEATURE)"); - else if (dev->is_bluetooth) - ++res; - - return res; -} - - -void HID_API_EXPORT hid_close(hid_device *dev) -{ - if (!dev) - return; - close(dev->device_handle); - free(dev); -} - - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_device_string(dev, DEVICE_STRING_MANUFACTURER, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_device_string(dev, DEVICE_STRING_PRODUCT, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_device_string(dev, DEVICE_STRING_SERIAL, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - return -1; -} - - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - return NULL; -} - -#ifdef NAMESPACE -} -#endif - -#endif /* SDL_JOYSTICK_HIDAPI */ diff --git a/Source/3rdParty/SDL2/src/hidapi/linux/hid.cpp b/Source/3rdParty/SDL2/src/hidapi/linux/hid.cpp deleted file mode 100644 index 841f34f..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/linux/hid.cpp +++ /dev/null @@ -1,333 +0,0 @@ -//=================== Copyright Valve Corporation, All rights reserved. ======= -// -// Purpose: A wrapper around both the libusb and hidraw versions of HIDAPI -// -// The libusb version doesn't support Bluetooth, but not all Linux -// distributions allow access to /dev/hidraw* -// -// This merges the two, at a small performance cost, until distributions -// have granted access to /dev/hidraw* -// -//============================================================================= - -#define NAMESPACE HIDRAW -#include "../hidapi/hidapi.h" -#undef NAMESPACE -#undef HIDAPI_H__ - -#define NAMESPACE HIDUSB -#include "../hidapi/hidapi.h" -#undef NAMESPACE -#undef HIDAPI_H__ - -#include "../hidapi/hidapi.h" - -#include "../../../public/tier1/utlvector.h" -#include "../../../public/tier1/utlhashmap.h" - - -template <class T> -void CopyHIDDeviceInfo( T *pSrc, struct hid_device_info *pDst ) -{ - pDst->path = pSrc->path ? strdup( pSrc->path ) : NULL; - pDst->vendor_id = pSrc->vendor_id; - pDst->product_id = pSrc->product_id; - pDst->serial_number = pSrc->serial_number ? wcsdup( pSrc->serial_number ) : NULL; - pDst->release_number = pSrc->release_number; - pDst->manufacturer_string = pSrc->manufacturer_string ? wcsdup( pSrc->manufacturer_string ) : NULL; - pDst->product_string = pSrc->product_string ? wcsdup( pSrc->product_string ) : NULL; - pDst->usage_page = pSrc->usage_page; - pDst->usage = pSrc->usage; - pDst->interface_number = pSrc->interface_number; - pDst->next = NULL; -} - -extern "C" -{ - -enum EHIDAPIType -{ - k_EHIDAPIUnknown, - k_EHIDAPIRAW, - k_EHIDAPIUSB -}; - -static CUtlHashMap<uintptr_t, EHIDAPIType> s_hashDeviceToAPI; - -static EHIDAPIType GetAPIForDevice( hid_device *pDevice ) -{ - int iIndex = s_hashDeviceToAPI.Find( (uintptr_t)pDevice ); - if ( iIndex != -1 ) - { - return s_hashDeviceToAPI[ iIndex ]; - } - return k_EHIDAPIUnknown; -} - -struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - struct HIDUSB::hid_device_info *usb_devs = HIDUSB::hid_enumerate( vendor_id, product_id ); - struct HIDUSB::hid_device_info *usb_dev; - struct HIDRAW::hid_device_info *raw_devs = HIDRAW::hid_enumerate( vendor_id, product_id ); - struct HIDRAW::hid_device_info *raw_dev; - struct hid_device_info *devs = NULL, *last = NULL, *new_dev; - - for ( usb_dev = usb_devs; usb_dev; usb_dev = usb_dev->next ) - { - bool bFound = false; - for ( raw_dev = raw_devs; raw_dev; raw_dev = raw_dev->next ) - { - if ( usb_dev->vendor_id == raw_dev->vendor_id && usb_dev->product_id == raw_dev->product_id ) - { - bFound = true; - break; - } - } - -//printf("%s USB device VID/PID 0x%.4x/0x%.4x, %ls %ls\n", bFound ? "Found matching" : "Added new", usb_dev->vendor_id, usb_dev->product_id, usb_dev->manufacturer_string, usb_dev->product_string ); - - if ( !bFound ) - { - new_dev = new struct hid_device_info; - CopyHIDDeviceInfo( usb_dev, new_dev ); - - if ( last ) - { - last->next = new_dev; - } - else - { - devs = new_dev; - } - last = new_dev; - } - } - HIDUSB::hid_free_enumeration( usb_devs ); - - for ( raw_dev = raw_devs; raw_dev; raw_dev = raw_dev->next ) - { - new_dev = new struct hid_device_info; - CopyHIDDeviceInfo( raw_dev, new_dev ); - new_dev->next = NULL; - - if ( last ) - { - last->next = new_dev; - } - else - { - devs = new_dev; - } - last = new_dev; - } - HIDRAW::hid_free_enumeration( raw_devs ); - - return devs; -} - -void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) -{ - while ( devs ) - { - struct hid_device_info *next = devs->next; - free( devs->path ); - free( devs->serial_number ); - free( devs->manufacturer_string ); - free( devs->product_string ); - delete devs; - devs = next; - } -} - -HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - hid_device *pDevice = NULL; - if ( ( pDevice = (hid_device *)HIDRAW::hid_open( vendor_id, product_id, serial_number ) ) != NULL ) - { - s_hashDeviceToAPI.Insert( (uintptr_t)pDevice, k_EHIDAPIRAW ); - return pDevice; - } - if ( ( pDevice = (hid_device *)HIDUSB::hid_open( vendor_id, product_id, serial_number ) ) != NULL ) - { - s_hashDeviceToAPI.Insert( (uintptr_t)pDevice, k_EHIDAPIUSB ); - return pDevice; - } - return NULL; -} - -HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path, int bExclusive) -{ - hid_device *pDevice = NULL; - if ( ( pDevice = (hid_device *)HIDRAW::hid_open_path( path, bExclusive ) ) != NULL ) - { - s_hashDeviceToAPI.Insert( (uintptr_t)pDevice, k_EHIDAPIRAW ); - return pDevice; - } - if ( ( pDevice = (hid_device *)HIDUSB::hid_open_path( path, bExclusive ) ) != NULL ) - { - s_hashDeviceToAPI.Insert( (uintptr_t)pDevice, k_EHIDAPIUSB ); - return pDevice; - } - return NULL; -} - -int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_write( (HIDRAW::hid_device*)device, data, length ); - case k_EHIDAPIUSB: - return HIDUSB::hid_write( (HIDUSB::hid_device*)device, data, length ); - default: - return -1; - } -} - -int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned char *data, size_t length, int milliseconds) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_read_timeout( (HIDRAW::hid_device*)device, data, length, milliseconds ); - case k_EHIDAPIUSB: - return HIDUSB::hid_read_timeout( (HIDUSB::hid_device*)device, data, length, milliseconds ); - default: - return -1; - } -} - -int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_read( (HIDRAW::hid_device*)device, data, length ); - case k_EHIDAPIUSB: - return HIDUSB::hid_read( (HIDUSB::hid_device*)device, data, length ); - default: - return -1; - } -} - -int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_set_nonblocking( (HIDRAW::hid_device*)device, nonblock ); - case k_EHIDAPIUSB: - return HIDUSB::hid_set_nonblocking( (HIDUSB::hid_device*)device, nonblock ); - default: - return -1; - } -} - -int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_send_feature_report( (HIDRAW::hid_device*)device, data, length ); - case k_EHIDAPIUSB: - return HIDUSB::hid_send_feature_report( (HIDUSB::hid_device*)device, data, length ); - default: - return -1; - } -} - -int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_get_feature_report( (HIDRAW::hid_device*)device, data, length ); - case k_EHIDAPIUSB: - return HIDUSB::hid_get_feature_report( (HIDUSB::hid_device*)device, data, length ); - default: - return -1; - } -} - -void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - HIDRAW::hid_close( (HIDRAW::hid_device*)device ); - break; - case k_EHIDAPIUSB: - HIDUSB::hid_close( (HIDUSB::hid_device*)device ); - break; - default: - break; - } - s_hashDeviceToAPI.Remove( (uintptr_t)device ); -} - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_get_manufacturer_string( (HIDRAW::hid_device*)device, string, maxlen ); - case k_EHIDAPIUSB: - return HIDUSB::hid_get_manufacturer_string( (HIDUSB::hid_device*)device, string, maxlen ); - default: - return -1; - } -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_get_product_string( (HIDRAW::hid_device*)device, string, maxlen ); - case k_EHIDAPIUSB: - return HIDUSB::hid_get_product_string( (HIDUSB::hid_device*)device, string, maxlen ); - default: - return -1; - } -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_get_serial_number_string( (HIDRAW::hid_device*)device, string, maxlen ); - case k_EHIDAPIUSB: - return HIDUSB::hid_get_serial_number_string( (HIDUSB::hid_device*)device, string, maxlen ); - default: - return -1; - } -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_get_indexed_string( (HIDRAW::hid_device*)device, string_index, string, maxlen ); - case k_EHIDAPIUSB: - return HIDUSB::hid_get_indexed_string( (HIDUSB::hid_device*)device, string_index, string, maxlen ); - default: - return -1; - } -} - -HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device) -{ - switch ( GetAPIForDevice( device ) ) - { - case k_EHIDAPIRAW: - return HIDRAW::hid_error( (HIDRAW::hid_device*)device ); - case k_EHIDAPIUSB: - return HIDUSB::hid_error( (HIDUSB::hid_device*)device ); - default: - return NULL; - } -} - -} diff --git a/Source/3rdParty/SDL2/src/hidapi/linux/hidraw.cpp b/Source/3rdParty/SDL2/src/hidapi/linux/hidraw.cpp deleted file mode 100644 index 1bf6fad..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/linux/hidraw.cpp +++ /dev/null @@ -1,3 +0,0 @@ - -#define NAMESPACE HIDRAW -#include "hid.c" diff --git a/Source/3rdParty/SDL2/src/hidapi/m4/ax_pthread.m4 b/Source/3rdParty/SDL2/src/hidapi/m4/ax_pthread.m4 deleted file mode 100644 index d90de34..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/m4/ax_pthread.m4 +++ /dev/null @@ -1,309 +0,0 @@ -# =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) -# -# DESCRIPTION -# -# This macro figures out how to build C programs using POSIX threads. It -# sets the PTHREAD_LIBS output variable to the threads library and linker -# flags, and the PTHREAD_CFLAGS output variable to any special C compiler -# flags that are needed. (The user can also force certain compiler -# flags/libs to be tested by setting these environment variables.) -# -# Also sets PTHREAD_CC to any special C compiler that is needed for -# multi-threaded programs (defaults to the value of CC otherwise). (This -# is necessary on AIX to use the special cc_r compiler alias.) -# -# NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with -# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS -# -# If you are only building threads programs, you may wish to use these -# variables in your default LIBS, CFLAGS, and CC: -# -# LIBS="$PTHREAD_LIBS $LIBS" -# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -# CC="$PTHREAD_CC" -# -# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). -# -# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the -# PTHREAD_PRIO_INHERIT symbol is defined when compiling with -# PTHREAD_CFLAGS. -# -# ACTION-IF-FOUND is a list of shell commands to run if a threads library -# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it -# is not found. If ACTION-IF-FOUND is not specified, the default action -# will define HAVE_PTHREAD. -# -# Please let the authors know if this macro fails on any platform, or if -# you have any other suggestions or comments. This macro was based on work -# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help -# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by -# Alejandro Forero Cuervo to the autoconf macro repository. We are also -# grateful for the helpful feedback of numerous users. -# -# Updated for Autoconf 2.68 by Daniel Richard G. -# -# LICENSE -# -# Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu> -# Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG> -# -# 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 <http://www.gnu.org/licenses/>. -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 18 - -AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) -AC_DEFUN([AX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_LANG_PUSH([C]) -ax_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) - AC_MSG_RESULT($ax_pthread_ok) - if test x"$ax_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case ${host_os} in - solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" - ;; - - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" - ;; -esac - -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do - - case $flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) - if test x"$ax_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h> - static void routine(void *a) { a = 0; } - static void *start_routine(void *a) { return a; }], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - AC_MSG_RESULT($ax_pthread_ok) - if test "x$ax_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>], - [int attr = $attr; return attr /* ; */])], - [attr_name=$attr; break], - []) - done - AC_MSG_RESULT($attr_name) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - flag="-mt -D_REENTRANT" - fi - ;; - esac - AC_MSG_RESULT(${flag}) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi - - AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - ax_cv_PTHREAD_PRIO_INHERIT, [ - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([[#include <pthread.h>]], [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) - ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], - AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], 1, [Have PTHREAD_PRIO_INHERIT.])) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) - else - PTHREAD_CC=$CC - fi -else - PTHREAD_CC="$CC" -fi - -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_CC) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) - : -else - ax_pthread_ok=no - $2 -fi -AC_LANG_POP -])dnl AX_PTHREAD diff --git a/Source/3rdParty/SDL2/src/hidapi/m4/pkg.m4 b/Source/3rdParty/SDL2/src/hidapi/m4/pkg.m4 deleted file mode 100644 index 0048a3f..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/m4/pkg.m4 +++ /dev/null @@ -1,157 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# -# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi - -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - ifelse([$4], , [AC_MSG_ERROR(dnl -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) -elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see <http://pkg-config.freedesktop.org/>.])], - [$4]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) -fi[]dnl -])# PKG_CHECK_MODULES diff --git a/Source/3rdParty/SDL2/src/hidapi/mac/Makefile-manual b/Source/3rdParty/SDL2/src/hidapi/mac/Makefile-manual deleted file mode 100644 index 5399b5a..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/mac/Makefile-manual +++ /dev/null @@ -1,32 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-07-03 -########################################### - -all: hidtest - -CC=gcc -CXX=g++ -COBJS=hid.o -CPPOBJS=../hidtest/hidtest.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS+=-I../hidapi -Wall -g -c -LIBS=-framework IOKit -framework CoreFoundation - - -hidtest: $(OBJS) - g++ -Wall -g $^ $(LIBS) -o hidtest - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -clean: - rm -f *.o hidtest $(CPPOBJS) - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/mac/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/mac/Makefile.am deleted file mode 100644 index 23d96e0..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/mac/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -lib_LTLIBRARIES = libhidapi.la -libhidapi_la_SOURCES = hid.c -libhidapi_la_LDFLAGS = $(LTLDFLAGS) -AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ - -hdrdir = $(includedir)/hidapi -hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h - -EXTRA_DIST = Makefile-manual diff --git a/Source/3rdParty/SDL2/src/hidapi/mac/hid.c b/Source/3rdParty/SDL2/src/hidapi/mac/hid.c deleted file mode 100644 index d462d26..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/mac/hid.c +++ /dev/null @@ -1,1191 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 2010-07-03 - - Copyright 2010, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . - ********************************************************/ -#include "../../SDL_internal.h" - -#ifdef SDL_JOYSTICK_HIDAPI - -/* See Apple Technical Note TN2187 for details on IOHidManager. */ - -#include <IOKit/hid/IOHIDManager.h> -#include <IOKit/hid/IOHIDKeys.h> -#include <CoreFoundation/CoreFoundation.h> -#include <wchar.h> -#include <locale.h> -#include <pthread.h> -#include <sys/time.h> -#include <unistd.h> - -#include "hidapi.h" - -/* Barrier implementation because Mac OSX doesn't have pthread_barrier. - It also doesn't have clock_gettime(). So much for POSIX and SUSv2. - This implementation came from Brent Priddy and was posted on - StackOverflow. It is used with his permission. */ -typedef int pthread_barrierattr_t; -typedef struct pthread_barrier { - pthread_mutex_t mutex; - pthread_cond_t cond; - int count; - int trip_count; -} pthread_barrier_t; - -static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) -{ - if(count == 0) { - errno = EINVAL; - return -1; - } - - if(pthread_mutex_init(&barrier->mutex, 0) < 0) { - return -1; - } - if(pthread_cond_init(&barrier->cond, 0) < 0) { - pthread_mutex_destroy(&barrier->mutex); - return -1; - } - barrier->trip_count = count; - barrier->count = 0; - - return 0; -} - -static int pthread_barrier_destroy(pthread_barrier_t *barrier) -{ - pthread_cond_destroy(&barrier->cond); - pthread_mutex_destroy(&barrier->mutex); - return 0; -} - -static int pthread_barrier_wait(pthread_barrier_t *barrier) -{ - pthread_mutex_lock(&barrier->mutex); - ++(barrier->count); - if(barrier->count >= barrier->trip_count) - { - barrier->count = 0; - pthread_cond_broadcast(&barrier->cond); - pthread_mutex_unlock(&barrier->mutex); - return 1; - } - else - { - pthread_cond_wait(&barrier->cond, &(barrier->mutex)); - pthread_mutex_unlock(&barrier->mutex); - return 0; - } -} - -static int return_data(hid_device *dev, unsigned char *data, size_t length); - -/* Linked List of input reports received from the device. */ -struct input_report { - uint8_t *data; - size_t len; - struct input_report *next; -}; - -struct hid_device_ { - IOHIDDeviceRef device_handle; - int blocking; - int uses_numbered_reports; - int disconnected; - CFStringRef run_loop_mode; - CFRunLoopRef run_loop; - CFRunLoopSourceRef source; - uint8_t *input_report_buf; - CFIndex max_input_report_len; - struct input_report *input_reports; - - pthread_t thread; - pthread_mutex_t mutex; /* Protects input_reports */ - pthread_cond_t condition; - pthread_barrier_t barrier; /* Ensures correct startup sequence */ - pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ - int shutdown_thread; - - hid_device *next; -}; - -/* Static list of all the devices open. This way when a device gets - disconnected, its hid_device structure can be marked as disconnected - from hid_device_removal_callback(). */ -static hid_device *device_list = NULL; -static pthread_mutex_t device_list_mutex = PTHREAD_MUTEX_INITIALIZER; - -static hid_device *new_hid_device(void) -{ - hid_device *dev = (hid_device*)calloc(1, sizeof(hid_device)); - dev->device_handle = NULL; - dev->blocking = 1; - dev->uses_numbered_reports = 0; - dev->disconnected = 0; - dev->run_loop_mode = NULL; - dev->run_loop = NULL; - dev->source = NULL; - dev->input_report_buf = NULL; - dev->input_reports = NULL; - dev->shutdown_thread = 0; - dev->next = NULL; - - /* Thread objects */ - pthread_mutex_init(&dev->mutex, NULL); - pthread_cond_init(&dev->condition, NULL); - pthread_barrier_init(&dev->barrier, NULL, 2); - pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); - - /* Add the new record to the device_list. */ - pthread_mutex_lock(&device_list_mutex); - if (!device_list) - device_list = dev; - else { - hid_device *d = device_list; - while (d) { - if (!d->next) { - d->next = dev; - break; - } - d = d->next; - } - } - pthread_mutex_unlock(&device_list_mutex); - - return dev; -} - -static void free_hid_device(hid_device *dev) -{ - if (!dev) - return; - - /* Delete any input reports still left over. */ - struct input_report *rpt = dev->input_reports; - while (rpt) { - struct input_report *next = rpt->next; - free(rpt->data); - free(rpt); - rpt = next; - } - - /* Free the string and the report buffer. The check for NULL - is necessary here as CFRelease() doesn't handle NULL like - free() and others do. */ - if (dev->run_loop_mode) - CFRelease(dev->run_loop_mode); - if (dev->source) - CFRelease(dev->source); - free(dev->input_report_buf); - - /* Clean up the thread objects */ - pthread_barrier_destroy(&dev->shutdown_barrier); - pthread_barrier_destroy(&dev->barrier); - pthread_cond_destroy(&dev->condition); - pthread_mutex_destroy(&dev->mutex); - - /* Remove it from the device list. */ - pthread_mutex_lock(&device_list_mutex); - hid_device *d = device_list; - if (d == dev) { - device_list = d->next; - } - else { - while (d) { - if (d->next == dev) { - d->next = d->next->next; - break; - } - - d = d->next; - } - } - pthread_mutex_unlock(&device_list_mutex); - - /* Free the structure itself. */ - free(dev); -} - -static IOHIDManagerRef hid_mgr = 0x0; - - -#if 0 -static void register_error(hid_device *device, const char *op) -{ - -} -#endif - - -static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) -{ - CFTypeRef ref; - int32_t value; - - ref = IOHIDDeviceGetProperty(device, key); - if (ref) { - if (CFGetTypeID(ref) == CFNumberGetTypeID()) { - CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); - return value; - } - } - return 0; -} - -static unsigned short get_vendor_id(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); -} - -static unsigned short get_product_id(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDProductIDKey)); -} - - -static int32_t get_max_report_length(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); -} - -static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) -{ - CFStringRef str; - - if (!len) - return 0; - - str = (CFStringRef)IOHIDDeviceGetProperty(device, prop); - - buf[0] = 0; - - if (str) { - len --; - - CFIndex str_len = CFStringGetLength(str); - CFRange range; - range.location = 0; - range.length = (str_len > len)? len: str_len; - CFIndex used_buf_len; - CFIndex chars_copied; - chars_copied = CFStringGetBytes(str, - range, - kCFStringEncodingUTF32LE, - (char)'?', - FALSE, - (UInt8*)buf, - len, - &used_buf_len); - - buf[chars_copied] = 0; - return (int)chars_copied; - } - else - return 0; - -} - -static int get_string_property_utf8(IOHIDDeviceRef device, CFStringRef prop, char *buf, size_t len) -{ - CFStringRef str; - if (!len) - return 0; - - str = (CFStringRef)IOHIDDeviceGetProperty(device, prop); - - buf[0] = 0; - - if (str) { - len--; - - CFIndex str_len = CFStringGetLength(str); - CFRange range; - range.location = 0; - range.length = (str_len > len)? len: str_len; - CFIndex used_buf_len; - CFIndex chars_copied; - chars_copied = CFStringGetBytes(str, - range, - kCFStringEncodingUTF8, - (char)'?', - FALSE, - (UInt8*)buf, - len, - &used_buf_len); - - buf[chars_copied] = 0; - return (int)used_buf_len; - } - else - return 0; -} - - -static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); -} - -static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); -} - -static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); -} - - -/* Implementation of wcsdup() for Mac. */ -static wchar_t *dup_wcs(const wchar_t *s) -{ - size_t len = wcslen(s); - wchar_t *ret = (wchar_t *)malloc((len+1)*sizeof(wchar_t)); - wcscpy(ret, s); - - return ret; -} - - -static int make_path(IOHIDDeviceRef device, char *buf, size_t len) -{ - int res; - unsigned short vid, pid; - char transport[32]; - - buf[0] = '\0'; - - res = get_string_property_utf8( - device, CFSTR(kIOHIDTransportKey), - transport, sizeof(transport)); - - if (!res) - return -1; - - vid = get_vendor_id(device); - pid = get_product_id(device); - - res = snprintf(buf, len, "%s_%04hx_%04hx_%p", - transport, vid, pid, device); - - - buf[len-1] = '\0'; - return res+1; -} - -/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ -static int init_hid_manager(void) -{ - - /* Initialize all the HID Manager Objects */ - hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - if (hid_mgr) { - IOHIDManagerSetDeviceMatching(hid_mgr, NULL); - IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - return 0; - } - - return -1; -} - -/* Initialize the IOHIDManager if necessary. This is the public function, and - it is safe to call this function repeatedly. Return 0 for success and -1 - for failure. */ -int HID_API_EXPORT hid_init(void) -{ - if (!hid_mgr) { - return init_hid_manager(); - } - - /* Already initialized. */ - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ - if (hid_mgr) { - /* Close the HID manager. */ - IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); - CFRelease(hid_mgr); - hid_mgr = NULL; - } - - return 0; -} - -static void process_pending_events() { - SInt32 res; - do { - res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); - } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); -} - -struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - struct hid_device_info *root = NULL; // return object - struct hid_device_info *cur_dev = NULL; - CFIndex num_devices; - int i; - - setlocale(LC_ALL,""); - - /* Set up the HID Manager if it hasn't been done */ - if (hid_init() < 0) - return NULL; - - /* give the IOHIDManager a chance to update itself */ - process_pending_events(); - - /* Get a list of the Devices */ - CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); - if (!device_set) - return NULL; - - /* Convert the list into a C array so we can iterate easily. */ - num_devices = CFSetGetCount(device_set); - if (!num_devices) { - CFRelease(device_set); - return NULL; - } - IOHIDDeviceRef *device_array = (IOHIDDeviceRef*)calloc(num_devices, sizeof(IOHIDDeviceRef)); - CFSetGetValues(device_set, (const void **) device_array); - - /* Iterate over each device, making an entry for it. */ - for (i = 0; i < num_devices; i++) { - unsigned short dev_vid; - unsigned short dev_pid; -#define BUF_LEN 256 - wchar_t buf[BUF_LEN]; - char cbuf[BUF_LEN]; - - IOHIDDeviceRef dev = device_array[i]; - - if (!dev) { - continue; - } - dev_vid = get_vendor_id(dev); - dev_pid = get_product_id(dev); - - /* Check the VID/PID against the arguments */ - if ((vendor_id == 0x0 && product_id == 0x0) || - (vendor_id == dev_vid && product_id == dev_pid)) { - struct hid_device_info *tmp; - size_t len; - - /* VID/PID match. Create the record. */ - tmp = (struct hid_device_info *)malloc(sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - cur_dev = tmp; - - // Get the Usage Page and Usage for this device. - cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); - cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); - - /* Fill out the record */ - cur_dev->next = NULL; - len = make_path(dev, cbuf, sizeof(cbuf)); - cur_dev->path = strdup(cbuf); - - /* Serial Number */ - get_serial_number(dev, buf, BUF_LEN); - cur_dev->serial_number = dup_wcs(buf); - - /* Manufacturer and Product strings */ - get_manufacturer_string(dev, buf, BUF_LEN); - cur_dev->manufacturer_string = dup_wcs(buf); - get_product_string(dev, buf, BUF_LEN); - cur_dev->product_string = dup_wcs(buf); - - /* VID/PID */ - cur_dev->vendor_id = dev_vid; - cur_dev->product_id = dev_pid; - - /* Release Number */ - cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); - - /* Interface Number (Unsupported on Mac)*/ - cur_dev->interface_number = -1; - } - } - - free(device_array); - CFRelease(device_set); - - return root; -} - -void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) -{ - /* This function is identical to the Linux version. Platform independent. */ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - -hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - /* This function is identical to the Linux version. Platform independent. */ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device * handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open, 0); - } - - hid_free_enumeration(devs); - - return handle; -} - -static void hid_device_removal_callback(void *context, IOReturn result, - void *sender, IOHIDDeviceRef dev_ref) -{ - /* Stop the Run Loop for this device. */ - pthread_mutex_lock(&device_list_mutex); - hid_device *d = device_list; - while (d) { - if (d->device_handle == dev_ref) { - d->disconnected = 1; - CFRunLoopStop(d->run_loop); - } - - d = d->next; - } - pthread_mutex_unlock(&device_list_mutex); -} - -/* The Run Loop calls this function for each input report received. - This function puts the data into a linked list to be picked up by - hid_read(). */ -static void hid_report_callback(void *context, IOReturn result, void *sender, - IOHIDReportType report_type, uint32_t report_id, - uint8_t *report, CFIndex report_length) -{ - struct input_report *rpt; - hid_device *dev = (hid_device *)context; - - /* Make a new Input Report object */ - rpt = (struct input_report *)calloc(1, sizeof(struct input_report)); - rpt->data = (uint8_t *)calloc(1, report_length); - memcpy(rpt->data, report, report_length); - rpt->len = report_length; - rpt->next = NULL; - - /* Lock this section */ - pthread_mutex_lock(&dev->mutex); - - /* Attach the new report object to the end of the list. */ - if (dev->input_reports == NULL) { - /* The list is empty. Put it at the root. */ - dev->input_reports = rpt; - } - else { - /* Find the end of the list and attach. */ - struct input_report *cur = dev->input_reports; - int num_queued = 0; - while (cur->next != NULL) { - cur = cur->next; - num_queued++; - } - cur->next = rpt; - - /* Pop one off if we've reached 30 in the queue. This - way we don't grow forever if the user never reads - anything from the device. */ - if (num_queued > 30) { - return_data(dev, NULL, 0); - } - } - - /* Signal a waiting thread that there is data. */ - pthread_cond_signal(&dev->condition); - - /* Unlock */ - pthread_mutex_unlock(&dev->mutex); - -} - -/* This gets called when the read_thred's run loop gets signaled by - hid_close(), and serves to stop the read_thread's run loop. */ -static void perform_signal_callback(void *context) -{ - hid_device *dev = (hid_device *)context; - CFRunLoopStop(dev->run_loop); //TODO: CFRunLoopGetCurrent() -} - -static void *read_thread(void *param) -{ - hid_device *dev = (hid_device *)param; - - /* Move the device's run loop to this thread. */ - IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); - - /* Create the RunLoopSource which is used to signal the - event loop to stop when hid_close() is called. */ - CFRunLoopSourceContext ctx; - memset(&ctx, 0, sizeof(ctx)); - ctx.version = 0; - ctx.info = dev; - ctx.perform = &perform_signal_callback; - dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); - CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); - - /* Store off the Run Loop so it can be stopped from hid_close() - and on device disconnection. */ - dev->run_loop = CFRunLoopGetCurrent(); - - /* Notify the main thread that the read thread is up and running. */ - pthread_barrier_wait(&dev->barrier); - - /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input - reports into the hid_report_callback(). */ - SInt32 code; - while (!dev->shutdown_thread && !dev->disconnected) { - code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); - /* Return if the device has been disconnected */ - if (code == kCFRunLoopRunFinished) { - dev->disconnected = 1; - break; - } - - - /* Break if The Run Loop returns Finished or Stopped. */ - if (code != kCFRunLoopRunTimedOut && - code != kCFRunLoopRunHandledSource) { - /* There was some kind of error. Setting - shutdown seems to make sense, but - there may be something else more appropriate */ - dev->shutdown_thread = 1; - break; - } - } - - /* Now that the read thread is stopping, Wake any threads which are - waiting on data (in hid_read_timeout()). Do this under a mutex to - make sure that a thread which is about to go to sleep waiting on - the condition acutally will go to sleep before the condition is - signaled. */ - pthread_mutex_lock(&dev->mutex); - pthread_cond_broadcast(&dev->condition); - pthread_mutex_unlock(&dev->mutex); - - /* Wait here until hid_close() is called and makes it past - the call to CFRunLoopWakeUp(). This thread still needs to - be valid when that function is called on the other thread. */ - pthread_barrier_wait(&dev->shutdown_barrier); - - return NULL; -} - -hid_device * HID_API_EXPORT hid_open_path(const char *path, int bExclusive) -{ - int i; - hid_device *dev = NULL; - CFIndex num_devices; - - dev = new_hid_device(); - - /* Set up the HID Manager if it hasn't been done */ - if (hid_init() < 0) - return NULL; - - /* give the IOHIDManager a chance to update itself */ - process_pending_events(); - - CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); - - num_devices = CFSetGetCount(device_set); - IOHIDDeviceRef *device_array = (IOHIDDeviceRef *)calloc(num_devices, sizeof(IOHIDDeviceRef)); - CFSetGetValues(device_set, (const void **) device_array); - for (i = 0; i < num_devices; i++) { - char cbuf[BUF_LEN]; - size_t len; - IOHIDDeviceRef os_dev = device_array[i]; - - len = make_path(os_dev, cbuf, sizeof(cbuf)); - if (!strcmp(cbuf, path)) { - // Matched Paths. Open this Device. - IOReturn ret = IOHIDDeviceOpen(os_dev, kIOHIDOptionsTypeNone); - if (ret == kIOReturnSuccess) { - char str[32]; - - free(device_array); - CFRelease(device_set); - dev->device_handle = os_dev; - - /* Create the buffers for receiving data */ - dev->max_input_report_len = (CFIndex) get_max_report_length(os_dev); - dev->input_report_buf = (uint8_t *)calloc(dev->max_input_report_len, sizeof(uint8_t)); - - /* Create the Run Loop Mode for this device. - printing the reference seems to work. */ - sprintf(str, "HIDAPI_%p", os_dev); - dev->run_loop_mode = - CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); - - /* Attach the device to a Run Loop */ - IOHIDDeviceRegisterInputReportCallback( - os_dev, dev->input_report_buf, dev->max_input_report_len, - &hid_report_callback, dev); - IOHIDManagerRegisterDeviceRemovalCallback(hid_mgr, hid_device_removal_callback, NULL); - - /* Start the read thread */ - pthread_create(&dev->thread, NULL, read_thread, dev); - - /* Wait here for the read thread to be initialized. */ - pthread_barrier_wait(&dev->barrier); - - return dev; - } - else { - goto return_error; - } - } - } - -return_error: - free(device_array); - CFRelease(device_set); - free_hid_device(dev); - return NULL; -} - -static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length) -{ - const char *pass_through_magic = "MAGIC0"; - size_t pass_through_magic_length = strlen(pass_through_magic); - unsigned char report_id = data[0]; - const unsigned char *data_to_send; - size_t length_to_send; - IOReturn res; - - /* Return if the device has been disconnected. */ - if (dev->disconnected) - return -1; - - if (report_id == 0x0) { - /* Not using numbered Reports. - Don't send the report number. */ - data_to_send = data+1; - length_to_send = length-1; - } - else if (length > 6 && memcmp(data, pass_through_magic, pass_through_magic_length) == 0) { - report_id = data[pass_through_magic_length]; - data_to_send = data+pass_through_magic_length; - length_to_send = length-pass_through_magic_length; - } - else { - /* Using numbered Reports. - Send the Report Number */ - data_to_send = data; - length_to_send = length; - } - - if (!dev->disconnected) { - res = IOHIDDeviceSetReport(dev->device_handle, - type, - report_id, /* Report ID*/ - data_to_send, length_to_send); - - if (res == kIOReturnSuccess) { - return (int)length; - } - else if (res == kIOReturnUnsupported) { - /*printf("kIOReturnUnsupported\n");*/ - return -1; - } - else { - /*printf("0x%x\n", res);*/ - return -1; - } - } - - return -1; -} - -int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - return set_report(dev, kIOHIDReportTypeOutput, data, length); -} - -/* Helper function, so that this isn't duplicated in hid_read(). */ -static int return_data(hid_device *dev, unsigned char *data, size_t length) -{ - /* Copy the data out of the linked list item (rpt) into the - return buffer (data), and delete the liked list item. */ - struct input_report *rpt = dev->input_reports; - size_t len = (length < rpt->len)? length: rpt->len; - memcpy(data, rpt->data, len); - dev->input_reports = rpt->next; - free(rpt->data); - free(rpt); - return (int)len; -} - -static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - while (!dev->input_reports) { - int res = pthread_cond_wait(cond, mutex); - if (res != 0) - return res; - - /* A res of 0 means we may have been signaled or it may - be a spurious wakeup. Check to see that there's acutally - data in the queue before returning, and if not, go back - to sleep. See the pthread_cond_timedwait() man page for - details. */ - - if (dev->shutdown_thread || dev->disconnected) - return -1; - } - - return 0; -} - -static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) -{ - while (!dev->input_reports) { - int res = pthread_cond_timedwait(cond, mutex, abstime); - if (res != 0) - return res; - - /* A res of 0 means we may have been signaled or it may - be a spurious wakeup. Check to see that there's acutally - data in the queue before returning, and if not, go back - to sleep. See the pthread_cond_timedwait() man page for - details. */ - - if (dev->shutdown_thread || dev->disconnected) - return -1; - } - - return 0; - -} - -int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - int bytes_read = -1; - - /* Lock the access to the report list. */ - pthread_mutex_lock(&dev->mutex); - - /* There's an input report queued up. Return it. */ - if (dev->input_reports) { - /* Return the first one */ - bytes_read = return_data(dev, data, length); - goto ret; - } - - /* Return if the device has been disconnected. */ - if (dev->disconnected) { - bytes_read = -1; - goto ret; - } - - if (dev->shutdown_thread) { - /* This means the device has been closed (or there - has been an error. An error code of -1 should - be returned. */ - bytes_read = -1; - goto ret; - } - - /* There is no data. Go to sleep and wait for data. */ - - if (milliseconds == -1) { - /* Blocking */ - int res; - res = cond_wait(dev, &dev->condition, &dev->mutex); - if (res == 0) - bytes_read = return_data(dev, data, length); - else { - /* There was an error, or a device disconnection. */ - bytes_read = -1; - } - } - else if (milliseconds > 0) { - /* Non-blocking, but called with timeout. */ - int res; - struct timespec ts; - struct timeval tv; - gettimeofday(&tv, NULL); - TIMEVAL_TO_TIMESPEC(&tv, &ts); - ts.tv_sec += milliseconds / 1000; - ts.tv_nsec += (milliseconds % 1000) * 1000000; - if (ts.tv_nsec >= 1000000000L) { - ts.tv_sec++; - ts.tv_nsec -= 1000000000L; - } - - res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); - if (res == 0) - bytes_read = return_data(dev, data, length); - else if (res == ETIMEDOUT) - bytes_read = 0; - else - bytes_read = -1; - } - else { - /* Purely non-blocking */ - bytes_read = 0; - } - -ret: - /* Unlock */ - pthread_mutex_unlock(&dev->mutex); - return bytes_read; -} - -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); -} - -int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) -{ - /* All Nonblocking operation is handled by the library. */ - dev->blocking = !nonblock; - - return 0; -} - -int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - return set_report(dev, kIOHIDReportTypeFeature, data, length); -} - -int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - CFIndex len = length; - IOReturn res; - - /* Return if the device has been unplugged. */ - if (dev->disconnected) - return -1; - - int skipped_report_id = 0; - int report_number = data[0]; - if (report_number == 0x0) { - /* Offset the return buffer by 1, so that the report ID - will remain in byte 0. */ - data++; - len--; - skipped_report_id = 1; - } - - res = IOHIDDeviceGetReport(dev->device_handle, - kIOHIDReportTypeFeature, - report_number, /* Report ID */ - data, &len); - if (res != kIOReturnSuccess) - return -1; - - if (skipped_report_id) - len++; - - return (int)len; -} - - -void HID_API_EXPORT hid_close(hid_device *dev) -{ - if (!dev) - return; - - /* Disconnect the report callback before close. */ - if (!dev->disconnected) { - IOHIDDeviceRegisterInputReportCallback( - dev->device_handle, dev->input_report_buf, dev->max_input_report_len, - NULL, dev); - IOHIDManagerRegisterDeviceRemovalCallback(hid_mgr, NULL, dev); - IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); - IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); - } - - /* Cause read_thread() to stop. */ - dev->shutdown_thread = 1; - - /* Wake up the run thread's event loop so that the thread can exit. */ - CFRunLoopSourceSignal(dev->source); - CFRunLoopWakeUp(dev->run_loop); - - /* Notify the read thread that it can shut down now. */ - pthread_barrier_wait(&dev->shutdown_barrier); - - /* Wait for read_thread() to end. */ - pthread_join(dev->thread, NULL); - - /* Close the OS handle to the device, but only if it's not - been unplugged. If it's been unplugged, then calling - IOHIDDeviceClose() will crash. */ - if (!dev->disconnected) { - IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeNone); - } - - /* Clear out the queue of received reports. */ - pthread_mutex_lock(&dev->mutex); - while (dev->input_reports) { - return_data(dev, NULL, 0); - } - pthread_mutex_unlock(&dev->mutex); - - free_hid_device(dev); -} - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_manufacturer_string(dev->device_handle, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_product_string(dev->device_handle, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_serial_number(dev->device_handle, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - // TODO: - - return 0; -} - - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - // TODO: - - return NULL; -} - - - - - - -#if 0 -static int32_t get_location_id(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDLocationIDKey)); -} - -static int32_t get_usage(IOHIDDeviceRef device) -{ - int32_t res; - res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey)); - if (!res) - res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); - return res; -} - -static int32_t get_usage_page(IOHIDDeviceRef device) -{ - int32_t res; - res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey)); - if (!res) - res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); - return res; -} - -static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len); -} - - -int main(void) -{ - IOHIDManagerRef mgr; - int i; - - mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - IOHIDManagerSetDeviceMatching(mgr, NULL); - IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone); - - CFSetRef device_set = IOHIDManagerCopyDevices(mgr); - - CFIndex num_devices = CFSetGetCount(device_set); - IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); - CFSetGetValues(device_set, (const void **) device_array); - - setlocale(LC_ALL, ""); - - for (i = 0; i < num_devices; i++) { - IOHIDDeviceRef dev = device_array[i]; - printf("Device: %p\n", dev); - printf(" %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev)); - - wchar_t serial[256], buf[256]; - char cbuf[256]; - get_serial_number(dev, serial, 256); - - - printf(" Serial: %ls\n", serial); - printf(" Loc: %ld\n", get_location_id(dev)); - get_transport(dev, buf, 256); - printf(" Trans: %ls\n", buf); - make_path(dev, cbuf, 256); - printf(" Path: %s\n", cbuf); - - } - - return 0; -} -#endif - -#endif /* SDL_JOYSTICK_HIDAPI */ diff --git a/Source/3rdParty/SDL2/src/hidapi/pc/hidapi-hidraw.pc.in b/Source/3rdParty/SDL2/src/hidapi/pc/hidapi-hidraw.pc.in deleted file mode 100644 index e20558d..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/pc/hidapi-hidraw.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: hidapi-hidraw -Description: C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the hidraw implementation. -Version: @VERSION@ -Libs: -L${libdir} -lhidapi-hidraw -Cflags: -I${includedir}/hidapi diff --git a/Source/3rdParty/SDL2/src/hidapi/pc/hidapi-libusb.pc.in b/Source/3rdParty/SDL2/src/hidapi/pc/hidapi-libusb.pc.in deleted file mode 100644 index 2e49506..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/pc/hidapi-libusb.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: hidapi-libusb -Description: C Library for USB HID device access from Linux, Mac OS X, FreeBSD, and Windows. This is the libusb implementation. -Version: @VERSION@ -Libs: -L${libdir} -lhidapi-libusb -Cflags: -I${includedir}/hidapi diff --git a/Source/3rdParty/SDL2/src/hidapi/pc/hidapi.pc.in b/Source/3rdParty/SDL2/src/hidapi/pc/hidapi.pc.in deleted file mode 100644 index 5835c99..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/pc/hidapi.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: hidapi -Description: C Library for USB/Bluetooth HID device access from Linux, Mac OS X, FreeBSD, and Windows. -Version: @VERSION@ -Libs: -L${libdir} -lhidapi -Cflags: -I${includedir}/hidapi diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile-manual b/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile-manual deleted file mode 100644 index 3f61705..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile-manual +++ /dev/null @@ -1,26 +0,0 @@ - - -OS=$(shell uname) - -ifeq ($(OS), Darwin) - FILE=Makefile.mac -endif - -ifneq (,$(findstring MINGW,$(OS))) - FILE=Makefile.mingw -endif - -ifeq ($(OS), Linux) - FILE=Makefile.linux -endif - -ifeq ($(OS), FreeBSD) - FILE=Makefile.freebsd -endif - -ifeq ($(FILE), ) -all: - $(error Your platform ${OS} is not supported at this time.) -endif - -include $(FILE) diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.am deleted file mode 100644 index 1c02f3f..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.am +++ /dev/null @@ -1,43 +0,0 @@ - -AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ $(CFLAGS_TESTGUI) - -if OS_LINUX -## Linux -bin_PROGRAMS = hidapi-hidraw-testgui hidapi-libusb-testgui - -hidapi_hidraw_testgui_SOURCES = test.cpp -hidapi_hidraw_testgui_LDADD = $(top_builddir)/linux/libhidapi-hidraw.la $(LIBS_TESTGUI) - -hidapi_libusb_testgui_SOURCES = test.cpp -hidapi_libusb_testgui_LDADD = $(top_builddir)/libusb/libhidapi-libusb.la $(LIBS_TESTGUI) -else -## Other OS's -bin_PROGRAMS = hidapi-testgui - -hidapi_testgui_SOURCES = test.cpp -hidapi_testgui_LDADD = $(top_builddir)/$(backend)/libhidapi.la $(LIBS_TESTGUI) -endif - -if OS_DARWIN -hidapi_testgui_SOURCES = test.cpp mac_support_cocoa.m mac_support.h -# Rules for copying the binary and its dependencies into the app bundle. -TestGUI.app/Contents/MacOS/hidapi-testgui$(EXEEXT): hidapi-testgui$(EXEEXT) - $(srcdir)/copy_to_bundle.sh - -all: all-am TestGUI.app/Contents/MacOS/hidapi-testgui$(EXEEXT) - -endif - -EXTRA_DIST = \ - copy_to_bundle.sh \ - Makefile-manual \ - Makefile.freebsd \ - Makefile.linux \ - Makefile.mac \ - Makefile.mingw \ - TestGUI.app.in \ - testgui.sln \ - testgui.vcproj - -distclean-local: - rm -rf TestGUI.app diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.freebsd b/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.freebsd deleted file mode 100644 index 09a2473..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.freebsd +++ /dev/null @@ -1,33 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: testgui - -CC=cc -CXX=c++ -COBJS=../libusb/hid.o -CPPOBJS=test.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS=-I../hidapi -I/usr/local/include `fox-config --cflags` -Wall -g -c -LDFLAGS= -L/usr/local/lib -LIBS= -lusb -liconv `fox-config --libs` -pthread - - -testgui: $(OBJS) - $(CXX) -Wall -g $^ $(LDFLAGS) -o $@ $(LIBS) - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -clean: - rm *.o testgui - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.linux b/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.linux deleted file mode 100644 index d32e163..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.linux +++ /dev/null @@ -1,32 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: testgui - -CC=gcc -CXX=g++ -COBJS=../libusb/hid.o -CPPOBJS=test.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS=-I../hidapi -Wall -g -c `fox-config --cflags` `pkg-config libusb-1.0 --cflags` -LIBS=-ludev -lrt -lpthread `fox-config --libs` `pkg-config libusb-1.0 --libs` - - -testgui: $(OBJS) - g++ -Wall -g $^ $(LIBS) -o testgui - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -clean: - rm *.o testgui - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.mac b/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.mac deleted file mode 100644 index cda7d49..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.mac +++ /dev/null @@ -1,46 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-07-03 -########################################### - -all: hidapi-testgui - -CC=gcc -CXX=g++ -COBJS=../mac/hid.o -CPPOBJS=test.o -OBJCOBJS=mac_support_cocoa.o -OBJS=$(COBJS) $(CPPOBJS) $(OBJCOBJS) -CFLAGS=-I../hidapi -Wall -g -c `fox-config --cflags` -LDFLAGS=-L/usr/X11R6/lib -LIBS=`fox-config --libs` -framework IOKit -framework CoreFoundation -framework Cocoa - - -hidapi-testgui: $(OBJS) TestGUI.app - g++ -Wall -g $(OBJS) $(LIBS) $(LDFLAGS) -o hidapi-testgui - ./copy_to_bundle.sh - #cp TestGUI.app/Contents/MacOS/hidapi-testgui TestGUI.app/Contents/MacOS/tg - #cp start.sh TestGUI.app/Contents/MacOS/hidapi-testgui - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -$(OBJCOBJS): %.o: %.m - $(CXX) $(CFLAGS) -x objective-c++ $< -o $@ - -TestGUI.app: TestGUI.app.in - rm -Rf TestGUI.app - mkdir -p TestGUI.app - cp -R TestGUI.app.in/ TestGUI.app - -clean: - rm -f $(OBJS) hidapi-testgui - rm -Rf TestGUI.app - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.mingw b/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.mingw deleted file mode 100644 index df0f69d..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/Makefile.mingw +++ /dev/null @@ -1,32 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: hidapi-testgui - -CC=gcc -CXX=g++ -COBJS=../windows/hid.o -CPPOBJS=test.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS=-I../hidapi -I../../hidapi-externals/fox/include -g -c -LIBS= -mwindows -lsetupapi -L../../hidapi-externals/fox/lib -Wl,-Bstatic -lFOX-1.6 -Wl,-Bdynamic -lgdi32 -Wl,--enable-auto-import -static-libgcc -static-libstdc++ -lkernel32 - - -hidapi-testgui: $(OBJS) - g++ -g $^ $(LIBS) -o hidapi-testgui - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -clean: - rm -f *.o hidapi-testgui.exe - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Info.plist b/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Info.plist deleted file mode 100644 index ab473d5..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> -<plist version="1.0"> -<dict> - <key>CFBundleDevelopmentRegion</key> - <string>English</string> - <key>CFBundleDisplayName</key> - <string></string> - <key>CFBundleExecutable</key> - <string>hidapi-testgui</string> - <key>CFBundleIconFile</key> - <string>Signal11.icns</string> - <key>CFBundleIdentifier</key> - <string>us.signal11.hidtestgui</string> - <key>CFBundleInfoDictionaryVersion</key> - <string>6.0</string> - <key>CFBundleName</key> - <string>testgui</string> - <key>CFBundlePackageType</key> - <string>APPL</string> - <key>CFBundleSignature</key> - <string>????</string> - <key>CFBundleVersion</key> - <string>1.0</string> - <key>CSResourcesFileMapped</key> - <true/> -</dict> -</plist> diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/PkgInfo b/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/PkgInfo deleted file mode 100644 index bd04210..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/PkgInfo +++ /dev/null @@ -1 +0,0 @@ -APPL????
\ No newline at end of file diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Resources/English.lproj/InfoPlist.strings b/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Resources/English.lproj/InfoPlist.strings Binary files differdeleted file mode 100644 index dea12de..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Resources/English.lproj/InfoPlist.strings +++ /dev/null diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Resources/Signal11.icns b/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Resources/Signal11.icns Binary files differdeleted file mode 100644 index bb6b7bd..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/TestGUI.app.in/Contents/Resources/Signal11.icns +++ /dev/null diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/copy_to_bundle.sh b/Source/3rdParty/SDL2/src/hidapi/testgui/copy_to_bundle.sh deleted file mode 100644 index f0fc767..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/copy_to_bundle.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash - -#### Configuration: -# The name of the executable. It is assumed -# that it is in the current working directory. -EXE_NAME=hidapi-testgui -# Path to the executable directory inside the bundle. -# This must be an absolute path, so use $PWD. -EXEPATH=$PWD/TestGUI.app/Contents/MacOS -# Libraries to explicitly bundle, even though they -# may not be in /opt/local. One per line. These -# are used with grep, so only a portion of the name -# is required. eg: libFOX, libz, etc. -LIBS_TO_BUNDLE=libFOX - - -function copydeps { - local file=$1 - # echo "Copying deps for $file...." - local BASE_OF_EXE=`basename $file` - - # A will contain the dependencies of this library - local A=`otool -LX $file |cut -f 1 -d " "` - local i - for i in $A; do - local BASE=`basename $i` - - # See if it's a lib we specifically want to bundle - local bundle_this_lib=0 - local j - for j in $LIBS_TO_BUNDLE; do - echo $i |grep -q $j - if [ $? -eq 0 ]; then - bundle_this_lib=1 - echo "bundling $i because it's in the list." - break; - fi - done - - # See if it's in /opt/local. Bundle all in /opt/local - local isOptLocal=0 - echo $i |grep -q /opt/local - if [ $? -eq 0 ]; then - isOptLocal=1 - echo "bundling $i because it's in /opt/local." - fi - - # Bundle the library - if [ $isOptLocal -ne 0 ] || [ $bundle_this_lib -ne 0 ]; then - - # Copy the file into the bundle if it exists. - if [ -f $EXEPATH/$BASE ]; then - z=0 - else - cp $i $EXEPATH - chmod 755 $EXEPATH/$BASE - fi - - - # echo "$BASE_OF_EXE depends on $BASE" - - # Fix the paths using install_name_tool and then - # call this function recursively for each dependency - # of this library. - if [ $BASE_OF_EXE != $BASE ]; then - - # Fix the paths - install_name_tool -id @executable_path/$BASE $EXEPATH/$BASE - install_name_tool -change $i @executable_path/$BASE $EXEPATH/$BASE_OF_EXE - - # Call this function (recursive) on - # on each dependency of this library. - copydeps $EXEPATH/$BASE - fi - fi - done -} - -rm -f $EXEPATH/* - -# Copy the binary into the bundle. Use ../libtool to do this if it's -# available beacuse if $EXE_NAME was built with autotools, it will be -# necessary. If ../libtool not available, just use cp to do the copy, but -# only if $EXE_NAME is a binary. -if [ -x ../libtool ]; then - ../libtool --mode=install cp $EXE_NAME $EXEPATH -else - file -bI $EXE_NAME |grep binary - if [ $? -ne 0 ]; then - echo "There is no ../libtool and $EXE_NAME is not a binary." - echo "I'm not sure what to do." - exit 1 - else - cp $EXE_NAME $EXEPATH - fi -fi -copydeps $EXEPATH/$EXE_NAME diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support.cpp b/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support.cpp deleted file mode 100644 index e1e3874..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/******************************* - Mac support for HID Test GUI - - Alan Ott - Signal 11 Software - - Some of this code is from Apple Documentation, most notably - http://developer.apple.com/legacy/mac/library/documentation/AppleScript/Conceptual/AppleEvents/AppleEvents.pdf -*******************************/ - -#include <Carbon/Carbon.h> -#include <fx.h> - - -extern FXMainWindow *g_main_window; - -static pascal OSErr HandleQuitMessage(const AppleEvent *theAppleEvent, AppleEvent - *reply, long handlerRefcon) -{ - puts("Quitting\n"); - FXApp::instance()->exit(); - return 0; -} - -static pascal OSErr HandleReopenMessage(const AppleEvent *theAppleEvent, AppleEvent - *reply, long handlerRefcon) -{ - puts("Showing"); - g_main_window->show(); - return 0; -} - -static pascal OSErr HandleWildCardMessage(const AppleEvent *theAppleEvent, AppleEvent - *reply, long handlerRefcon) -{ - puts("WildCard\n"); - return 0; -} - -OSStatus AEHandler(EventHandlerCallRef inCaller, EventRef inEvent, void* inRefcon) -{ - Boolean release = false; - EventRecord eventRecord; - OSErr ignoreErrForThisSample; - - // Events of type kEventAppleEvent must be removed from the queue - // before being passed to AEProcessAppleEvent. - if (IsEventInQueue(GetMainEventQueue(), inEvent)) - { - // RemoveEventFromQueue will release the event, which will - // destroy it if we don't retain it first. - RetainEvent(inEvent); - release = true; - RemoveEventFromQueue(GetMainEventQueue(), inEvent); - } - // Convert the event ref to the type AEProcessAppleEvent expects. - ConvertEventRefToEventRecord(inEvent, &eventRecord); - ignoreErrForThisSample = AEProcessAppleEvent(&eventRecord); - if (release) - ReleaseEvent(inEvent); - // This Carbon event has been handled, even if no AppleEvent handlers - // were installed for the Apple event. - return noErr; -} - -static void HandleEvent(EventRecord *event) -{ - //printf("What: %d message %x\n", event->what, event->message); - if (event->what == osEvt) { - if (((event->message >> 24) & 0xff) == suspendResumeMessage) { - if (event->message & resumeFlag) { - g_main_window->show(); - } - } - } - -#if 0 - switch (event->what) - { - case mouseDown: - //HandleMouseDown(event); - break; - case keyDown: - case autoKey: - //HandleKeyPress(event); - break; - case kHighLevelEvent: - puts("Calling ProcessAppleEvent\n"); - AEProcessAppleEvent(event); - break; - } -#endif -} - -void -init_apple_message_system() -{ - OSErr err; - static const EventTypeSpec appleEvents[] = - { - { kEventClassAppleEvent, kEventAppleEvent } - }; - - /* Install the handler for Apple Events */ - InstallApplicationEventHandler(NewEventHandlerUPP(AEHandler), - GetEventTypeCount(appleEvents), appleEvents, 0, NULL); - - /* Install handlers for the individual Apple Events that come - from the Dock icon: the Reopen (click), and the Quit messages. */ - err = AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, - NewAEEventHandlerUPP(HandleQuitMessage), 0, false); - err = AEInstallEventHandler(kCoreEventClass, kAEReopenApplication, - NewAEEventHandlerUPP(HandleReopenMessage), 0, false); -#if 0 - // Left as an example of a wild card match. - err = AEInstallEventHandler(kCoreEventClass, typeWildCard, - NewAEEventHandlerUPP(HandleWildMessage), 0, false); -#endif -} - -void -check_apple_events() -{ - RgnHandle cursorRgn = NULL; - Boolean gotEvent=TRUE; - EventRecord event; - - while (gotEvent) { - gotEvent = WaitNextEvent(everyEvent, &event, 0L/*timeout*/, cursorRgn); - if (gotEvent) { - HandleEvent(&event); - } - } -} diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support.h b/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support.h deleted file mode 100644 index 7d9ab49..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support.h +++ /dev/null @@ -1,17 +0,0 @@ -/******************************* - Mac support for HID Test GUI - - Alan Ott - Signal 11 Software - -*******************************/ - -#ifndef MAC_SUPPORT_H__ -#define MAC_SUPPORT_H__ - -extern "C" { - void init_apple_message_system(); - void check_apple_events(); -} - -#endif diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support_cocoa.m b/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support_cocoa.m deleted file mode 100644 index 75de7e9..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/mac_support_cocoa.m +++ /dev/null @@ -1,94 +0,0 @@ -/******************************* - Mac support for HID Test GUI - - Alan Ott - Signal 11 Software -*******************************/ - -#include <fx.h> -#import <Cocoa/Cocoa.h> - -extern FXMainWindow *g_main_window; - - -@interface MyAppDelegate : NSObject -{ -} -@end - -@implementation MyAppDelegate -- (void) applicationWillBecomeActive:(NSNotification*)notif -{ - printf("WillBecomeActive\n"); - g_main_window->show(); - -} - -- (void) applicationWillTerminate:(NSNotification*)notif -{ - /* Doesn't get called. Not sure why */ - printf("WillTerminate\n"); - FXApp::instance()->exit(); -} - -- (NSApplicationTerminateReply) applicationShouldTerminate:(NSApplication*)sender -{ - /* Doesn't get called. Not sure why */ - printf("ShouldTerminate\n"); - return YES; -} - -- (void) applicationWillHide:(NSNotification*)notif -{ - printf("WillHide\n"); - g_main_window->hide(); -} - -- (void) handleQuitEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent -{ - printf("QuitEvent\n"); - FXApp::instance()->exit(); -} - -@end - -extern "C" { - -void -init_apple_message_system() -{ - static MyAppDelegate *d = [MyAppDelegate new]; - - [[NSApplication sharedApplication] setDelegate:d]; - - /* Register for Apple Events. */ - /* This is from - http://stackoverflow.com/questions/1768497/application-exit-event */ - NSAppleEventManager *aem = [NSAppleEventManager sharedAppleEventManager]; - [aem setEventHandler:d - andSelector:@selector(handleQuitEvent:withReplyEvent:) - forEventClass:kCoreEventClass andEventID:kAEQuitApplication]; -} - -void -check_apple_events() -{ - NSApplication *app = [NSApplication sharedApplication]; - - NSAutoreleasePool *pool = [NSAutoreleasePool new]; - while (1) { - NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask - untilDate:nil - inMode:NSDefaultRunLoopMode - dequeue:YES]; - if (event == NULL) - break; - else { - //printf("Event happened: Type: %d\n", event->_type); - [app sendEvent: event]; - } - } - [pool release]; -} - -} /* extern "C" */ diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/start.sh b/Source/3rdParty/SDL2/src/hidapi/testgui/start.sh deleted file mode 100644 index 980635d..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/start.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -xterm -e /Users/alan/work/hidapi/testgui/TestGUI.app/Contents/MacOS/tg diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/test.cpp b/Source/3rdParty/SDL2/src/hidapi/testgui/test.cpp deleted file mode 100644 index 538db79..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/test.cpp +++ /dev/null @@ -1,532 +0,0 @@ -/******************************************************* - Demo Program for HIDAPI - - Alan Ott - Signal 11 Software - - 2010-07-20 - - Copyright 2010, All Rights Reserved - - This contents of this file may be used by anyone - for any reason without any conditions and may be - used as a starting point for your own applications - which use HIDAPI. -********************************************************/ - - -#include <fx.h> - -#include "hidapi.h" -#include "mac_support.h" -#include <string.h> -#include <stdlib.h> -#include <limits.h> - -#ifdef _WIN32 - // Thanks Microsoft, but I know how to use strncpy(). - #pragma warning(disable:4996) -#endif - -class MainWindow : public FXMainWindow { - FXDECLARE(MainWindow) - -public: - enum { - ID_FIRST = FXMainWindow::ID_LAST, - ID_CONNECT, - ID_DISCONNECT, - ID_RESCAN, - ID_SEND_OUTPUT_REPORT, - ID_SEND_FEATURE_REPORT, - ID_GET_FEATURE_REPORT, - ID_CLEAR, - ID_TIMER, - ID_MAC_TIMER, - ID_LAST, - }; - -private: - FXList *device_list; - FXButton *connect_button; - FXButton *disconnect_button; - FXButton *rescan_button; - FXButton *output_button; - FXLabel *connected_label; - FXTextField *output_text; - FXTextField *output_len; - FXButton *feature_button; - FXButton *get_feature_button; - FXTextField *feature_text; - FXTextField *feature_len; - FXTextField *get_feature_text; - FXText *input_text; - FXFont *title_font; - - struct hid_device_info *devices; - hid_device *connected_device; - size_t getDataFromTextField(FXTextField *tf, char *buf, size_t len); - int getLengthFromTextField(FXTextField *tf); - - -protected: - MainWindow() {}; -public: - MainWindow(FXApp *a); - ~MainWindow(); - virtual void create(); - - long onConnect(FXObject *sender, FXSelector sel, void *ptr); - long onDisconnect(FXObject *sender, FXSelector sel, void *ptr); - long onRescan(FXObject *sender, FXSelector sel, void *ptr); - long onSendOutputReport(FXObject *sender, FXSelector sel, void *ptr); - long onSendFeatureReport(FXObject *sender, FXSelector sel, void *ptr); - long onGetFeatureReport(FXObject *sender, FXSelector sel, void *ptr); - long onClear(FXObject *sender, FXSelector sel, void *ptr); - long onTimeout(FXObject *sender, FXSelector sel, void *ptr); - long onMacTimeout(FXObject *sender, FXSelector sel, void *ptr); -}; - -// FOX 1.7 changes the timeouts to all be nanoseconds. -// Fox 1.6 had all timeouts as milliseconds. -#if (FOX_MINOR >= 7) - const int timeout_scalar = 1000*1000; -#else - const int timeout_scalar = 1; -#endif - -FXMainWindow *g_main_window; - - -FXDEFMAP(MainWindow) MainWindowMap [] = { - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_CONNECT, MainWindow::onConnect ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_DISCONNECT, MainWindow::onDisconnect ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_RESCAN, MainWindow::onRescan ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SEND_OUTPUT_REPORT, MainWindow::onSendOutputReport ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SEND_FEATURE_REPORT, MainWindow::onSendFeatureReport ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_GET_FEATURE_REPORT, MainWindow::onGetFeatureReport ), - FXMAPFUNC(SEL_COMMAND, MainWindow::ID_CLEAR, MainWindow::onClear ), - FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_TIMER, MainWindow::onTimeout ), - FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_MAC_TIMER, MainWindow::onMacTimeout ), -}; - -FXIMPLEMENT(MainWindow, FXMainWindow, MainWindowMap, ARRAYNUMBER(MainWindowMap)); - -MainWindow::MainWindow(FXApp *app) - : FXMainWindow(app, "HIDAPI Test Application", NULL, NULL, DECOR_ALL, 200,100, 425,700) -{ - devices = NULL; - connected_device = NULL; - - FXVerticalFrame *vf = new FXVerticalFrame(this, LAYOUT_FILL_Y|LAYOUT_FILL_X); - - FXLabel *label = new FXLabel(vf, "HIDAPI Test Tool"); - title_font = new FXFont(getApp(), "Arial", 14, FXFont::Bold); - label->setFont(title_font); - - new FXLabel(vf, - "Select a device and press Connect.", NULL, JUSTIFY_LEFT); - new FXLabel(vf, - "Output data bytes can be entered in the Output section, \n" - "separated by space, comma or brackets. Data starting with 0x\n" - "is treated as hex. Data beginning with a 0 is treated as \n" - "octal. All other data is treated as decimal.", NULL, JUSTIFY_LEFT); - new FXLabel(vf, - "Data received from the device appears in the Input section.", - NULL, JUSTIFY_LEFT); - new FXLabel(vf, - "Optionally, a report length may be specified. Extra bytes are\n" - "padded with zeros. If no length is specified, the length is \n" - "inferred from the data.", - NULL, JUSTIFY_LEFT); - new FXLabel(vf, ""); - - // Device List and Connect/Disconnect buttons - FXHorizontalFrame *hf = new FXHorizontalFrame(vf, LAYOUT_FILL_X); - //device_list = new FXList(new FXHorizontalFrame(hf,FRAME_SUNKEN|FRAME_THICK, 0,0,0,0, 0,0,0,0), NULL, 0, LISTBOX_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0,0,300,200); - device_list = new FXList(new FXHorizontalFrame(hf,FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,0,0, 0,0,0,0), NULL, 0, LISTBOX_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_Y, 0,0,300,200); - FXVerticalFrame *buttonVF = new FXVerticalFrame(hf); - connect_button = new FXButton(buttonVF, "Connect", NULL, this, ID_CONNECT, BUTTON_NORMAL|LAYOUT_FILL_X); - disconnect_button = new FXButton(buttonVF, "Disconnect", NULL, this, ID_DISCONNECT, BUTTON_NORMAL|LAYOUT_FILL_X); - disconnect_button->disable(); - rescan_button = new FXButton(buttonVF, "Re-Scan devices", NULL, this, ID_RESCAN, BUTTON_NORMAL|LAYOUT_FILL_X); - new FXHorizontalFrame(buttonVF, 0, 0,0,0,0, 0,0,50,0); - - connected_label = new FXLabel(vf, "Disconnected"); - - new FXHorizontalFrame(vf); - - // Output Group Box - FXGroupBox *gb = new FXGroupBox(vf, "Output", FRAME_GROOVE|LAYOUT_FILL_X); - FXMatrix *matrix = new FXMatrix(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_FILL_X); - new FXLabel(matrix, "Data"); - new FXLabel(matrix, "Length"); - new FXLabel(matrix, ""); - - //hf = new FXHorizontalFrame(gb, LAYOUT_FILL_X); - output_text = new FXTextField(matrix, 30, NULL, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); - output_text->setText("1 0x81 0"); - output_len = new FXTextField(matrix, 5, NULL, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); - output_button = new FXButton(matrix, "Send Output Report", NULL, this, ID_SEND_OUTPUT_REPORT, BUTTON_NORMAL|LAYOUT_FILL_X); - output_button->disable(); - //new FXHorizontalFrame(matrix, LAYOUT_FILL_X); - - //hf = new FXHorizontalFrame(gb, LAYOUT_FILL_X); - feature_text = new FXTextField(matrix, 30, NULL, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); - feature_len = new FXTextField(matrix, 5, NULL, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); - feature_button = new FXButton(matrix, "Send Feature Report", NULL, this, ID_SEND_FEATURE_REPORT, BUTTON_NORMAL|LAYOUT_FILL_X); - feature_button->disable(); - - get_feature_text = new FXTextField(matrix, 30, NULL, 0, TEXTFIELD_NORMAL|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN); - new FXWindow(matrix); - get_feature_button = new FXButton(matrix, "Get Feature Report", NULL, this, ID_GET_FEATURE_REPORT, BUTTON_NORMAL|LAYOUT_FILL_X); - get_feature_button->disable(); - - - // Input Group Box - gb = new FXGroupBox(vf, "Input", FRAME_GROOVE|LAYOUT_FILL_X|LAYOUT_FILL_Y); - FXVerticalFrame *innerVF = new FXVerticalFrame(gb, LAYOUT_FILL_X|LAYOUT_FILL_Y); - input_text = new FXText(new FXHorizontalFrame(innerVF,LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK, 0,0,0,0, 0,0,0,0), NULL, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y); - input_text->setEditable(false); - new FXButton(innerVF, "Clear", NULL, this, ID_CLEAR, BUTTON_NORMAL|LAYOUT_RIGHT); - - -} - -MainWindow::~MainWindow() -{ - if (connected_device) - hid_close(connected_device); - hid_exit(); - delete title_font; -} - -void -MainWindow::create() -{ - FXMainWindow::create(); - show(); - - onRescan(NULL, 0, NULL); - - -#ifdef __APPLE__ - init_apple_message_system(); -#endif - - getApp()->addTimeout(this, ID_MAC_TIMER, - 50 * timeout_scalar /*50ms*/); -} - -long -MainWindow::onConnect(FXObject *sender, FXSelector sel, void *ptr) -{ - if (connected_device != NULL) - return 1; - - FXint cur_item = device_list->getCurrentItem(); - if (cur_item < 0) - return -1; - FXListItem *item = device_list->getItem(cur_item); - if (!item) - return -1; - struct hid_device_info *device_info = (struct hid_device_info*) item->getData(); - if (!device_info) - return -1; - - connected_device = hid_open_path(device_info->path); - - if (!connected_device) { - FXMessageBox::error(this, MBOX_OK, "Device Error", "Unable To Connect to Device"); - return -1; - } - - hid_set_nonblocking(connected_device, 1); - - getApp()->addTimeout(this, ID_TIMER, - 5 * timeout_scalar /*5ms*/); - - FXString s; - s.format("Connected to: %04hx:%04hx -", device_info->vendor_id, device_info->product_id); - s += FXString(" ") + device_info->manufacturer_string; - s += FXString(" ") + device_info->product_string; - connected_label->setText(s); - output_button->enable(); - feature_button->enable(); - get_feature_button->enable(); - connect_button->disable(); - disconnect_button->enable(); - input_text->setText(""); - - - return 1; -} - -long -MainWindow::onDisconnect(FXObject *sender, FXSelector sel, void *ptr) -{ - hid_close(connected_device); - connected_device = NULL; - connected_label->setText("Disconnected"); - output_button->disable(); - feature_button->disable(); - get_feature_button->disable(); - connect_button->enable(); - disconnect_button->disable(); - - getApp()->removeTimeout(this, ID_TIMER); - - return 1; -} - -long -MainWindow::onRescan(FXObject *sender, FXSelector sel, void *ptr) -{ - struct hid_device_info *cur_dev; - - device_list->clearItems(); - - // List the Devices - hid_free_enumeration(devices); - devices = hid_enumerate(0x0, 0x0); - cur_dev = devices; - while (cur_dev) { - // Add it to the List Box. - FXString s; - FXString usage_str; - s.format("%04hx:%04hx -", cur_dev->vendor_id, cur_dev->product_id); - s += FXString(" ") + cur_dev->manufacturer_string; - s += FXString(" ") + cur_dev->product_string; - usage_str.format(" (usage: %04hx:%04hx) ", cur_dev->usage_page, cur_dev->usage); - s += usage_str; - FXListItem *li = new FXListItem(s, NULL, cur_dev); - device_list->appendItem(li); - - cur_dev = cur_dev->next; - } - - if (device_list->getNumItems() == 0) - device_list->appendItem("*** No Devices Connected ***"); - else { - device_list->selectItem(0); - } - - return 1; -} - -size_t -MainWindow::getDataFromTextField(FXTextField *tf, char *buf, size_t len) -{ - const char *delim = " ,{}\t\r\n"; - FXString data = tf->getText(); - const FXchar *d = data.text(); - size_t i = 0; - - // Copy the string from the GUI. - size_t sz = strlen(d); - char *str = (char*) malloc(sz+1); - strcpy(str, d); - - // For each token in the string, parse and store in buf[]. - char *token = strtok(str, delim); - while (token) { - char *endptr; - long int val = strtol(token, &endptr, 0); - buf[i++] = val; - token = strtok(NULL, delim); - } - - free(str); - return i; -} - -/* getLengthFromTextField() - Returns length: - 0: empty text field - >0: valid length - -1: invalid length */ -int -MainWindow::getLengthFromTextField(FXTextField *tf) -{ - long int len; - FXString str = tf->getText(); - size_t sz = str.length(); - - if (sz > 0) { - char *endptr; - len = strtol(str.text(), &endptr, 0); - if (endptr != str.text() && *endptr == '\0') { - if (len <= 0) { - FXMessageBox::error(this, MBOX_OK, "Invalid length", "Enter a length greater than zero."); - return -1; - } - return len; - } - else - return -1; - } - - return 0; -} - -long -MainWindow::onSendOutputReport(FXObject *sender, FXSelector sel, void *ptr) -{ - char buf[256]; - size_t data_len, len; - int textfield_len; - - memset(buf, 0x0, sizeof(buf)); - textfield_len = getLengthFromTextField(output_len); - data_len = getDataFromTextField(output_text, buf, sizeof(buf)); - - if (textfield_len < 0) { - FXMessageBox::error(this, MBOX_OK, "Invalid length", "Length field is invalid. Please enter a number in hex, octal, or decimal."); - return 1; - } - - if (textfield_len > sizeof(buf)) { - FXMessageBox::error(this, MBOX_OK, "Invalid length", "Length field is too long."); - return 1; - } - - len = (textfield_len)? textfield_len: data_len; - - int res = hid_write(connected_device, (const unsigned char*)buf, len); - if (res < 0) { - FXMessageBox::error(this, MBOX_OK, "Error Writing", "Could not write to device. Error reported was: %ls", hid_error(connected_device)); - } - - return 1; -} - -long -MainWindow::onSendFeatureReport(FXObject *sender, FXSelector sel, void *ptr) -{ - char buf[256]; - size_t data_len, len; - int textfield_len; - - memset(buf, 0x0, sizeof(buf)); - textfield_len = getLengthFromTextField(feature_len); - data_len = getDataFromTextField(feature_text, buf, sizeof(buf)); - - if (textfield_len < 0) { - FXMessageBox::error(this, MBOX_OK, "Invalid length", "Length field is invalid. Please enter a number in hex, octal, or decimal."); - return 1; - } - - if (textfield_len > sizeof(buf)) { - FXMessageBox::error(this, MBOX_OK, "Invalid length", "Length field is too long."); - return 1; - } - - len = (textfield_len)? textfield_len: data_len; - - int res = hid_send_feature_report(connected_device, (const unsigned char*)buf, len); - if (res < 0) { - FXMessageBox::error(this, MBOX_OK, "Error Writing", "Could not send feature report to device. Error reported was: %ls", hid_error(connected_device)); - } - - return 1; -} - -long -MainWindow::onGetFeatureReport(FXObject *sender, FXSelector sel, void *ptr) -{ - char buf[256]; - size_t len; - - memset(buf, 0x0, sizeof(buf)); - len = getDataFromTextField(get_feature_text, buf, sizeof(buf)); - - if (len != 1) { - FXMessageBox::error(this, MBOX_OK, "Too many numbers", "Enter only a single report number in the text field"); - } - - int res = hid_get_feature_report(connected_device, (unsigned char*)buf, sizeof(buf)); - if (res < 0) { - FXMessageBox::error(this, MBOX_OK, "Error Getting Report", "Could not get feature report from device. Error reported was: %ls", hid_error(connected_device)); - } - - if (res > 0) { - FXString s; - s.format("Returned Feature Report. %d bytes:\n", res); - for (int i = 0; i < res; i++) { - FXString t; - t.format("%02hhx ", buf[i]); - s += t; - if ((i+1) % 4 == 0) - s += " "; - if ((i+1) % 16 == 0) - s += "\n"; - } - s += "\n"; - input_text->appendText(s); - input_text->setBottomLine(INT_MAX); - } - - return 1; -} - -long -MainWindow::onClear(FXObject *sender, FXSelector sel, void *ptr) -{ - input_text->setText(""); - return 1; -} - -long -MainWindow::onTimeout(FXObject *sender, FXSelector sel, void *ptr) -{ - unsigned char buf[256]; - int res = hid_read(connected_device, buf, sizeof(buf)); - - if (res > 0) { - FXString s; - s.format("Received %d bytes:\n", res); - for (int i = 0; i < res; i++) { - FXString t; - t.format("%02hhx ", buf[i]); - s += t; - if ((i+1) % 4 == 0) - s += " "; - if ((i+1) % 16 == 0) - s += "\n"; - } - s += "\n"; - input_text->appendText(s); - input_text->setBottomLine(INT_MAX); - } - if (res < 0) { - input_text->appendText("hid_read() returned error\n"); - input_text->setBottomLine(INT_MAX); - } - - getApp()->addTimeout(this, ID_TIMER, - 5 * timeout_scalar /*5ms*/); - return 1; -} - -long -MainWindow::onMacTimeout(FXObject *sender, FXSelector sel, void *ptr) -{ -#ifdef __APPLE__ - check_apple_events(); - - getApp()->addTimeout(this, ID_MAC_TIMER, - 50 * timeout_scalar /*50ms*/); -#endif - - return 1; -} - -int main(int argc, char **argv) -{ - FXApp app("HIDAPI Test Application", "Signal 11 Software"); - app.init(argc, argv); - g_main_window = new MainWindow(&app); - app.create(); - app.run(); - return 0; -} diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/testgui.sln b/Source/3rdParty/SDL2/src/hidapi/testgui/testgui.sln deleted file mode 100644 index 56be6c6..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/testgui.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testgui", "testgui.vcproj", "{08769AC3-785A-4DDC-BFC7-1775414B7AB7}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {08769AC3-785A-4DDC-BFC7-1775414B7AB7}.Debug|Win32.ActiveCfg = Debug|Win32 - {08769AC3-785A-4DDC-BFC7-1775414B7AB7}.Debug|Win32.Build.0 = Debug|Win32 - {08769AC3-785A-4DDC-BFC7-1775414B7AB7}.Release|Win32.ActiveCfg = Release|Win32 - {08769AC3-785A-4DDC-BFC7-1775414B7AB7}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Source/3rdParty/SDL2/src/hidapi/testgui/testgui.vcproj b/Source/3rdParty/SDL2/src/hidapi/testgui/testgui.vcproj deleted file mode 100644 index 0f73a01..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/testgui/testgui.vcproj +++ /dev/null @@ -1,217 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="testgui" - ProjectGUID="{08769AC3-785A-4DDC-BFC7-1775414B7AB7}" - RootNamespace="testgui" - Keyword="Win32Proj" - TargetFrameworkVersion="196613" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories=""..\..\hidapi-externals\fox\include";..\hidapi" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="0" - WarningLevel="3" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="setupapi.lib fox-1.6.lib" - OutputFile="$(ProjectName).exe" - LinkIncremental="2" - AdditionalLibraryDirectories="..\hidapi\objfre_wxp_x86\i386;"..\..\hidapi-externals\fox\lib"" - GenerateDebugInformation="true" - SubSystem="2" - EntryPointSymbol="mainCRTStartup" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - CommandLine="" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="1" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - EnableIntrinsicFunctions="true" - AdditionalIncludeDirectories=""..\..\hidapi-externals\fox\include";..\hidapi" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" - RuntimeLibrary="2" - EnableFunctionLevelLinking="true" - UsePrecompiledHeader="0" - WarningLevel="3" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="setupapi.lib fox-1.6.lib" - OutputFile="$(ProjectName).exe" - LinkIncremental="1" - AdditionalLibraryDirectories="..\hidapi\objfre_wxp_x86\i386;"..\..\hidapi-externals\fox\lib"" - GenerateDebugInformation="true" - SubSystem="2" - OptimizeReferences="2" - EnableCOMDATFolding="2" - EntryPointSymbol="mainCRTStartup" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - CommandLine="" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" - > - <File - RelativePath="..\windows\hid.c" - > - </File> - <File - RelativePath=".\test.cpp" - > - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" - > - <File - RelativePath="..\hidapi\hidapi.h" - > - </File> - </Filter> - <Filter - Name="Resource Files" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" - > - </Filter> - <File - RelativePath=".\ReadMe.txt" - > - </File> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/Source/3rdParty/SDL2/src/hidapi/udev/99-hid.rules b/Source/3rdParty/SDL2/src/hidapi/udev/99-hid.rules deleted file mode 100644 index 0385f50..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/udev/99-hid.rules +++ /dev/null @@ -1,33 +0,0 @@ -# This is a sample udev file for HIDAPI devices which changes the permissions -# to 0666 (world readable/writable) for a specified device on Linux systems. - - -# If you are using the libusb implementation of hidapi (libusb/hid.c), then -# use something like the following line, substituting the VID and PID with -# those of your device. Note that for kernels before 2.6.24, you will need -# to substitute "usb" with "usb_device". It shouldn't hurt to use two lines -# (one each way) for compatibility with older systems. - -# HIDAPI/libusb -SUBSYSTEM=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="003f", MODE="0666" - - -# If you are using the hidraw implementation (linux/hid.c), then do something -# like the following, substituting the VID and PID with your device. Busnum 1 -# is USB. - -# HIDAPI/hidraw -KERNEL=="hidraw*", ATTRS{busnum}=="1", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="003f", MODE="0666" - -# Once done, optionally rename this file for your device, and drop it into -# /etc/udev/rules.d and unplug and re-plug your device. This is all that is -# necessary to see the new permissions. Udev does not have to be restarted. - -# Note that the hexadecimal values for VID and PID are case sensitive and -# must be lower case. - -# If you think permissions of 0666 are too loose, then see: -# http://reactivated.net/writing_udev_rules.html for more information on finer -# grained permission setting. For example, it might be sufficient to just -# set the group or user owner for specific devices (for example the plugdev -# group on some systems). diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/Makefile-manual b/Source/3rdParty/SDL2/src/hidapi/windows/Makefile-manual deleted file mode 100644 index ac471d6..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/Makefile-manual +++ /dev/null @@ -1,14 +0,0 @@ - - -OS=$(shell uname) - -ifneq (,$(findstring MINGW,$(OS))) - FILE=Makefile.mingw -endif - -ifeq ($(FILE), ) -all: - $(error Your platform ${OS} is not supported at this time.) -endif - -include $(FILE) diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/Makefile.am b/Source/3rdParty/SDL2/src/hidapi/windows/Makefile.am deleted file mode 100644 index 97e261a..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/Makefile.am +++ /dev/null @@ -1,16 +0,0 @@ -lib_LTLIBRARIES = libhidapi.la -libhidapi_la_SOURCES = hid.c -libhidapi_la_LDFLAGS = $(LTLDFLAGS) -AM_CPPFLAGS = -I$(top_srcdir)/hidapi/ -libhidapi_la_LIBADD = $(LIBS) - -hdrdir = $(includedir)/hidapi -hdr_HEADERS = $(top_srcdir)/hidapi/hidapi.h - -EXTRA_DIST = \ - ddk_build \ - hidapi.vcproj \ - hidtest.vcproj \ - Makefile-manual \ - Makefile.mingw \ - hidapi.sln diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/Makefile.mingw b/Source/3rdParty/SDL2/src/hidapi/windows/Makefile.mingw deleted file mode 100644 index b800004..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/Makefile.mingw +++ /dev/null @@ -1,35 +0,0 @@ -########################################### -# Simple Makefile for HIDAPI test program -# -# Alan Ott -# Signal 11 Software -# 2010-06-01 -########################################### - -all: hidtest libhidapi.dll - -CC=gcc -CXX=g++ -COBJS=hid.o -CPPOBJS=../hidtest/hidtest.o -OBJS=$(COBJS) $(CPPOBJS) -CFLAGS=-I../hidapi -g -c -LIBS= -lsetupapi -DLL_LDFLAGS = -mwindows -lsetupapi - -hidtest: $(OBJS) - g++ -g $^ $(LIBS) -o hidtest - -libhidapi.dll: $(OBJS) - $(CC) -g $^ $(DLL_LDFLAGS) -o libhidapi.dll - -$(COBJS): %.o: %.c - $(CC) $(CFLAGS) $< -o $@ - -$(CPPOBJS): %.o: %.cpp - $(CXX) $(CFLAGS) $< -o $@ - -clean: - rm *.o ../hidtest/*.o hidtest.exe - -.PHONY: clean diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/hidapi.def b/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/hidapi.def deleted file mode 100644 index 05e35af..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/hidapi.def +++ /dev/null @@ -1,17 +0,0 @@ -LIBRARY hidapi -EXPORTS - hid_open @1 - hid_write @2 - hid_read @3 - hid_close @4 - hid_get_product_string @5 - hid_get_manufacturer_string @6 - hid_get_serial_number_string @7 - hid_get_indexed_string @8 - hid_error @9 - hid_set_nonblocking @10 - hid_enumerate @11 - hid_open_path @12 - hid_send_feature_report @13 - hid_get_feature_report @14 -
\ No newline at end of file diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/makefile b/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/makefile deleted file mode 100644 index 637f712..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/makefile +++ /dev/null @@ -1,49 +0,0 @@ -############################################################################# -# -# Copyright (C) Microsoft Corporation 1995, 1996 -# All Rights Reserved. -# -# MAKEFILE for HID directory -# -############################################################################# - -!IFDEF WIN95_BUILD - -ROOT=..\..\..\.. - -VERSIONLIST = debug retail -IS_32 = TRUE -IS_SDK = TRUE -IS_PRIVATE = TRUE -IS_SDK = TRUE -IS_DDK = TRUE -WIN32 = TRUE -COMMONMKFILE = hidapi.mk - -!include $(ROOT)\dev\master.mk - - -!ELSE - -# -# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source -# file to this component. This file merely indirects to the real make file -# that is shared by all the driver components of the Windows NT DDK -# - -!IF DEFINED(_NT_TARGET_VERSION) -! IF $(_NT_TARGET_VERSION)>=0x501 -! INCLUDE $(NTMAKEENV)\makefile.def -! ELSE -# Only warn once per directory -! INCLUDE $(NTMAKEENV)\makefile.plt -! IF "$(BUILD_PASS)"=="PASS1" -! message BUILDMSG: Warning : The sample "$(MAKEDIR)" is not valid for the current OS target. -! ENDIF -! ENDIF -!ELSE -! INCLUDE $(NTMAKEENV)\makefile.def -!ENDIF - -!ENDIF - diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/sources b/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/sources deleted file mode 100644 index 7f06a09..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/ddk_build/sources +++ /dev/null @@ -1,23 +0,0 @@ -TARGETNAME=hidapi -TARGETTYPE=DYNLINK -UMTYPE=console -UMENTRY=main - -MSC_WARNING_LEVEL=/W3 /WX - -TARGETLIBS=$(SDK_LIB_PATH)\hid.lib \ - $(SDK_LIB_PATH)\setupapi.lib \ - $(SDK_LIB_PATH)\kernel32.lib \ - $(SDK_LIB_PATH)\comdlg32.lib - -USE_MSVCRT=1 - -INCLUDES= ..\..\hidapi -SOURCES= ..\hid.c \ - - -TARGET_DESTINATION=retail - -MUI=0 -MUI_COMMENT="HID Interface DLL" - diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/hid.c b/Source/3rdParty/SDL2/src/hidapi/windows/hid.c deleted file mode 100644 index 3795e18..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/hid.c +++ /dev/null @@ -1,988 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ -#include "../../SDL_internal.h" - -#ifdef SDL_JOYSTICK_HIDAPI - -#include <windows.h> - -#if 0 /* can cause redefinition errors on some toolchains */ -#ifdef __MINGW32__ -#include <ntdef.h> -#include <winbase.h> -#endif - -#ifdef __CYGWIN__ -#include <ntdef.h> -#define _wcsdup wcsdup -#endif -#endif /* */ - -#ifndef _NTDEF_ -typedef LONG NTSTATUS; -#endif - -/* SDL C runtime functions */ -#include "SDL_stdinc.h" - -#define calloc SDL_calloc -#define free SDL_free -#define malloc SDL_malloc -#define memcpy SDL_memcpy -#define memset SDL_memset -#define strcmp SDL_strcmp -#define strlen SDL_strlen -#define strncpy SDL_strlcpy -#define strstr SDL_strstr -#define strtol SDL_strtol -#define wcscmp SDL_wcscmp -#define _wcsdup SDL_wcsdup - -/* The maximum number of characters that can be passed into the - HidD_Get*String() functions without it failing.*/ -#define MAX_STRING_WCHARS 0xFFF - -/*#define HIDAPI_USE_DDK*/ - -#ifdef __cplusplus -extern "C" { -#endif - #include <setupapi.h> - #include <winioctl.h> - #ifdef HIDAPI_USE_DDK - #include <hidsdi.h> - #endif - - /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ - #define HID_OUT_CTL_CODE(id) \ - CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) - #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include <stdio.h> -#include <stdlib.h> - - -#include "../hidapi/hidapi.h" - -#undef MIN -#define MIN(x,y) ((x) < (y)? (x): (y)) - -#ifdef _MSC_VER - /* Thanks Microsoft, but I know how to use strncpy(). */ - #pragma warning(disable:4996) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef HIDAPI_USE_DDK - /* Since we're not building with the DDK, and the HID header - files aren't part of the SDK, we have to define all this - stuff here. In lookup_functions(), the function pointers - defined below are set. */ - typedef struct _HIDD_ATTRIBUTES{ - ULONG Size; - USHORT VendorID; - USHORT ProductID; - USHORT VersionNumber; - } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; - - typedef USHORT USAGE; - typedef struct _HIDP_CAPS { - USAGE Usage; - USAGE UsagePage; - USHORT InputReportByteLength; - USHORT OutputReportByteLength; - USHORT FeatureReportByteLength; - USHORT Reserved[17]; - USHORT fields_not_used_by_hidapi[10]; - } HIDP_CAPS, *PHIDP_CAPS; - typedef void* PHIDP_PREPARSED_DATA; - #define HIDP_STATUS_SUCCESS 0x110000 - - typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib); - typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length); - typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length); - typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data); - typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data); - typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps); - typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers); - typedef BOOLEAN(__stdcall *HidD_SetOutputReport_ )(HANDLE handle, PVOID buffer, ULONG buffer_len); - static HidD_GetAttributes_ HidD_GetAttributes; - static HidD_GetSerialNumberString_ HidD_GetSerialNumberString; - static HidD_GetManufacturerString_ HidD_GetManufacturerString; - static HidD_GetProductString_ HidD_GetProductString; - static HidD_SetFeature_ HidD_SetFeature; - static HidD_GetFeature_ HidD_GetFeature; - static HidD_GetIndexedString_ HidD_GetIndexedString; - static HidD_GetPreparsedData_ HidD_GetPreparsedData; - static HidD_FreePreparsedData_ HidD_FreePreparsedData; - static HidP_GetCaps_ HidP_GetCaps; - static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers; - static HidD_SetOutputReport_ HidD_SetOutputReport; - - static HMODULE lib_handle = NULL; - static BOOLEAN initialized = FALSE; -#endif /* HIDAPI_USE_DDK */ - -struct hid_device_ { - HANDLE device_handle; - BOOL blocking; - USHORT output_report_length; - size_t input_report_length; - void *last_error_str; - DWORD last_error_num; - BOOL read_pending; - char *read_buf; - OVERLAPPED ol; -}; - -static hid_device *new_hid_device() -{ - hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); - dev->device_handle = INVALID_HANDLE_VALUE; - dev->blocking = TRUE; - dev->output_report_length = 0; - dev->input_report_length = 0; - dev->last_error_str = NULL; - dev->last_error_num = 0; - dev->read_pending = FALSE; - dev->read_buf = NULL; - memset(&dev->ol, 0, sizeof(dev->ol)); - dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); - - return dev; -} - -static void free_hid_device(hid_device *dev) -{ - CloseHandle(dev->ol.hEvent); - CloseHandle(dev->device_handle); - LocalFree(dev->last_error_str); - free(dev->read_buf); - free(dev); -} - -static void register_error(hid_device *device, const char *op) -{ - WCHAR *ptr, *msg; - - DWORD count = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPWSTR)&msg, 0/*sz*/, - NULL); - if (!count) - return; - - /* Get rid of the CR and LF that FormatMessage() sticks at the - end of the message. Thanks Microsoft! */ - ptr = msg; - while (*ptr) { - if (*ptr == '\r') { - *ptr = 0x0000; - break; - } - ptr++; - } - - /* Store the message off in the Device entry so that - the hid_error() function can pick it up. */ - LocalFree(device->last_error_str); - device->last_error_str = msg; -} - -#ifndef HIDAPI_USE_DDK -static int lookup_functions() -{ - lib_handle = LoadLibraryA("hid.dll"); - if (lib_handle) { -#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; - RESOLVE(HidD_GetAttributes); - RESOLVE(HidD_GetSerialNumberString); - RESOLVE(HidD_GetManufacturerString); - RESOLVE(HidD_GetProductString); - RESOLVE(HidD_SetFeature); - RESOLVE(HidD_GetFeature); - RESOLVE(HidD_GetIndexedString); - RESOLVE(HidD_GetPreparsedData); - RESOLVE(HidD_FreePreparsedData); - RESOLVE(HidP_GetCaps); - RESOLVE(HidD_SetNumInputBuffers); - RESOLVE(HidD_SetOutputReport); -#undef RESOLVE - } - else - return -1; - - return 0; -} -#endif - -static HANDLE open_device(const char *path, BOOL enumerate, BOOL bExclusive ) -{ - HANDLE handle; - // Opening with access 0 causes keyboards to stop responding in some system configurations - // http://steamcommunity.com/discussions/forum/1/1843493219428923893 - // Thanks to co-wie (Ka-wei Low <kawei@mac.com>) for help narrowing down the problem on his system - //DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); - DWORD desired_access = ( GENERIC_WRITE | GENERIC_READ ); - DWORD share_mode = bExclusive ? 0 : ( FILE_SHARE_READ | FILE_SHARE_WRITE ); - - handle = CreateFileA(path, - desired_access, - share_mode, - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ - 0); - - return handle; -} - -int HID_API_EXPORT hid_init(void) -{ -#ifndef HIDAPI_USE_DDK - if (!initialized) { - if (lookup_functions() < 0) { - hid_exit(); - return -1; - } - initialized = TRUE; - } -#endif - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ -#ifndef HIDAPI_USE_DDK - if (lib_handle) - FreeLibrary(lib_handle); - lib_handle = NULL; - initialized = FALSE; -#endif - return 0; -} - -struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - BOOL res; - struct hid_device_info *root = NULL; /* return object */ - struct hid_device_info *cur_dev = NULL; - - /* Windows objects for interacting with the driver. */ - GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; - SP_DEVINFO_DATA devinfo_data; - SP_DEVICE_INTERFACE_DATA device_interface_data; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; - HDEVINFO device_info_set = INVALID_HANDLE_VALUE; - int device_index = 0; - int i; - - if (hid_init() < 0) - return NULL; - - /* Initialize the Windows objects. */ - memset(&devinfo_data, 0x0, sizeof(devinfo_data)); - devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); - device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - - /* Get information for all the devices belonging to the HID class. */ - device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - /* Iterate over each device in the HID class, looking for the right one. */ - - for (;;) { - HANDLE write_handle = INVALID_HANDLE_VALUE; - DWORD required_size = 0; - HIDD_ATTRIBUTES attrib; - - res = SetupDiEnumDeviceInterfaces(device_info_set, - NULL, - &InterfaceClassGuid, - device_index, - &device_interface_data); - - if (!res) { - /* A return of FALSE from this function means that - there are no more devices. */ - break; - } - - /* Call with 0-sized detail size, and let the function - tell us how long the detail struct needs to be. The - size is put in &required_size. */ - res = SetupDiGetDeviceInterfaceDetailA(device_info_set, - &device_interface_data, - NULL, - 0, - &required_size, - NULL); - - /* Allocate a long enough structure for device_interface_detail_data. */ - device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); - device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); - - /* Get the detailed data for this device. The detail data gives us - the device path for this device, which is then passed into - CreateFile() to get a handle to the device. */ - res = SetupDiGetDeviceInterfaceDetailA(device_info_set, - &device_interface_data, - device_interface_detail_data, - required_size, - NULL, - NULL); - - if (!res) { - /* register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); - Continue to the next device. */ - goto cont; - } - - /* Make sure this device is of Setup Class "HIDClass" and has a - driver bound to it. */ - for (i = 0; ; i++) { - char driver_name[256]; - - /* Populate devinfo_data. This function will return failure - when there are no more interfaces left. */ - res = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); - if (!res) - goto cont; - - res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, - SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); - if (!res) - goto cont; - - if (strcmp(driver_name, "HIDClass") == 0) { - /* See if there's a driver bound. */ - res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, - SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); - if (res) - break; - } - } - - //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); - - /* Open a handle to the device */ - write_handle = open_device(device_interface_detail_data->DevicePath, TRUE, FALSE); - - /* Check validity of write_handle. */ - if (write_handle == INVALID_HANDLE_VALUE) { - /* Unable to open the device. */ - //register_error(dev, "CreateFile"); - goto cont_close; - } - - - /* Get the Vendor ID and Product ID for this device. */ - attrib.Size = sizeof(HIDD_ATTRIBUTES); - HidD_GetAttributes(write_handle, &attrib); - //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); - - /* Check the VID/PID to see if we should add this - device to the enumeration list. */ - if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && - (product_id == 0x0 || attrib.ProductID == product_id)) { - - #define WSTR_LEN 512 - const char *str; - struct hid_device_info *tmp; - PHIDP_PREPARSED_DATA pp_data = NULL; - HIDP_CAPS caps; - BOOLEAN hidp_res; - NTSTATUS nt_res; - wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */ - size_t len; - - /* VID/PID match. Create the record. */ - tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - cur_dev = tmp; - - /* Get the Usage Page and Usage for this device. */ - hidp_res = HidD_GetPreparsedData(write_handle, &pp_data); - if (hidp_res) { - nt_res = HidP_GetCaps(pp_data, &caps); - if (nt_res == HIDP_STATUS_SUCCESS) { - cur_dev->usage_page = caps.UsagePage; - cur_dev->usage = caps.Usage; - } - - HidD_FreePreparsedData(pp_data); - } - - /* Fill out the record */ - cur_dev->next = NULL; - str = device_interface_detail_data->DevicePath; - if (str) { - len = strlen(str); - cur_dev->path = (char*) calloc(len+1, sizeof(char)); - strncpy(cur_dev->path, str, len+1); - cur_dev->path[len] = '\0'; - } - else - cur_dev->path = NULL; - - /* Serial Number */ - hidp_res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr)); - wstr[WSTR_LEN-1] = 0x0000; - if (hidp_res) { - cur_dev->serial_number = _wcsdup(wstr); - } - - /* Manufacturer String */ - hidp_res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr)); - wstr[WSTR_LEN-1] = 0x0000; - if (hidp_res) { - cur_dev->manufacturer_string = _wcsdup(wstr); - } - - /* Product String */ - hidp_res = HidD_GetProductString(write_handle, wstr, sizeof(wstr)); - wstr[WSTR_LEN-1] = 0x0000; - if (hidp_res) { - cur_dev->product_string = _wcsdup(wstr); - } - - /* VID/PID */ - cur_dev->vendor_id = attrib.VendorID; - cur_dev->product_id = attrib.ProductID; - - /* Release Number */ - cur_dev->release_number = attrib.VersionNumber; - - /* Interface Number. It can sometimes be parsed out of the path - on Windows if a device has multiple interfaces. See - http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or - search for "Hardware IDs for HID Devices" at MSDN. If it's not - in the path, it's set to -1. */ - cur_dev->interface_number = -1; - if (cur_dev->path) { - char *interface_component = strstr(cur_dev->path, "&mi_"); - if (interface_component) { - char *hex_str = interface_component + 4; - char *endptr = NULL; - cur_dev->interface_number = strtol(hex_str, &endptr, 16); - if (endptr == hex_str) { - /* The parsing failed. Set interface_number to -1. */ - cur_dev->interface_number = -1; - } - } - } - } - -cont_close: - CloseHandle(write_handle); -cont: - /* We no longer need the detail data. It can be freed */ - free(device_interface_detail_data); - - device_index++; - - } - - /* Close the device information handle. */ - SetupDiDestroyDeviceInfoList(device_info_set); - - return root; - -} - -void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) -{ - /* TODO: Merge this with the Linux version. This function is platform-independent. */ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - - -HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device *handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open, 0); - } - - hid_free_enumeration(devs); - - return handle; -} - -HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path, int bExclusive) -{ - hid_device *dev; - HIDP_CAPS caps; - PHIDP_PREPARSED_DATA pp_data = NULL; - BOOLEAN res; - NTSTATUS nt_res; - - if (hid_init() < 0) { - return NULL; - } - - dev = new_hid_device(); - - /* Open a handle to the device */ - dev->device_handle = open_device(path, FALSE, bExclusive); - - /* Check validity of write_handle. */ - if (dev->device_handle == INVALID_HANDLE_VALUE) { - /* Unable to open the device. */ - register_error(dev, "CreateFile"); - goto err; - } - - /* Set the Input Report buffer size to 64 reports. */ - res = HidD_SetNumInputBuffers(dev->device_handle, 64); - if (!res) { - register_error(dev, "HidD_SetNumInputBuffers"); - goto err; - } - - /* Get the Input Report length for the device. */ - res = HidD_GetPreparsedData(dev->device_handle, &pp_data); - if (!res) { - register_error(dev, "HidD_GetPreparsedData"); - goto err; - } - nt_res = HidP_GetCaps(pp_data, &caps); - if (nt_res != HIDP_STATUS_SUCCESS) { - register_error(dev, "HidP_GetCaps"); - goto err_pp_data; - } - dev->output_report_length = caps.OutputReportByteLength; - dev->input_report_length = caps.InputReportByteLength; - HidD_FreePreparsedData(pp_data); - - dev->read_buf = (char*) malloc(dev->input_report_length); - - return dev; - -err_pp_data: - HidD_FreePreparsedData(pp_data); -err: - free_hid_device(dev); - return NULL; -} - -int HID_API_EXPORT HID_API_CALL hid_write_output_report(hid_device *dev, const unsigned char *data, size_t length) -{ - BOOL res; - res = HidD_SetOutputReport(dev->device_handle, (void *)data, (ULONG)length); - if (res) - return (int)length; - else - return -1; -} - -int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - DWORD bytes_written; - BOOL res; - size_t stashed_length = length; - OVERLAPPED ol; - unsigned char *buf; - memset(&ol, 0, sizeof(ol)); - - /* Make sure the right number of bytes are passed to WriteFile. Windows - expects the number of bytes which are in the _longest_ report (plus - one for the report number) bytes even if the data is a report - which is shorter than that. Windows gives us this value in - caps.OutputReportByteLength. If a user passes in fewer bytes than this, - create a temporary buffer which is the proper size. */ - if (length >= dev->output_report_length) { - /* The user passed the right number of bytes. Use the buffer as-is. */ - buf = (unsigned char *) data; - } else { - /* Create a temporary buffer and copy the user's data - into it, padding the rest with zeros. */ - buf = (unsigned char *) malloc(dev->output_report_length); - memcpy(buf, data, length); - memset(buf + length, 0, dev->output_report_length - length); - length = dev->output_report_length; - } - if (length > 512) - { - return hid_write_output_report( dev, data, stashed_length ); - } - else - { - res = WriteFile( dev->device_handle, buf, ( DWORD ) length, NULL, &ol ); - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - /* WriteFile() failed. Return error. */ - register_error(dev, "WriteFile"); - bytes_written = (DWORD) -1; - goto end_of_function; - } - } - - /* Wait here until the write is done. This makes - hid_write() synchronous. */ - res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/); - if (!res) { - /* The Write operation failed. */ - register_error(dev, "WriteFile"); - bytes_written = (DWORD) -1; - goto end_of_function; - } - } -end_of_function: - if (buf != data) - free(buf); - - return bytes_written; -} - - -int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - DWORD bytes_read = 0; - size_t copy_len = 0; - BOOL res; - - /* Copy the handle for convenience. */ - HANDLE ev = dev->ol.hEvent; - - if (!dev->read_pending) { - /* Start an Overlapped I/O read. */ - dev->read_pending = TRUE; - memset(dev->read_buf, 0, dev->input_report_length); - ResetEvent(ev); - res = ReadFile(dev->device_handle, dev->read_buf, (DWORD)dev->input_report_length, &bytes_read, &dev->ol); - - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - /* ReadFile() has failed. - Clean up and return error. */ - CancelIo(dev->device_handle); - dev->read_pending = FALSE; - goto end_of_function; - } - } - } - - if (milliseconds >= 0) { - /* See if there is any data yet. */ - res = WaitForSingleObject(ev, milliseconds); - if (res != WAIT_OBJECT_0) { - /* There was no data this time. Return zero bytes available, - but leave the Overlapped I/O running. */ - return 0; - } - } - - /* Either WaitForSingleObject() told us that ReadFile has completed, or - we are in non-blocking mode. Get the number of bytes read. The actual - data has been copied to the data[] array which was passed to ReadFile(). */ - res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); - - /* Set pending back to false, even if GetOverlappedResult() returned error. */ - dev->read_pending = FALSE; - - if (res && bytes_read > 0) { - if (dev->read_buf[0] == 0x0) { - /* If report numbers aren't being used, but Windows sticks a report - number (0x0) on the beginning of the report anyway. To make this - work like the other platforms, and to make it work more like the - HID spec, we'll skip over this byte. */ - bytes_read--; - copy_len = length > bytes_read ? bytes_read : length; - memcpy(data, dev->read_buf+1, copy_len); - } - else { - /* Copy the whole buffer, report number and all. */ - copy_len = length > bytes_read ? bytes_read : length; - memcpy(data, dev->read_buf, copy_len); - } - } - -end_of_function: - if (!res) { - register_error(dev, "GetOverlappedResult"); - return -1; - } - - return (int)copy_len; -} - -int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); -} - -int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) -{ - dev->blocking = !nonblock; - return 0; /* Success */ -} - -int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, (ULONG)length); - if (!res) { - register_error(dev, "HidD_SetFeature"); - return -1; - } - - return (int)length; -} - - -int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - BOOL res; -#if 0 - res = HidD_GetFeature(dev->device_handle, (PVOID)data, (ULONG)length); - if (!res) { - register_error(dev, "HidD_GetFeature"); - return -1; - } - return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ -#else - DWORD bytes_returned; - - OVERLAPPED ol; - memset(&ol, 0, sizeof(ol)); - - res = DeviceIoControl(dev->device_handle, - IOCTL_HID_GET_FEATURE, - data, (DWORD)length, - data, (DWORD)length, - &bytes_returned, &ol); - - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - /* DeviceIoControl() failed. Return error. */ - register_error(dev, "Send Feature Report DeviceIoControl"); - return -1; - } - } - - /* Wait here until the write is done. This makes - hid_get_feature_report() synchronous. */ - res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/); - if (!res) { - /* The operation failed. */ - register_error(dev, "Send Feature Report GetOverLappedResult"); - return -1; - } - - /* bytes_returned does not include the first byte which contains the - report ID. The data buffer actually contains one more byte than - bytes_returned. */ - bytes_returned++; - - - return bytes_returned; -#endif -} - -void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) -{ - if (!dev) - return; - CancelIo(dev->device_handle); - free_hid_device(dev); -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetManufacturerString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); - if (!res) { - register_error(dev, "HidD_GetManufacturerString"); - return -1; - } - - return 0; -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetProductString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); - if (!res) { - register_error(dev, "HidD_GetProductString"); - return -1; - } - - return 0; -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetSerialNumberString(dev->device_handle, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); - if (!res) { - register_error(dev, "HidD_GetSerialNumberString"); - return -1; - } - - return 0; -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetIndexedString(dev->device_handle, string_index, string, (ULONG)(sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS))); - if (!res) { - register_error(dev, "HidD_GetIndexedString"); - return -1; - } - - return 0; -} - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - return (wchar_t*)dev->last_error_str; -} - - -#if 0 - -/*#define PICPGM*/ -/*#define S11*/ -#define P32 -#ifdef S11 - unsigned short VendorID = 0xa0a0; - unsigned short ProductID = 0x0001; -#endif - -#ifdef P32 - unsigned short VendorID = 0x04d8; - unsigned short ProductID = 0x3f; -#endif - -#ifdef PICPGM - unsigned short VendorID = 0x04d8; - unsigned short ProductID = 0x0033; -#endif - -int __cdecl main(int argc, char* argv[]) -{ - int res; - unsigned char buf[65]; - - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - - /* Set up the command buffer. */ - memset(buf,0x00,sizeof(buf)); - buf[0] = 0; - buf[1] = 0x81; - - - /* Open the device. */ - int handle = open(VendorID, ProductID, L"12345"); - if (handle < 0) - printf("unable to open device\n"); - - - /* Toggle LED (cmd 0x80) */ - buf[1] = 0x80; - res = write(handle, buf, 65); - if (res < 0) - printf("Unable to write()\n"); - - /* Request state (cmd 0x81) */ - buf[1] = 0x81; - write(handle, buf, 65); - if (res < 0) - printf("Unable to write() (2)\n"); - - /* Read requested state */ - read(handle, buf, 65); - if (res < 0) - printf("Unable to read()\n"); - - /* Print out the returned buffer. */ - for (int i = 0; i < 4; i++) - printf("buf[%d]: %d\n", i, buf[i]); - - return 0; -} -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* SDL_JOYSTICK_HIDAPI */ diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/hidapi.sln b/Source/3rdParty/SDL2/src/hidapi/windows/hidapi.sln deleted file mode 100644 index d45c397..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/hidapi.sln +++ /dev/null @@ -1,29 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hidapi", "hidapi.vcproj", "{A107C21C-418A-4697-BB10-20C3AA60E2E4}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hidtest", "hidtest.vcproj", "{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}" - ProjectSection(ProjectDependencies) = postProject - {A107C21C-418A-4697-BB10-20C3AA60E2E4} = {A107C21C-418A-4697-BB10-20C3AA60E2E4} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {A107C21C-418A-4697-BB10-20C3AA60E2E4}.Debug|Win32.ActiveCfg = Debug|Win32 - {A107C21C-418A-4697-BB10-20C3AA60E2E4}.Debug|Win32.Build.0 = Debug|Win32 - {A107C21C-418A-4697-BB10-20C3AA60E2E4}.Release|Win32.ActiveCfg = Release|Win32 - {A107C21C-418A-4697-BB10-20C3AA60E2E4}.Release|Win32.Build.0 = Release|Win32 - {23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Debug|Win32.ActiveCfg = Debug|Win32 - {23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Debug|Win32.Build.0 = Debug|Win32 - {23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Release|Win32.ActiveCfg = Release|Win32 - {23E9FF6A-49D1-4993-B2B5-BBB992C6C712}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/hidapi.vcproj b/Source/3rdParty/SDL2/src/hidapi/windows/hidapi.vcproj deleted file mode 100644 index ee9569c..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/hidapi.vcproj +++ /dev/null @@ -1,201 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="hidapi" - ProjectGUID="{A107C21C-418A-4697-BB10-20C3AA60E2E4}" - RootNamespace="hidapi" - Keyword="Win32Proj" - TargetFrameworkVersion="196613" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="2" - CharacterSet="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\hidapi" - PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - UsePrecompiledHeader="0" - WarningLevel="3" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="setupapi.lib" - LinkIncremental="2" - GenerateDebugInformation="true" - SubSystem="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="2" - CharacterSet="1" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - EnableIntrinsicFunctions="true" - AdditionalIncludeDirectories="..\hidapi" - PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;HIDAPI_EXPORTS" - RuntimeLibrary="2" - EnableFunctionLevelLinking="true" - UsePrecompiledHeader="0" - WarningLevel="3" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="setupapi.lib" - LinkIncremental="1" - GenerateDebugInformation="true" - SubSystem="2" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" - > - <File - RelativePath=".\hid.c" - > - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" - > - <File - RelativePath="..\hidapi\hidapi.h" - > - </File> - </Filter> - <Filter - Name="Resource Files" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" - > - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> diff --git a/Source/3rdParty/SDL2/src/hidapi/windows/hidtest.vcproj b/Source/3rdParty/SDL2/src/hidapi/windows/hidtest.vcproj deleted file mode 100644 index db64f96..0000000 --- a/Source/3rdParty/SDL2/src/hidapi/windows/hidtest.vcproj +++ /dev/null @@ -1,196 +0,0 @@ -<?xml version="1.0" encoding="Windows-1252"?> -<VisualStudioProject - ProjectType="Visual C++" - Version="9.00" - Name="hidtest" - ProjectGUID="{23E9FF6A-49D1-4993-B2B5-BBB992C6C712}" - RootNamespace="hidtest" - TargetFrameworkVersion="196613" - > - <Platforms> - <Platform - Name="Win32" - /> - </Platforms> - <ToolFiles> - </ToolFiles> - <Configurations> - <Configuration - Name="Debug|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="2" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="0" - AdditionalIncludeDirectories="..\hidapi" - MinimalRebuild="true" - BasicRuntimeChecks="3" - RuntimeLibrary="3" - WarningLevel="3" - DebugInformationFormat="4" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="hidapi.lib" - AdditionalLibraryDirectories="..\windows\Debug" - GenerateDebugInformation="true" - SubSystem="1" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - Description="Copying hidapi.dll to the local direcotry." - CommandLine="" - /> - </Configuration> - <Configuration - Name="Release|Win32" - OutputDirectory="$(SolutionDir)$(ConfigurationName)" - IntermediateDirectory="$(ConfigurationName)" - ConfigurationType="1" - CharacterSet="2" - WholeProgramOptimization="1" - > - <Tool - Name="VCPreBuildEventTool" - /> - <Tool - Name="VCCustomBuildTool" - /> - <Tool - Name="VCXMLDataGeneratorTool" - /> - <Tool - Name="VCWebServiceProxyGeneratorTool" - /> - <Tool - Name="VCMIDLTool" - /> - <Tool - Name="VCCLCompilerTool" - Optimization="2" - EnableIntrinsicFunctions="true" - AdditionalIncludeDirectories="..\hidapi" - RuntimeLibrary="2" - EnableFunctionLevelLinking="true" - WarningLevel="3" - DebugInformationFormat="3" - /> - <Tool - Name="VCManagedResourceCompilerTool" - /> - <Tool - Name="VCResourceCompilerTool" - /> - <Tool - Name="VCPreLinkEventTool" - /> - <Tool - Name="VCLinkerTool" - AdditionalDependencies="hidapi.lib" - AdditionalLibraryDirectories="..\windows\Release" - GenerateDebugInformation="true" - SubSystem="1" - OptimizeReferences="2" - EnableCOMDATFolding="2" - TargetMachine="1" - /> - <Tool - Name="VCALinkTool" - /> - <Tool - Name="VCManifestTool" - /> - <Tool - Name="VCXDCMakeTool" - /> - <Tool - Name="VCBscMakeTool" - /> - <Tool - Name="VCFxCopTool" - /> - <Tool - Name="VCAppVerifierTool" - /> - <Tool - Name="VCPostBuildEventTool" - Description="Copying hidapi.dll to the local direcotry." - CommandLine="" - /> - </Configuration> - </Configurations> - <References> - </References> - <Files> - <Filter - Name="Source Files" - Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" - UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" - > - <File - RelativePath="..\hidtest\hidtest.cpp" - > - </File> - </Filter> - <Filter - Name="Header Files" - Filter="h;hpp;hxx;hm;inl;inc;xsd" - UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" - > - </Filter> - <Filter - Name="Resource Files" - Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" - UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" - > - </Filter> - </Files> - <Globals> - </Globals> -</VisualStudioProject> |