diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 94a9ed024..000000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md deleted file mode 100644 index 4c9c3c72d..000000000 --- a/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# moOde audio player - -Moode Audio Player is a derivative of the wonderful WebUI audio player client for MPD originally designed and coded by Andrea Coiutti and Simone De Gregori, and subsequently enhanced by early efforts from the RaspyFi/Volumio projects. - -Tim Curtis © 2014 - -Release Notes https://github.com/moode-player/moode/blob/master/www/relnotes.txt
-Player Setup https://github.com/moode-player/moode/blob/master/www/setup.txt
-Moode OS Builder https://github.com/moode-player/mosbuild - -## Other Resources -[moodeaudio.org](http://moodeaudio.org)\ -[moOde Twitter feed](http://twitter.com/MoodeAudio)\ -[Contributors](https://github.com/moode-player/moode/blob/master/www/CONTRIBS.html) diff --git a/etc/avahi/services/moode.service b/etc/avahi/services/moode.service new file mode 100755 index 000000000..7f614bbc2 --- /dev/null +++ b/etc/avahi/services/moode.service @@ -0,0 +1,10 @@ + + + + + moOde audio player: %h + + _http._tcp + 80 + + diff --git a/etc/nginx/nginx.conf b/etc/nginx/nginx.conf index 8bd4cb14e..ac86c992f 100755 --- a/etc/nginx/nginx.conf +++ b/etc/nginx/nginx.conf @@ -30,7 +30,7 @@ http { include /etc/nginx/mime.types; default_type application/octet-stream; - client_max_body_size 8M; + client_max_body_size 8M; ## # SSL Settings diff --git a/etc/php/7.0/cli/php.ini b/etc/php/7.0/cli/php.ini index 425fd7071..c73a5c95d 100755 --- a/etc/php/7.0/cli/php.ini +++ b/etc/php/7.0/cli/php.ini @@ -810,7 +810,8 @@ file_uploads = On ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize -upload_max_filesize = 2M +;upload_max_filesize = 2M +upload_max_filesize = 8M ; Maximum number of files that can be uploaded via a single request max_file_uploads = 20 diff --git a/home/xinitrc.default b/home/xinitrc.default index b353dfac3..6f6950266 100755 --- a/home/xinitrc.default +++ b/home/xinitrc.default @@ -17,6 +17,7 @@ # along with this program. If not, see . # # 2018-01-26 TC moOde 4.0 +# 2018-04-02 TC moOde 4.1 remove --disable-overlay-scrollbar because it has no effect either disable or enable # # Turn off display power management @@ -26,6 +27,6 @@ xset s 600 # launch chrome browser SCREENSIZE="$(fbset -s | awk '$1 == "geometry" { print $2","$3 }')" -chromium-browser --kiosk --touch-events --disable-touch-drag-drop --disable-overlay-scrollbar \ +chromium-browser --kiosk --touch-events --disable-touch-drag-drop \ --enable-touchview --enable-pinch --window-size=$SCREENSIZE --window-position=0,0 \ --disable-session-crashed-bubble --disable-infobars --no-first-run --app=http://localhost/ diff --git a/lib/systemd/system/bluetooth.service b/lib/systemd/system/bluetooth.service index 448626433..a08f2792c 100644 --- a/lib/systemd/system/bluetooth.service +++ b/lib/systemd/system/bluetooth.service @@ -1,5 +1,9 @@ # # 2018-01-26 TC moOde 4.0 +# 2018-04-02 TC moOde 4.1 +# - change ExecStart to use the symlink in /usr/sbin +# - allows 5.43 and 5.49 bluez to work with this file +# - note: --noplugin=sap may not be needed with 5.49 # [Unit] @@ -10,7 +14,7 @@ ConditionPathIsDirectory=/sys/class/bluetooth [Service] Type=dbus BusName=org.bluez -ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=sap +ExecStart=/usr/sbin/bluetoothd --noplugin=sap NotifyAccess=main #WatchdogSec=10 #Restart=on-failure diff --git a/lib/systemd/system/localui.service b/lib/systemd/system/localui.service index d8e29088e..2eb126537 100755 --- a/lib/systemd/system/localui.service +++ b/lib/systemd/system/localui.service @@ -1,20 +1,3 @@ -#!/bin/bash -# -# moOde audio player (C) 2014 Tim Curtis -# http://moodeaudio.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, 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 . # # 2018-01-26 TC moOde 4.0 # diff --git a/mpd/playlists/Default Playlist.m3u b/mpd/playlists/Default Playlist.m3u index 6964cbc15..6ad59231b 100755 --- a/mpd/playlists/Default Playlist.m3u +++ b/mpd/playlists/Default Playlist.m3u @@ -21,7 +21,6 @@ http://ice1.somafm.com/covers-128-mp3 http://ice1.somafm.com/deepspaceone-128-aac http://ice1.somafm.com/defcon-128-aac http://ice1.somafm.com/digitalis-128-aac -http://ice1.somafm.com/doomed-128-aac http://ice1.somafm.com/dronezone-128-aac http://ice1.somafm.com/dubstep-128-aac http://ice1.somafm.com/fluid-128-aac diff --git a/network/dhcpcd.conf.default b/network/dhcpcd.conf.default index 0416637eb..ee634c8c4 100755 --- a/network/dhcpcd.conf.default +++ b/network/dhcpcd.conf.default @@ -16,3 +16,4 @@ slaac private #AP mode #interface wlan0 #static ip_address=172.24.1.1/24 +#nohook wpa_supplicant diff --git a/network/wpa_supplicant.conf.default b/network/wpa_supplicant.conf.default index 268c9c472..f3bf1f0db 100755 --- a/network/wpa_supplicant.conf.default +++ b/network/wpa_supplicant.conf.default @@ -3,6 +3,6 @@ # the player Network configuration page. ######################################### -country=GB +country=US ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 diff --git a/other/bluetooth/bluez-5.49.tar.xz b/other/bluetooth/bluez-5.49.tar.xz new file mode 100755 index 000000000..5f2907cac Binary files /dev/null and b/other/bluetooth/bluez-5.49.tar.xz differ diff --git a/other/build/build_recipe_v2.3.txt b/other/build/build_recipe_v2.4.txt similarity index 92% rename from other/build/build_recipe_v2.3.txt rename to other/build/build_recipe_v2.4.txt index c8bb50e25..efd6426a4 100644 --- a/other/build/build_recipe_v2.3.txt +++ b/other/build/build_recipe_v2.4.txt @@ -1,8 +1,8 @@ ################################################################ # -# Build Recipe v2.3, 2018-01-26 +# Build Recipe v2.4, 2018-04-02 # -# moOde 4.0 +# moOde 4.1 # # These instructions are written for Linux Enthusiasts # and System Integrators and provide a recipe for making @@ -15,6 +15,17 @@ # # Changes: # +# v2.4: Set permissions for localui.service in STEP 8 +# Specify Linux kernel by Git hash in STEP 11 +# Add echo "y" to rpi-update in STEP 11, reqd for prompt in 4.14.y branch +# Add apt-get clean to STEP 11 +# Bump to MPD 0.20.18 in STEP 6 +# Bump to upmpdcli-code-1.2.16 in COMPONENT 6 for Tidal fixes +# Bump to Bluetooth 5.49 in STEP 4 +# Use local libupnppsamples-code sources in COMPONENT 6 +# Remove djmount in COMPONENT 1 and /mnt/UPNP in STEP 7 +# Set time zone to America/Detroit in STEP 2 +# Add second apt-get update in STEP 3 for robustness # v2.3: Add sudo for cp pre-compiled MPD binary in STEP 6 # Bump to shairport-sync 3.1.7 # Reset dir permissions for var local in STEP 8 @@ -173,7 +184,9 @@ net.ifnames=0 1. Insert the SD Card into a Raspberry Pi and POWER UP. -2. Change the current password (raspberry) to moodeaudio and the host name to moode. +2. sudo timedatectl set-timezone "America/Detroit" + +3. Change the current password (raspberry) to moodeaudio and the host name to moode. ssh pi@raspberrypi (pwd=raspberry) @@ -181,7 +194,7 @@ echo "pi:moodeaudio" | sudo chpasswd sudo sed -i "s/raspberrypi/moode/" /etc/hostname sudo sed -i "s/raspberrypi/moode/" /etc/hosts -3. Download moOde application sources and configs. +4. Download moOde application sources and configs. // // NOTE: We are downloading the Sources in this particular step in order to obtain the resizefs.sh file. @@ -193,7 +206,7 @@ cd ~ wget http://moodeaudio.org/downloads/prod/rel-stretch-r40.zip sudo unzip ./rel-stretch-r40.zip -4. Expand the root partition to 3GB. +5. Expand the root partition to 3GB. sudo cp ./rel-stretch/www/command/resizefs.sh ./ sudo chmod 0755 ./resizefs.sh @@ -231,6 +244,8 @@ sudo apt-get -y upgrade # SR2 sudo reboot +sudo apt-get update + sudo apt-get -y install rpi-update php-fpm nginx sqlite3 php-sqlite3 memcached php-memcache mpc \ bs2b-ladspa libbs2b0 libasound2-plugin-equal telnet automake sysstat squashfs-tools tcpdump shellinabox \ samba smbclient udisks-glue ntfs-3g exfat-fuse git inotify-tools libav-tools avahi-utils @@ -253,10 +268,27 @@ sudo systemctl disable dnsmasq 2. Install Bluetooth -sudo apt-get -y install bluez bluez-firmware pi-bluetooth \ -dh-autoreconf expect libortp-dev libbluetooth-dev libasound2-dev \ +sudo apt-get -y install bluez-firmware pi-bluetooth \ +dh-autoreconf expect libdbus-1-dev libortp-dev libbluetooth-dev libasound2-dev \ libusb-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libsbc1 libsbc-dev +# Compile bluez +sudo cp ./rel-stretch/other/bluetooth/bluez-5.49.tar.xz ./ +sudo tar xvf bluez-5.49.tar.xz +cd bluez-5.49 +./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-library +sudo make +sudo make install +cd ~ +sudo rm -rf ./bluez-5.49 +sudo rm ./bluez-5.49.tar.xz + +# Delete symlink and bin for old bluetoothd +sudo rm /usr/sbin/bluetoothd +sudo rm -rf /usr/lib/bluetooth +# Create symlink for new bluetoothd +sudo ln -s /usr/libexec/bluetooth/bluetoothd /usr/sbin/bluetoothd + NOTE: Ignore warnings from autoreconf and configure cd /tmp @@ -353,15 +385,15 @@ libboost-dev \ libicu-dev \ libglib2.0-dev -3. Download MPD 0.20.12 sources and prep for compile. +3. Download MPD 0.20.18 sources and prep for compile. # Optionally install pre-compiled binary and skip to STEP 7 -sudo cp ./rel-stretch/other/mpd/mpd-0.20.12 /usr/local/bin/mpd +sudo cp ./rel-stretch/other/mpd/mpd-0.20.18 /usr/local/bin/mpd sudo reboot -sudo wget http://www.musicpd.org/download/mpd/0.20/mpd-0.20.12.tar.xz -sudo tar xf mpd-0.20.12.tar.xz -cd mpd-0.20.12 +sudo wget http://www.musicpd.org/download/mpd/0.20/mpd-0.20.18.tar.xz +sudo tar xf mpd-0.20.18.tar.xz +cd mpd-0.20.18 sudo sh autogen.sh 4. Configure compile options. @@ -384,7 +416,7 @@ sudo make sudo make install sudo strip --strip-unneeded /usr/local/bin/mpd cd ~ -sudo rm -rf ./mpd-0.20.12* +sudo rm -rf ./mpd-0.20.18* sudo apt-get clean sudo apt-get autoremove @@ -421,7 +453,6 @@ sudo mkdir /var/lib/mpd/music/RADIO # Mount points sudo mkdir /mnt/NAS sudo mkdir /mnt/SDCARD -sudo mkdir /mnt/UPNP # Symlinks sudo ln -s /mnt/NAS /var/lib/mpd/music/NAS sudo ln -s /mnt/SDCARD /var/lib/mpd/music/SDCARD @@ -497,6 +528,8 @@ sudo chmod 0755 /usr/local/bin/a2dp-autoconnect sudo chmod 0644 /lib/systemd/system/rotenc.service # Udev sudo chmod 0644 /etc/udev/rules.d/* +# Localui +sudo chmod 0644 /lib/systemd/system/localui.service 4. Services are started by moOde Worker so lets disable them here. @@ -566,14 +599,18 @@ sudo reboot //////////////////////////////////////////////////////////////// // -// STEP 11 - Optionally install latest Linux Kernel +// STEP 11 - Optionally install updated Linux Kernel // //////////////////////////////////////////////////////////////// -sudo PRUNE_MODULES=1 rpi-update +// STEP 11 - Optionally install updated Linux Kernel + +# kernel ver 4.14.32 +echo "y" | sudo PRUNE_MODULES=1 rpi-update 171c962793f7a39a6798ce374d9d63ab0cbecf8c sudo rm -rf /lib/modules.bak sudo rm -rf /boot.bak +sudo apt-get clean # SR7 sudo reboot @@ -664,7 +701,6 @@ host name and other names at first boot. See the file /var/www/setup.txt for mor sudo apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install minidlna sudo systemctl disable minidlna -sudo apt-get -y install djmount //////////////////////////////////////////////////////////////// // @@ -774,15 +810,16 @@ sudo rm libupnpp-0.16.0.tar.gz 4. Upmpdcli -sudo cp ./rel-stretch/other/upmpdcli/upmpdcli-1.2.15.tar.gz ./ -sudo tar xfz ./upmpdcli-1.2.15.tar.gz -cd upmpdcli-1.2.15 +sudo cp ./rel-stretch/other/upmpdcli/upmpdcli-code-1.2.16.tar.gz ./ +sudo tar xfz ./upmpdcli-code-1.2.16.tar.gz +cd upmpdcli-code +./autogen.sh ./configure --prefix=/usr --sysconfdir=/etc sudo make sudo make install cd ~ -sudo rm -rf ./upmpdcli-1.2.15 -sudo rm upmpdcli-1.2.15.tar.gz +sudo rm -rf ./upmpdcli-code-1.2.16 +sudo rm upmpdcli-code-1.2.16.tar.gz sudo useradd upmpdcli sudo cp ./rel-stretch/lib/systemd/system/upmpdcli.service /lib/systemd/system @@ -795,7 +832,7 @@ sudo systemctl disable upmpdcli NOTE: This also installs a bunch of other utils -sudo git clone https://@opensourceprojects.eu/git/p/libupnppsamples/code libupnppsamples-code +sudo cp -r ./rel-stretch/other/libupnppsamples-code/ ./ cd libupnppsamples-code sudo ./autogen.sh sudo ./configure diff --git a/other/libupnppsamples-code/Makefile.am b/other/libupnppsamples-code/Makefile.am new file mode 100755 index 000000000..3f7aa8afc --- /dev/null +++ b/other/libupnppsamples-code/Makefile.am @@ -0,0 +1,26 @@ + +AM_CXXFLAGS = -std=c++11 + +LDADD = -lupnpp -lpthread -lrt + +bin_PROGRAMS = typedservice ohsender ohradio upexplorer multirdr \ + upsend uplistdir dumpXML \ + rdcvolume myrdcvolume hellodevice helloctl + +typedservice_SOURCES = src/typedservice.cpp +upexplorer_SOURCES = src/upexplo.cpp +multirdr_SOURCES = src/multirdr.cpp +ohradio_SOURCES = src/ohradio.cpp +ohsender_SOURCES = src/ohsender.cpp +uplistdir_SOURCES = src/uplistdir.cpp +rdcvolume_SOURCES = src/rdcvolume.cpp +myrdcvolume_SOURCES = src/myrdcvolume.cpp +dumpXML_SOURCES = src/dumpXML.cpp +hellodevice_SOURCES = hello_src/hellodevice.cpp +helloctl_SOURCES = hello_src/helloctl.cpp + +upsend_SOURCES = upsend_src/upsend.cpp \ + upsend_src/streamer.cpp \ + upsend_src/wav.cpp +upsend_LDADD = -lupnpp -lmicrohttpd -lpthread -lrt +upsend_CPPFLAGS = -I/usr/include/libupnpp -I$(top_srcdir)/src -DHAVE_STD_FUTURE=1 diff --git a/other/libupnppsamples-code/README.asc b/other/libupnppsamples-code/README.asc new file mode 100755 index 000000000..adf1022d5 --- /dev/null +++ b/other/libupnppsamples-code/README.asc @@ -0,0 +1,64 @@ += libupnpp sample programs + +This repository has a bunch of small(ish) sample programs to help with +starting-up a libupnpp-based project. Some of them may be useful in their +own right but beware: + +NOTE: none of the samples take a lot of care about managing memory because +they're of the 'run once and die' kind. Be careful about cleanup if you +integrate bits of code in a longer-running program. + +The different samples are hopefully commented enough to be understandable +and useful. + +== samples + +=== src/uplistdir.cpp + +Just list all devices and services on the local network, using the simple +libupnpp discovery 'traverse' method, which has to wait for the full +discovery window. + +=== src/rdcvolume.cpp + +Control the volume on an UPnP AV renderer, using the keyboard. This is a +simple demonstration of using a predefined libupnpp control class to control a +standard device. It uses discovery callbacks to connect to the device as +soon as it responds to search. + +=== src/myrdcvolume.cpp + +This is functionally the same as rdcvolume, but it defines its own service +control interface class. This is to show how you can do stuff without the +predefined control classes, and use libupnpp to control an arbitrary UPnP +device. + +=== hello_src/hellodevice.cpp, hello_src/helloctl.cpp + +This shows how to implement a "Hello World" device/service and the +corresponding control interface. Nothing in there that is not more +interestingly implemented in upmpdcli, but it is as simple as possible, +so certainly easier to understand. + +=== upsend_src + +A program to send an audio file to an UPnP AV renderer, without using a +Media Server. Can also send a 44100/16/2 stream read on stdin as a wav +file. The file description part (DIDL) is not too smart, but most +renderers don't seem to care. It uses libmicrohttpd to serve the audio file +to the renderer. Possibly could be improved and find a use. + +=== src/multirdr.cpp + +Shows that we can get events from multiple UPnP AV renderers. + +=== src/upexplo.cpp + +Has a whole bunch of more or less useful code snippets, accessing UPnP AV +Media Server and Renderer services. + +=== src/ohradio.cpp, src/ohsender.cpp + +Code to interface the OpenHome Radio and Sender services. Not sure that +this is good for anything... + diff --git a/other/libupnppsamples-code/autogen.sh b/other/libupnppsamples-code/autogen.sh new file mode 100755 index 000000000..65c2aad71 --- /dev/null +++ b/other/libupnppsamples-code/autogen.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +aclocal +automake --add-missing --copy +autoconf diff --git a/other/libupnppsamples-code/configure.ac b/other/libupnppsamples-code/configure.ac new file mode 100755 index 000000000..3b96e965e --- /dev/null +++ b/other/libupnppsamples-code/configure.ac @@ -0,0 +1,11 @@ +AC_PREREQ([2.53]) +AC_INIT([upexplorer], [0.10.0], [jfd@lesbonscomptes.com], + [upexplorer], [http://www.lesbonscomptes.com/upmpdcli]) +AC_CONFIG_SRCDIR([src/upexplo.cpp]) +AC_CONFIG_HEADERS([src/localconfig.h]) +AM_INIT_AUTOMAKE([1.10 no-define subdir-objects foreign]) + +AC_PROG_CXX + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/other/libupnppsamples-code/hello_src/helloctl.cpp b/other/libupnppsamples-code/hello_src/helloctl.cpp new file mode 100755 index 000000000..5ab5c8081 --- /dev/null +++ b/other/libupnppsamples-code/hello_src/helloctl.cpp @@ -0,0 +1,148 @@ +// This libupnpp sample is the control side for the hellodevice sample +// device implementation + +#include +#include +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/soaphelp.hxx" +#include "libupnpp/control/discovery.hxx" +#include "libupnpp/control/device.hxx" +#include "libupnpp/control/service.hxx" + +using namespace std; +using namespace std::placeholders; + +// Locally defined control class for the Rendering Control +// service. We're just copying code from the libupnpp actually, this is +// just to show that it can be done outside the library. +class HelloCTL : public UPnPClient::Service { +public: + + /* Construct by copying data from device and service objects.*/ + HelloCTL(const UPnPClient::UPnPDeviceDesc& device, + const UPnPClient::UPnPServiceDesc& service) + : UPnPClient::Service(device, service) { + // No event handling. Look at, e.g. rdcvolume.cpp for an example + } + + virtual ~HelloCTL() {} + + virtual bool serviceTypeMatch(const std::string& tp) { + return isHelloService(tp); + } + + /* Test that a service type matches ours. This can be used + with the directory traversal routine */ + static bool isHelloService(const std::string& st) { + // Note that we do not care about the version + return st.find("urn:upnpp-schemas:service:HelloService") == 0; + } + + int hello(); +}; + +int HelloCTL::hello() +{ + // Outgoing parameters. The object is constructed with the service + // type (comes from the description we were built on), and the + // action name. This is sufficient for some actions (ie stop()) + UPnPP::SoapOutgoing args(getServiceType(), "Hello"); + + // This call does not need further outgoing arguments (see + // rdcvolume for an example of these. + + // We have to declare a return parameter, even if we don't care + // about the contents. + UPnPP::SoapIncoming data; + + int ret = runAction(args, data); + if (ret != UPNP_E_SUCCESS) { + return ret; + } + string value; + if (!data.get("MyValue", &value)) { + cerr << "HelloCTL:getVolume: missing MyValue in response\n"; + return UPNP_E_BAD_RESPONSE; + } + + cout << "Hello : " << value << endl; + return 0; +} + +// Device discovery part. We do it the easy way here: use a blocking +// call which will wait for the initial window to complete. We could +// traverse the device directory in search, for example of a device of +// a specific kind instead of using a device name like we do here (there is +// an example of UPnPDeviceDirectory::traverse() usage in uplistdir.cpp). +// +// See rdcvolume.cpp for a version using callbacks to get the device asap +shared_ptr getService(const string& name) +{ + // Initialize and get a discovery directory handle. + auto *superdir = UPnPClient::UPnPDeviceDirectory::getTheDir(1); + if (nullptr == superdir) { + cerr << "Discovery init failed\n"; + return shared_ptr(); + } + + UPnPClient::UPnPDeviceDesc devicedesc; + // We look-up the device by either friendlyname or udn as the 2 + // namespaces are unlikely to overlap, no need to complicate things + if (!superdir->getDevByUDN(name, devicedesc) && + !superdir->getDevByFName(name, devicedesc)) { + cerr << "Can't connect to " << name << endl; + return shared_ptr(); + } + + // Walk the device description service list, looking for ours + for (const auto& ent : devicedesc.services) { + // cout << ent.dump() << endl; + if (HelloCTL::isHelloService(ent.serviceType)) { + return make_shared(devicedesc, ent); + } + } + cerr << name << " has no hello service\n"; + return shared_ptr(); +} + +int main(int argc, char **argv) +{ + // Initialize libupnpp logging + Logger::getTheLog("")->setLogLevel(Logger::LLERR); + + argv++;argc--; + if (argc != 1) { + cerr << "Usage: rdcvolume rendererNameOrUid\n"; + return 1; + } + string devname(*argv++); + argc--; + + + // Explicitely initialize libupnpp so that we can display a + // possible error + UPnPP::LibUPnP *mylib = UPnPP::LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + + shared_ptr hlo = getService(devname); + if (!hlo) { + cerr << "Device " << devname << + " has no Hello service" << endl; + return 1; + } + hlo->hello(); + return 0; +} + diff --git a/other/libupnppsamples-code/hello_src/hellodevice.cpp b/other/libupnppsamples-code/hello_src/hellodevice.cpp new file mode 100755 index 000000000..356494c91 --- /dev/null +++ b/other/libupnppsamples-code/hello_src/hellodevice.cpp @@ -0,0 +1,164 @@ +// A barebones example of device implementation. +// +// The skeleton code for the Service part could have been +// automatically generated by the scripts/sdeftoc.py (libupnpp source +// tree), from the xml description, but we did it by hand instead. +// +// This is a minimal example. Refer to, e.g. the upmpdcli code for a +// more complete exercise of the library. +#include + +#include +#include +#include + +using namespace std; +using namespace std::placeholders; +using namespace UPnPProvider; +using namespace UPnPP; + +// Beware: these must match the values for serviceType and serviceId in the +// device description document +const string sTpHello("urn:upnpp-schemas:service:HelloService:1"); +const string sIdHello("urn:upnpp-org:serviceId:HelloService"); + +// Device description document. This has some identifying data and a +// list of services. +// Beware: the UDN value must match the uuid parameter for the device +// constructor, and the SCDPURL paths must match the vdircontent paths +// (see below) +const string devicedesc(R"raw( + + 10 + + urn:upnpp-schemas:device:HelloDevice:1 + HelloDeviceName + HelloDevices + SimpleHelloDevice + 1.0 + uuid:you-should-find-something-better + + + urn:upnpp-schemas:service:HelloService:1 + urn:upnpp-org:serviceId:HelloService + /hello/Hello.xml + /ctl/Hello + /evt/Hello + + + + + + +)raw"); + +// Service description document. The variables and actions. Action +// names must match the name parameter to the addActionMapping calls +const string helloservicedesc(R"raw( + + 11 + + + Hello + + + MyValue + out + Hello + + + + + + + Hello + string + + + +)raw"); + +// The files which will be served by the HTTP server. Refer to the +// comments in device.hxx for more details. +unordered_map myfiles { + {"/hello/description.xml", {devicedesc, "text/xml"}}, + {"/hello/Hello.xml", {helloservicedesc, "text/xml"}}, + }; + +// The service class defines the methods which will be called for each +// UPnP action (and the event handling, which is not shown here). +class HelloService : public UPnPProvider::UpnpService { +public: + + // The constructor initializes the base class (which links to the + // device and lib), and sets our action callbacks. + HelloService(UpnpDevice *dev) + : UpnpService(sTpHello, sIdHello, dev), m_dev(dev) { + + m_dev->addActionMapping(this, "Hello", + bind(&HelloService::hello, this, _1, _2)); + + } + + // Event retrieval routine. This gets polled (the service can + // trigger an immediate poll). We're not really doing this, look + // at how upmpdcli openhome services do it + virtual bool getEventData(bool all, std::vector& names, + std::vector& values) { + return true; + } + +private: + + // An action method. This takes no argument, just returns a value. + // Look at upmpdcli code to see how to handle incoming parameters. + int hello(const SoapIncoming& sc, SoapOutgoing& data) { + + data.addarg("MyValue", "World"); + return UPNP_E_SUCCESS; + } + + UpnpDevice *m_dev; +}; + +// The device initializes the parent class and creates its services +class HelloDevice : public UpnpDevice { +public: + HelloDevice(const string& deviceid, + const std::unordered_map& files) + : UpnpDevice(deviceid, files) { + m_services.push_back(new HelloService(this)); + } + + ~HelloDevice() { + for (auto& ent : m_services) { + delete ent; + } + } + vector m_services; +}; + + +int main(int argc, char *argv[]) +{ + // Initialize libupnpp logging + Logger::getTheLog("")->setLogLevel(Logger::LLERR); + + //cout << "DEVICE: " << devicedesc << endl; + //cout << "SERVICE: " << helloservicedesc << endl; + + // uuid must match the one in the description document + HelloDevice dev("uuid:you-should-find-something-better", myfiles); + + string host; + unsigned short port; + dev.ipv4(&host, &port); + + // fname should match what we set in the desc above ! A real + // program would do it differently... + string fname("HelloDeviceName"); + + cout << fname << " running on host " << host << " port " << port << endl; + + dev.eventloop(); +} diff --git a/other/libupnppsamples-code/src/dumpXML.cpp b/other/libupnppsamples-code/src/dumpXML.cpp new file mode 100755 index 000000000..f71246f7c --- /dev/null +++ b/other/libupnppsamples-code/src/dumpXML.cpp @@ -0,0 +1,130 @@ +// This libupnpp sample program downloads all the XML description data +// from a given devices and writes it to a target directory. + +#include +#include +#include + +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/log.hxx" +#include "libupnpp/control/description.hxx" +#include "libupnpp/control/discovery.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +static void neutchars(const string& str, string& out, const string& chars) +{ + string::size_type startPos, pos; + out.clear(); + for (pos = 0;;) { + // Skip initial chars, break if this eats all. + if ((startPos = str.find_first_not_of(chars, pos)) == string::npos) { + break; + } + // Find next delimiter or end of string (end of token) + pos = str.find_first_of(chars, startPos); + // Add token to the output. Note: token cant be empty here + if (pos == string::npos) { + out += str.substr(startPos); + } else { + out += str.substr(startPos, pos - startPos) + "_"; + } + } +} + +static bool make_file(const string& nm, const string& content) +{ + int fd = open(nm.c_str(), O_CREAT|O_WRONLY|O_TRUNC, 0600); + if (fd < 0) { + cerr << "Could not create/open " << nm << endl; + perror("open"); + return false; + } + if (write(fd, content.c_str(), content.size()) != content.size()) { + close(fd); + cerr << "Could not write to " << nm << endl; + perror("write"); + return false; + } + close(fd); + return true; +} + +int main(int argc, char *argv[]) +{ + argv++;argc--; + if (argc != 2) { + cerr << "Usage: dumpXML \n"; + cerr << " will be created if it does not exist\n"; + return 1; + } + string devname(*argv++); + argc--; + string dirname(*argv++); + argc--; + + // Initialize libupnpp logging + Logger::getTheLog("")->setLogLevel(Logger::LLDEB); + + // Get a handle to the main lib object. You don't really need to + // do this actually. We just do it to check that the lib + // initialized ok, but there are other possible uses, see the doc + // in the include file. + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + + // Get a handle to the device directory. You can call this + // multiple times, only the first call does something, any further + // call will just return the pointer to the singleton. + UPnPDeviceDirectory *superdir = UPnPDeviceDirectory::getTheDir(); + if (superdir == 0) { + cerr << "Cant access device directory\n"; + return 1; + } + + if (access(dirname.c_str(), X_OK|W_OK)) { + if (mkdir(dirname.c_str(), 0755)) { + cerr << "Could not create " << dirname << endl; + perror("mkdir"); + return 1; + } + } + + string deviceXML; + unordered_map srvsXML; + if (!superdir->getDescriptionDocuments(devname, deviceXML, srvsXML)) { + cerr << "Could not retrieve description documents\n"; + return 1; + } + + string path, fn, fn1; + fn = devname + "-description.xml"; + neutchars(fn, fn1, "/ \n\r\t"); + path = dirname + "/" + fn1; + if (!make_file(path, deviceXML)) { + return 1; + } + for (auto entry : srvsXML) { + fn = entry.first + ".xml"; + neutchars(fn, fn1, "/ \n\r\t"); + path = dirname + "/" + fn1; + if (!make_file(path, entry.second)) { + return 1; + } + } + return 0; +} diff --git a/other/libupnppsamples-code/src/localconfig.h.in b/other/libupnppsamples-code/src/localconfig.h.in new file mode 100755 index 000000000..32c6c07af --- /dev/null +++ b/other/libupnppsamples-code/src/localconfig.h.in @@ -0,0 +1,61 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* File Offset size */ +#undef _FILE_OFFSET_BITS + +/* Large files support */ +#undef _LARGE_FILE_SOURCE + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/other/libupnppsamples-code/src/multirdr.cpp b/other/libupnppsamples-code/src/multirdr.cpp new file mode 100755 index 000000000..70bef39e8 --- /dev/null +++ b/other/libupnppsamples-code/src/multirdr.cpp @@ -0,0 +1,130 @@ +// Just monitor multiple renderers. + +#include +#include + +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/control/discovery.hxx" +#include "libupnpp/control/mediarenderer.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +template class MyReporter : public VarEventReporter { +public: + MyReporter(const string& nm, T srvh) + : m_srv(srvh), m_nm(nm) + { + m_srv->installReporter(this); + } + virtual ~MyReporter() { + m_srv->installReporter(0); + } + + // TransportState, Repeat, Shuffle, Id, TracksMax + virtual void changed(const char *nm, int value) + { + cerr << m_nm << ": Changed: " << nm << " (int): " << value << endl; + } + + // Stuff + virtual void changed(const char *nm, const char *value) + { + cerr << m_nm << ": Changed: " << nm << " (char*): " << value << endl; + } + + // IdArray + virtual void changed(const char *nm, std::vector ids) + { + cerr << m_nm << ": Changed: " << nm << " (vector)" << endl; + } + +private: + T m_srv; + string m_nm; +}; + +UPnPClient::UPnPDeviceDirectory *superdir; + +UPnPClient::MRDH getRenderer(const string& friendlyName) +{ + UPnPClient::UPnPDeviceDesc ddesc; + if (superdir->getDevByFName(friendlyName, ddesc)) { + return UPnPClient::MRDH(new UPnPClient::MediaRenderer(ddesc)); + } + cerr << "getDevByFname failed" << endl; + return UPnPClient::MRDH(); +} + +int main(int argc, char **argv) +{ + argc--; argv++; + if (argc == 0) { + cerr << "Usage: multirdr [ ...]\n"; + return 1; + } + + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + superdir = UPnPClient::UPnPDeviceDirectory::getTheDir(); + if (superdir == 0) { + cerr << "multirdr: can't get superdir" << endl; + return 1; + } + + while (argc) { + + string friendlyName(*argv++); + argc--; + + UPnPClient::MRDH rdr = getRenderer(friendlyName); + if (!rdr) { + cerr << "Renderer " << friendlyName << " not found" << endl; + return 1; + } + + // Create a RenderingControl event monitor. + UPnPClient::RDCH rdc = rdr->rdc(); + if (!rdc) { + cerr << "Device " << friendlyName << + " has no RenderingControl service" << endl; + return 1; + } + new MyReporter(friendlyName, rdc); + + // AVTransport? + UPnPClient::AVTH avt = rdr->avt(); + if (avt) { + new MyReporter(friendlyName, avt); + } + + // Maybe this is an openhome device ? monitor the playlist + UPnPClient::OHPRH ohpr = rdr->ohpr(); + UPnPClient::OHPLH ohpl; + if (!ohpr) { + cerr << "Device " << friendlyName << + " has no OpenHome support" << endl; + } else { + ohpl = rdr->ohpl(); + if (ohpl) { + new MyReporter(friendlyName, ohpl); + } + } + } + + // Just stay around and let the reporter print events + sleep(1000); + return 0; +} diff --git a/other/libupnppsamples-code/src/myrdcvolume.cpp b/other/libupnppsamples-code/src/myrdcvolume.cpp new file mode 100755 index 000000000..fc213b021 --- /dev/null +++ b/other/libupnppsamples-code/src/myrdcvolume.cpp @@ -0,0 +1,270 @@ +// This libupnpp sample does about the same thing as rdcvolume, but it defines +// its own control classes instead of the ones predefined by libupnpp. + +#include + +#include +#include +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/soaphelp.hxx" +#include "libupnpp/control/discovery.hxx" +#include "libupnpp/control/device.hxx" +#include "libupnpp/control/service.hxx" + +using namespace std; +using namespace std::placeholders; + +//using namespace UPnPClient; +//using namespace UPnPP; + +// Locally defined control class for the Rendering Control +// service. We're just copying code from the libupnpp actually, this is +// just to show that it can be done outside the library. +class MyRDC : public UPnPClient::Service { +public: + + /* Construct by copying data from device and service objects.*/ + MyRDC(const UPnPClient::UPnPDeviceDesc& device, + const UPnPClient::UPnPServiceDesc& service) + : UPnPClient::Service(device, service) { + serviceInit(device, service); + } + MyRDC() {} + virtual ~MyRDC() {} + + bool serviceInit(const UPnPClient::UPnPDeviceDesc& device, + const UPnPClient::UPnPServiceDesc& service) { + // We want to have a look at our service description file + // (xml) to retrieve the min/max/step values for the + // volume. Not all services need to do this. + UPnPClient::UPnPServiceDesc::Parsed sdesc; + if (service.fetchAndParseDesc(device.URLBase, sdesc)) { + auto it = sdesc.stateTable.find("Volume"); + if (it != sdesc.stateTable.end() && it->second.hasValueRange) { + m_volmin = it->second.minimum; + m_volmax = it->second.maximum; + m_volstep = it->second.step; + } else { + // ?? + m_volmin = 0; + m_volmax = 100; + m_volstep = 1; + } + } + return true; + } + + virtual bool serviceTypeMatch(const std::string& tp) { + return isRDCService(tp); + } + + /* Test that a service type matches ours. This can be used + with the directory traversal routine */ + static bool isRDCService(const std::string& st) { + // Note that we do not care about the version + return st.find("urn:schemas-upnp-org:service:RenderingControl") == 0; + } + + int setVolume(int volume, const std::string& channel = "Master"); + int getVolume(const std::string& channel = "Master"); + + /* Volume settings params */ + int m_volmin; + int m_volmax; + int m_volstep; + +private: + + void evtCallback(const unordered_map& props) { + // The callback gets a map of changed properties as + // parameter. In turn, the classes defined by libupnpp + // (e.g. RenderingControl) call a client event reporter in an + // uniform way, and after massaging the data a bit, but you + // can do whatever you like here. UPnP AV is special + // because it coalesces the values inside a LastChange XML + // string. Many services just report them individually. + cerr << "evtCallback: props size " << props.size() << endl; + for (const auto& ent : props) { + cout << ent.first << " -> " << ent.second << endl; + } + } + + // Register our member function callback. It's just an + // std::function, other approaches may be possible. + void registerCallback() { + UPnPClient::Service::registerCallback( + std::bind(&MyRDC::evtCallback, this, _1)); + } +}; + +// The libupnpp equivalent checks and converts the range, and also +// that a volume change is actually required, and does appropriate +// rounding. We're just showing how to send a parameter here. The arg +// names are defined by the service description XML file, so it would +// be possible to construct the call after the XML data (a la +// upnp-inspector), there is nothing in libupnpp to prevent it. +int MyRDC::setVolume(int ivol, const string& channel) +{ + // Outgoing parameters. The object is constructed with the service + // type (comes from the description we were built on), and the + // action name. This is sufficient for some actions (ie stop()) + UPnPP::SoapOutgoing args(getServiceType(), "SetVolume"); + + // This call needs further outgoing arguments, which goes in there + // through an operator() overload + args("InstanceID", "0")("Channel", channel) + ("DesiredVolume", UPnPP::SoapHelp::i2s(ivol)); + + // We have to declare a return parameter, even if we don't care + // about the contents. + UPnPP::SoapIncoming data; + + return runAction(args, data); +} + +// Same as setVolume really, except that we look at the return data. +int MyRDC::getVolume(const string& channel) +{ + UPnPP::SoapOutgoing args(getServiceType(), "GetVolume"); + args("InstanceID", "0")("Channel", channel); + UPnPP::SoapIncoming data; + int ret = runAction(args, data); + if (ret != UPNP_E_SUCCESS) { + return ret; + } + int volume; + if (!data.get("CurrentVolume", &volume)) { + cerr << "MyRDC:getVolume: missing CurrentVolume in response\n"; + return UPNP_E_BAD_RESPONSE; + } + + return volume; +} + + +// Device discovery part. We do it the easy way here: use a blocking +// call which will wait for the initial window to complete. We could +// traverse the device directory in search, for example of a device of +// a specific kind instead of using a device name like we do here (there is +// an example of UPnPDeviceDirectory::traverse() usage in uplistdir.cpp). +// +// See rdcvolume.cpp for a version using callbacks to get the device asap +shared_ptr getService(const string& name) +{ + // Initialize and get a discovery directory handle. + auto *superdir = UPnPClient::UPnPDeviceDirectory::getTheDir(2); + if (nullptr == superdir) { + cerr << "Discovery init failed\n"; + return shared_ptr(); + } + + UPnPClient::UPnPDeviceDesc devicedesc; + // We look-up the device by either friendlyname or udn as the 2 + // namespaces are unlikely to overlap, no need to complicate things + if (!superdir->getDevByUDN(name, devicedesc) && + !superdir->getDevByFName(name, devicedesc)) { + cerr << "Can't connect to " << name << endl; + return shared_ptr(); + } + + // UPnPClient::Device does nothing really interesting actually. It + // just holds the device description. Derived device + // implementations, for example for a MediaRenderer, add a bit of + // value by creating objects for the well-known services. Here we + // just dispense with the device creation, and directly create a + // service object. + + // Walk the device description service list, looking for ours + for (const auto& ent : devicedesc.services) { + if (MyRDC::isRDCService(ent.serviceType)) { + cout << ent.dump() << endl; + return make_shared(devicedesc, ent); + } + } + cerr << name << " has no rendering control service\n"; + return shared_ptr(); +} + +// nothing to see here: character reading, one at a time. +int mygetch() +{ + struct termios oldt, newt; + int ch; + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + ch = getchar(); + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + return ch; +} + +int main(int argc, char **argv) +{ + argv++;argc--; + if (argc != 1) { + cerr << "Usage: rdcvolume rendererNameOrUid\n"; + return 1; + } + string devname(*argv++); + argc--; + + // Initialize libupnpp logging + Logger::getTheLog("")->setLogLevel(Logger::LLERR); + + // Explicitely initialize libupnpp so that we can display a + // possible error + UPnPP::LibUPnP *mylib = UPnPP::LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + + + shared_ptr rdc = getService(devname); + if (!rdc) { + cerr << "Device " << devname << + " has no RenderingControl service" << endl; + return 1; + } + + cout << "q = quit, 'u' = up, 'd' = down\n"; + for (;;) { + int vol = rdc->getVolume(); + cout << "Volume now " << vol << endl; + int key = mygetch(); + + if (key == 'q') { + cout << "QUIT\n"; + break; + } else if (key == 'u') { + vol += 5; + if (vol > 100) { + vol = 100; + } + } else if (key == 'd') { + vol -= 5; + if (vol < 0) { + vol = 0; + } + } else { + cout << "Bad key: " << (char)key << endl; + continue; + } + if (rdc->setVolume(vol)) { + cerr << "setVolume(" << vol << ") failed\n"; + } + } + + return 0; +} + diff --git a/other/libupnppsamples-code/src/ohradio.cpp b/other/libupnppsamples-code/src/ohradio.cpp new file mode 100755 index 000000000..561931abb --- /dev/null +++ b/other/libupnppsamples-code/src/ohradio.cpp @@ -0,0 +1,347 @@ +/* Copyright (C) 2013 J.F.Dockes + * 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. + */ + +/////////////// libupnpp OhRadio trial driver + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/log.hxx" +#include "libupnpp/upnpputils.hxx" +#include "libupnpp/control/cdirectory.hxx" +#include "libupnpp/control/discovery.hxx" +#include "libupnpp/control/mediarenderer.hxx" +#include "libupnpp/control/ohradio.hxx" +#include "libupnpp/control/ohinfo.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +UPnPDeviceDirectory *superdir; + +int channelid; + +class MReporter : public UPnPClient::VarEventReporter { +public: + void changed(const char *nm, int value) { + if (!strcmp(nm, "TransportState")) { + string tpstate; + switch(value) { + case OHPlaylist::TPS_Unknown: tpstate = "Unknown"; break; + case OHPlaylist::TPS_Buffering: tpstate = "Buffering"; break; + case OHPlaylist::TPS_Paused: tpstate = "Paused"; break; + case OHPlaylist::TPS_Playing: tpstate = "Playing"; break; + case OHPlaylist::TPS_Stopped: tpstate = "Stopped"; break; + } + cout << "Changed: " << nm << " : " << tpstate << endl; + } else if (!strcmp(nm, "Id")) { + cout << "Changed: " << nm << " : " << value << endl; + channelid = value; + } else { + cout << "Changed: " << nm << " : " << value << endl; + } + } + void changed(const char *nm, const char *value) { + cout << "Changed: " << nm << " : " << value << endl; + } + + void changed(const char *nm, UPnPDirObject meta) { + cout << "Changed: " << nm << " : " << meta.dump() << endl; + } + + void changed(const char * nm, std::vector ids) { + cout << "Changed: " << nm << " : "; + for (unsigned int i = 0; i < ids.size(); i++) { + cout << SoapHelp::i2s(ids[i]) << " "; + } + cout << endl; + } +}; + +MRDH getRenderer(const string& friendlyName) +{ + if (superdir == 0) { + superdir = UPnPDeviceDirectory::getTheDir(); + } + + UPnPDeviceDesc ddesc; + if (superdir->getDevByFName(friendlyName, ddesc)) { + return MRDH(new MediaRenderer(ddesc)); + } + cerr << "getDevByFname failed" << endl; + return MRDH(); +} + +void rdMonitor(OHRDH hdl, OHIFH hdlif) +{ + MReporter reporter; + hdl->installReporter(&reporter); + hdlif->installReporter(&reporter); + while (true) { + static int prevchan; + sleep(2); + string uri; + UPnPDirObject dirent; + if (0&& prevchan != channelid) { + cerr << "New ChannelId: " << channelid << endl; + prevchan = channelid; +#if 0 + if (hdl->channel(&uri, &dirent) == 0) { + cout << "Channel: uri " << uri << "\nMetadata " << + dirent.dump() << endl; + } +#endif + int ret; + if ((ret = hdlif->metatext(&dirent)) == 0) { + cout << "Metatext: " << dirent.dump() << endl; + } else { + cerr << "Metatext: failed: " << ret << endl; + } + + } + } +} + +void rdIdArray(OHRDH hdl) +{ + vector ids; + int token = 0; + int ret; + if ((ret = hdl->idArray(&ids, &token)) != 0) { + cerr << "idArray failed: " << ret << endl; + return; + } + + cout << "token: " << token << ". " << ids.size() << " ids: "; + for (unsigned int i = 0; i < ids.size(); i++) { + cout << SoapHelp::i2s(ids[i]) << " "; + } + cout << endl; +} + +string rdReadList(OHRDH hdl, int id = -1) +{ + vector ids; + int token = 0; + int ret; + if ((ret = hdl->idArray(&ids, &token)) != 0) { + cerr << "idArray failed: " << ret << endl; + return string(); + } + vector ents; + if ((ret = hdl->readList(ids, &ents)) != 0) { + cerr << "readList failed: " << ret << endl; + return string(); + } + + for (unsigned int i = 0; i < ents.size(); i++) { + if (id == -1) { + cout << "Id: " << SoapHelp::i2s(ents[i].id) << + " url " << ents[i].url << + "\nmetadata: " << ents[i].dirent.dump() << "\n"; + } else { + if (ents[i].id == id) { + return ents[i].url; + } + } + } + cout << endl; + return string(); +} + +// Could not get this to work. Gets UPNP_E_BAD_RESPONSE on sendAction?? +void rdRead(OHRDH hdl, int id) +{ + UPnPDirObject dirent; + int ret; + if ((ret = hdl->read(id, &dirent)) != 0) { + cerr << "read failed: " << ret << endl; + return; + } + cout << "read: metadata: " << dirent.dump() << endl; +} + +void rdSetId(OHRDH hdl, int id) +{ + int ret; + string url = rdReadList(hdl, id); + if (url.empty()) { + cerr << "Id " << id << " not found\n"; + return; + } + if ((ret = hdl->setId(id, url)) != 0) { + cerr << "setId failed: " << ret << endl; + return; + } + cout << "setId ok\n"; +} + +static char *thisprog; +static char usage [] = +" -a : run idArray\n" +" -M : monitor OHRadio\n" +" -p : pause radio\n" +" -P : play radio\n" +" -r id: run read\n" +" -R : run ReadList\n" +" -s id: run setId\n" +" -S : stop\n" +" \n" +; + +static void +Usage(void) +{ + fprintf(stderr, "%s: usage:\n%s", thisprog, usage); + exit(1); +} +static int op_flags; +#define OPT_M 0x1 +#define OPT_a 0x2 +#define OPT_r 0x4 +#define OPT_R 0x8 +#define OPT_s 0x10 +#define OPT_P 0x20 +#define OPT_p 0x40 +#define OPT_S 0x80 + +static struct option long_options[] = { + {0, 0, 0, 0} +}; + +int main(int argc, char *argv[]) +{ + string fname; + string arg; + + thisprog = argv[0]; + + int ret; + int option_index = 0; + while ((ret = getopt_long(argc, argv, "aMPpRrSs", + long_options, &option_index)) != -1) { + switch (ret) { + case 'a': if (op_flags) Usage(); op_flags |= OPT_a; break; + case 'M': if (op_flags) Usage(); op_flags |= OPT_M; break; + case 'P': if (op_flags) Usage(); op_flags |= OPT_P; break; + case 'p': if (op_flags) Usage(); op_flags |= OPT_p; break; + case 'R': if (op_flags) Usage(); op_flags |= OPT_R; break; + case 'r': if (op_flags) Usage(); op_flags |= OPT_r; break; + case 's': if (op_flags) Usage(); op_flags |= OPT_s; break; + case 'S': if (op_flags) Usage(); op_flags |= OPT_S; break; + default: + Usage(); + } + } + + if (op_flags & (OPT_M|OPT_a|OPT_R|OPT_p|OPT_P|OPT_S)) { + if (optind != argc - 1) + Usage(); + fname = argv[optind++]; + } + if (op_flags & (OPT_r|OPT_s)) { + if (optind != argc - 2) + Usage(); + fname = argv[optind++]; + arg = argv[optind++]; + } + + if (Logger::getTheLog("/tmp/ohradio.log") == 0) { + cerr << "Can't initialize log" << endl; + return 1; + } + Logger::getTheLog("")->setLogLevel(Logger::LLDEB1); + + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + mylib->setLogFileName("/tmp/libupnp.log", LibUPnP::LogLevelDebug); + + MRDH rdr = getRenderer(fname); + if (!rdr) { + cerr << "Can't connect torenderer\n"; + return 1; + } + OHRDH hdl = rdr->ohrd(); + if (!hdl) { + cerr << "Device has no OHRadio service" << endl; + return 1; + } + OHIFH hdlif = rdr->ohif(); + if (!hdlif) { + cerr << "Device has no OHInfo service" << endl; + return 1; + } + + if ((op_flags & OPT_M)) { + rdMonitor(hdl, hdlif); + } else if ((op_flags & OPT_a)) { + rdIdArray(hdl); + } else if ((op_flags & OPT_R)) { + rdReadList(hdl); + } else if ((op_flags & OPT_p)) { + int ret = hdl->pause(); + if (ret) { + cerr << "Pause: " << SoapHelp::i2s(ret); + return 1; + } else { + cout << "Pause Ok\n"; + } + } else if ((op_flags & OPT_P)) { + int ret = hdl->play(); + if (ret) { + cerr << "Play: " << SoapHelp::i2s(ret); + return 1; + } else { + cout << "Play Ok\n"; + } + } else if ((op_flags & OPT_S)) { + int ret = hdl->stop(); + if (ret) { + cerr << "Stop: " << SoapHelp::i2s(ret); + return 1; + } else { + cout << "Stop Ok\n"; + } + } else if ((op_flags & OPT_r)) { + rdRead(hdl, atoi(arg.c_str())); + } else if ((op_flags & OPT_s)) { + rdSetId(hdl, atoi(arg.c_str())); + } else { + Usage(); + } + + return 0; +} diff --git a/other/libupnppsamples-code/src/ohsender.cpp b/other/libupnppsamples-code/src/ohsender.cpp new file mode 100755 index 000000000..cf59cfed3 --- /dev/null +++ b/other/libupnppsamples-code/src/ohsender.cpp @@ -0,0 +1,170 @@ +/* Copyright (C) 2013 J.F.Dockes + * 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. + */ + +// Code to exercise the libupnpp OhSender class + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/log.hxx" +#include "libupnpp/upnpputils.hxx" +#include "libupnpp/control/cdirectory.hxx" +#include "libupnpp/control/discovery.hxx" +#include "libupnpp/control/mediarenderer.hxx" +#include "libupnpp/control/ohsender.hxx" +#include "libupnpp/control/linnsongcast.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +class MReporter : public UPnPClient::VarEventReporter { +public: + void changed(const char *nm, int value) { + cout << "Changed: " << nm << " : " << value << endl; + } + void changed(const char *nm, const char *value) { + cout << "Changed: " << nm << " : " << value << endl; + } + + void changed(const char *nm, UPnPDirObject meta) { + cout << "Changed: " << nm << " : " << meta.dump() << endl; + } +}; + +void rdMonitor(OHSNH hdl) +{ + MReporter reporter; + hdl->installReporter(&reporter); + + while (true) { + sleep(2); + string uri; + string meta; + int ret; + if ((ret = hdl->metadata(uri, meta)) == 0) { + cout << "Uri: " << uri << " metadata " << meta << endl; + } else { + cerr << "Metadata: failed: " << ret << endl; + } + } +} + +void metadata(OHSNH hdl) +{ + string uri, meta; + int ret; + if ((ret = hdl->metadata(uri, meta)) != 0) { + cerr << "metadata failed: " << ret << endl; + return; + } + cout << "read: uri: [" << uri << "] meta: " << meta << endl; +} + +static char *thisprog; +static char usage [] = +" -M : monitor OHSender\n" +" -m : run metadata\n" +" \n" +; + +static void +Usage(void) +{ + fprintf(stderr, "%s: usage:\n%s", thisprog, usage); + exit(1); +} +static int op_flags; +#define OPT_M 0x1 +#define OPT_m 0x2 + +static struct option long_options[] = { + {0, 0, 0, 0} +}; + +int main(int argc, char *argv[]) +{ + string fname; + string arg; + + thisprog = argv[0]; + + int ret; + int option_index = 0; + while ((ret = getopt_long(argc, argv, "Mm", + long_options, &option_index)) != -1) { + switch (ret) { + case 'M': if (op_flags) Usage(); op_flags |= OPT_M; break; + case 'm': if (op_flags) Usage(); op_flags |= OPT_m; break; + default: + Usage(); + } + } + if (!op_flags) + Usage(); + + if (op_flags & (OPT_M|OPT_m)) { + if (optind != argc - 1) + Usage(); + fname = argv[optind++]; + } + + if (Logger::getTheLog("/tmp/ohsender.log") == 0) { + cerr << "Can't initialize log" << endl; + return 1; + } + Logger::getTheLog("")->setLogLevel(Logger::LLDEB1); + + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + mylib->setLogFileName("/tmp/libupnp.log", LibUPnP::LogLevelDebug); + + string reason; + OHSNH hdl = Songcast::getSender(fname, reason); + if (!hdl) { + cerr << "Device has no OpenHome Sender service" << endl; + return 1; + } + + if ((op_flags & OPT_M)) { + rdMonitor(hdl); + } else if ((op_flags & OPT_m)) { + metadata(hdl); + } else { + Usage(); + } + + return 0; +} diff --git a/other/libupnppsamples-code/src/rdcvolume.cpp b/other/libupnppsamples-code/src/rdcvolume.cpp new file mode 100755 index 000000000..6d71e8cfd --- /dev/null +++ b/other/libupnppsamples-code/src/rdcvolume.cpp @@ -0,0 +1,226 @@ +// This libupnpp sample control program connects to a media renderer, +// designated by its friendly name or uuid, and lets you adjust the +// volume from the keyboard. It uses the MediaRenderer and +// RenderingControl device and service classes from libupnpp. + +#include + +#include +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/control/discovery.hxx" +#include "libupnpp/control/mediarenderer.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +// Event reporter. We are not really using it here, apart from printing +// stuff to the console. +class MyReporter : public VarEventReporter { +public: + MyReporter(const string& nm, RDCH rdc) + : m_nm(nm), m_srv(rdc) + { + m_srv->installReporter(this); + } + virtual ~MyReporter() { + m_srv->installReporter(0); + } + + virtual void changed(const char *nm, int value) + { + cerr << m_nm << " : Changed: " << nm << " (int): " << value << endl; + } + + virtual void changed(const char *nm, const char *value) + { + cerr << m_nm << " : Changed: " << nm << " (str): " << value << endl; + } + +private: + string m_nm; + RDCH m_srv; +}; + + +// +// Device discovery part. We can't just connect to the device, UPnP +// does not work like this. The lib is going to broadcast a request +// for devices to signal their presence, withing a fixed time window +// (a few seconds). We could just wait for the full window and then +// connect, but here, we are doing the fancy thing, setting up a +// callback which will be called as each new device manifests itself, +// so that we can connect asap. The callback is called from a +// different thread, so we need locking. +std::mutex discolock; +std::condition_variable discocv; + +// Using shared variables, but the callback is an std::function, so +// there are other possibilities. +UPnPDeviceDesc o_devicedesc; +string o_name; + +static bool discoCB(const UPnPDeviceDesc& device, const UPnPServiceDesc&) +{ + std::unique_lock lock(discolock); + //cerr << "discoCB: got " << device.friendlyName << endl; + if (!device.UDN.compare(o_name) || !device.friendlyName.compare(o_name)) { + //cerr << "discoCB: FOUND\n"; + o_devicedesc = device; + discocv.notify_all(); + } + return true; +} + +MRDH getRenderer(const string& name) +{ + // Add a discovery callback, and remember about it in case we're + // called several times (not the case in this program). + o_name = name; + static int cbindex = -1; + if (cbindex == -1) { + cbindex = UPnPDeviceDirectory::addCallback(discoCB); + } + + // Initialize and get a discovery directory handle. This must be + // done *after* the callback is set up, else we may miss devices. + static UPnPDeviceDirectory *superdir; + if (superdir == 0) { + superdir = UPnPDeviceDirectory::getTheDir(); + if (superdir == 0) { + cerr << "Discovery init failed\n"; + return MRDH(); + } + } + + // Until the initial delay is through, use the reporter to test + // devices as they come, so that we may respond asap + for (;;) { + std::unique_lock lock(discolock); +#if FUTURE + // Older versions of the lib don't have this. + int ms = superdir->getRemainingDelayMs(); +#else + int ms = superdir->getRemainingDelay() * 1000; +#endif + if (ms > 0) { + discocv.wait_for(lock, std::chrono::milliseconds(ms)); + if (!o_devicedesc.UDN.compare(name) || + !o_devicedesc.friendlyName.compare(name)) { + //cerr << "getRenderer: early wakeup\n"; + return MRDH(new MediaRenderer(o_devicedesc)); + } + } else { + // Initial delay done. We'll try one last time to ask the + // directory about our device + break; + } + } + + // Try one last time just in case. + if (superdir->getDevByUDN(name, o_devicedesc)) { + return MRDH(new MediaRenderer(o_devicedesc)); + } else if (superdir->getDevByFName(name, o_devicedesc)) { + return MRDH(new MediaRenderer(o_devicedesc)); + } + + cerr << "Can't connect to " << name << endl; + return MRDH(); +} + +// nothing to see here: character reading, one at a time. +int mygetch() +{ + struct termios oldt, newt; + int ch; + tcgetattr(STDIN_FILENO, &oldt); + newt = oldt; + newt.c_lflag &= ~(ICANON | ECHO); + tcsetattr(STDIN_FILENO, TCSANOW, &newt); + ch = getchar(); + tcsetattr(STDIN_FILENO, TCSANOW, &oldt); + return ch; +} + +int main(int argc, char **argv) +{ + argv++;argc--; + if (argc != 1) { + cerr << "Usage: rdcvolume rendererNameOrUid\n"; + return 1; + } + string devname(*argv++); + argc--; + + // Initialize libupnpp logging + Logger::getTheLog("stderr")->setLogLevel(Logger::LLDEB1); + + // Explicitely initialize libupnpp so that we can display a + // possible error + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + + + // Connect to the device + MRDH rdr = getRenderer(devname); + if (!rdr) { + cerr << "Renderer " << devname << " not found" << endl; + return 1; + } + + // The MediaRender class has magic to create the well-know service + // class instances, here RenderingControl + RDCH rdc = rdr->rdc(); + if (!rdc) { + cerr << "Device " << devname << + " has no RenderingControl service" << endl; + return 1; + } + + // Create the event-reporting object. Not used here actually, but + // it will print volume change events. + new MyReporter(devname, rdc); + + cout << "q = quit, 'u' = up, 'd' = down\n"; + for (;;) { + int vol = rdc->getVolume(); + cout << "Volume now " << vol << endl; + int key = mygetch(); + + if (key == 'q') { + cout << "QUIT\n"; + break; + } else if (key == 'u') { + vol += 5; + if (vol > 100) { + vol = 100; + } + } else if (key == 'd') { + vol -= 5; + if (vol < 0) { + vol = 0; + } + } else { + cout << "Bad key: " << (char)key << endl; + continue; + } + if (rdc->setVolume(vol)) { + cerr << "setVolume(" << vol << ") failed\n"; + } + } + + return 0; +} + diff --git a/other/libupnppsamples-code/src/typedservice.cpp b/other/libupnppsamples-code/src/typedservice.cpp new file mode 100755 index 000000000..f6d4fc6bd --- /dev/null +++ b/other/libupnppsamples-code/src/typedservice.cpp @@ -0,0 +1,80 @@ +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/control/typedservice.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +class MReporter : public UPnPClient::VarEventReporter { +public: + void changed(const char *nm, int value) { + cerr << "Reporter: changed(char *, int) invoked for nm " << nm << + " ??\n"; + } + void changed(const char *nm, const char *value) { + cout << "Changed: " << nm << " : " << value << endl; + } +}; + +int main(int argc, char **argv) +{ + argv++;argc--; + if (argc < 3) { + cerr << "Usage: tpservice NameOrUid partialservicetype action " + "[arg [...]]\n"; + return 1; + } + string devname(*argv++); + argc--; + string servtp(*argv++); + argc--; + string actnm(*argv++); + argc--; + + vector args; + while (argc--) { + args.push_back(*argv++); + } + + // Initialize libupnpp logging + Logger::getTheLog("stderr")->setLogLevel(Logger::LLDEB1); + // Explicitely initialize libupnpp so that we can display a + // possible error + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + + + TypedService *srv = findTypedService(devname, servtp, true); + + if (!srv) { + cerr << "Service " << devname << "/" << servtp << " not found" << endl; + return 1; + } + + map data; + int ret = srv->runAction(actnm, args, data); + if (ret == 0) { + for (auto& entry: data) { + cout << entry.first << "->" << entry.second << endl; + } + } else { + cerr << "runAction failed with code " << ret << endl; + return 1; + } + + MReporter reporter; + srv->installReporter(&reporter); + sleep(1000); + return 0; +} diff --git a/other/libupnppsamples-code/src/upexplo.cpp b/other/libupnppsamples-code/src/upexplo.cpp new file mode 100755 index 000000000..68d088d77 --- /dev/null +++ b/other/libupnppsamples-code/src/upexplo.cpp @@ -0,0 +1,586 @@ +// Exercise a variety of libupnpp features... + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/log.hxx" +#include "libupnpp/upnpputils.hxx" +#include "libupnpp/control/service.hxx" +#include "libupnpp/control/cdirectory.hxx" +#include "libupnpp/control/mediarenderer.hxx" +#include "libupnpp/control/renderingcontrol.hxx" +#include "libupnpp/control/discovery.hxx" + +using namespace UPnPClient; +using namespace UPnPP; +using namespace std; + +static int op_flags; +#define OPT_a 0x1 +#define OPT_c 0x2 +#define OPT_l 0x4 +#define OPT_M 0x8 +#define OPT_m 0x10 +#define OPT_P 0x20 +#define OPT_p 0x40 +#define OPT_r 0x80 +#define OPT_s 0x100 +#define OPT_u 0x200 +#define OPT_V 0x400 +#define OPT_v 0x800 +#define OPT_1 0x1000 +#define OPT_U 0x2000 + +UPnPDeviceDirectory *superdir; + +std::mutex reporterLock; +std::condition_variable evloopcond; + +vector deviceList; +static void clearDevices() { + deviceList.clear(); +} + +static bool findKnownDevice(const string& UDN) +{ + for (const auto& device : deviceList) { + if (device.UDN == UDN) { + return true; + } + } + return false; +} + +static bool +reporter(const UPnPDeviceDesc& device, const UPnPServiceDesc&) +{ + std::unique_lock lock(reporterLock); + //cerr << "reporter: " << device.friendlyName << " s " << + // device.deviceType << endl; + if (!findKnownDevice(device.UDN)) { + deviceList.push_back(device); + evloopcond.notify_all(); + } + return true; +} + +static void showDevice(const UPnPDeviceDesc& device) +{ + const int namewidth(25); + const int typewidth(48); + cout << setw(namewidth) << device.friendlyName << setw(0) << + setw(typewidth) << string(" (") + device.deviceType + ")"; + if (op_flags & OPT_u) { + cout << " " << device.URLBase; + } + if (op_flags & OPT_U) { + cout << " " << device.UDN; + } + cout << endl; +} + +static bool traverser(const UPnPDeviceDesc& device, const UPnPServiceDesc& srv) +{ + if (!findKnownDevice(device.UDN)) { + showDevice(device); + deviceList.push_back(device); + } + return true; +} + +void listDevices() +{ + cout << "UPnP devices:" << endl; + static int cbindex = -1; + if (cbindex == -1) { + cbindex = UPnPDeviceDirectory::addCallback(reporter); + } + if (superdir == 0) { + superdir = UPnPDeviceDirectory::getTheDir(1); + if (superdir == 0) { + cerr << "can't get superdir\n"; + exit(1); + } + } + + // Until the initial delay is through, use the reporter to list + // devices as they come + unsigned int ndevices = 0; + for (;;) { + std::unique_lock lock(reporterLock); +#if FUTURE + int ms = superdir->getRemainingDelayMs(); +#else + int ms = superdir->getRemainingDelay() * 1000; +#endif + if (ms > 0) { + evloopcond.wait_for(lock, std::chrono::milliseconds(ms)); + if (deviceList.size() > ndevices) { + for (unsigned int i = ndevices; i < deviceList.size(); i++) { + showDevice(deviceList[i]); + } + ndevices = deviceList.size(); + } + } else { + if (cbindex >= 0) { + cerr << "Initial delay done. " << deviceList.size() << " devices\n"; + UPnPDeviceDirectory::delCallback(cbindex); + cbindex = -2; + return; + } else { + break; + } + } + } + + + // Called after initial delay done. Unset the callback and + // traverse the directory + clearDevices(); + auto ret = superdir->traverse(traverser); + cerr << "Now having " << deviceList.size() << " devices " << endl; +} + +void listServers() +{ + cout << "Content Directories:" << endl; + vector dirservices; + if (!ContentDirectory::getServices(dirservices)) { + cerr << "listDirServices failed" << endl; + return; + } + for (vector::iterator it = dirservices.begin(); + it != dirservices.end(); it++) { + cout << (*it)->getFriendlyName() << endl; + } + cout << endl; +} + +void listPlayers() +{ + cout << "Media Renderers:" << endl; + vector vdds; + if (!MediaRenderer::getDeviceDescs(vdds)) { + cerr << "MediaRenderer::getDeviceDescs" << endl; + return; + } + for (auto& entry : vdds) { + cout << entry.friendlyName << endl; + } + cout << endl; +} + +class MReporter : public UPnPClient::VarEventReporter { +public: + void changed(const char *nm, int value) + { + cout << "Changed: " << nm << " : " << value << endl; + } + void changed(const char *nm, const char *value) + { + cout << "Changed: " << nm << " : " << value << endl; + } + + void changed(const char *nm, UPnPDirObject meta) + { + string s = meta.dump(); + cout << "Changed: " << nm << " : " << s << endl; + } + +}; + +MRDH getRenderer(const string& name) +{ + if (superdir == 0) { + superdir = UPnPDeviceDirectory::getTheDir(); + } + + UPnPDeviceDesc ddesc; + if (superdir->getDevByUDN(name, ddesc)) { + return MRDH(new MediaRenderer(ddesc)); + } else if (superdir->getDevByFName(name, ddesc)) { + return MRDH(new MediaRenderer(ddesc)); + } + cerr << "getDevByFname failed" << endl; + return MRDH(); +} + +void getsetVolume(const string& friendlyName, int volume = -1) +{ + MRDH rdr = getRenderer(friendlyName); + if (!rdr) { + return; + } + + RDCH rdc = rdr->rdc(); + if (!rdc) { + cerr << "Device has no RenderingControl service" << endl; + return; + } + + if (volume == -1) { + volume = rdc->getVolume(); + cout << "Current volume: " << volume << endl; + return; + } else { + if ((volume = rdc->setVolume(volume)) != 0) { + cerr << "Error setting volume: " << volume << endl; + return; + } + } +} + +void tpMonitor(const string& friendlyName) +{ + MRDH rdr = getRenderer(friendlyName); + if (!rdr) { + return; + } + AVTH avt = rdr->avt(); + if (!avt) { + cerr << "Device has no AVTransport service" << endl; + return; + } + MReporter reporter; + avt->installReporter(&reporter); + + while (true) { + AVTransport::PositionInfo info; + int ret; + if ((ret = avt->getPositionInfo(info))) { + cerr << "getPositionInfo failed. Code " << ret << endl; + } else { + cout << info.trackmeta.m_title << " reltime " << info.reltime + << endl; + } + sleep(2); + } +} + +int tpAlbumArt(const string& fname) +{ + MRDH rdr = getRenderer(fname); + if (!rdr) { + cerr << "Can't connect to renderer " << fname << endl; + return 1; + } + + string uri; + + OHIFH ohinfo = rdr->ohif(); + if (ohinfo) { + UPnPDirObject dirent; + if (ohinfo->metatext(&dirent) == 0) { + uri = dirent.getprop("upnp:albumArtURI"); + } else { + //cerr << "metatext failed\n"; + } + } + + if (uri.empty()) { + AVTH avt = rdr->avt(); + if (avt) { + AVTransport::TransportInfo tinfo; + int ret; + if ((ret = avt->getTransportInfo(tinfo))) { + cerr << "getTransportInfo failed. Code " << ret << endl; + } else if (tinfo.tpstatus == AVTransport::TPS_Ok && + (tinfo.tpstate == AVTransport::Playing || + tinfo.tpstate == AVTransport::PausedPlayback)) { + AVTransport::PositionInfo info; + if ((ret = avt->getPositionInfo(info))) { + cerr << "getPositionInfo failed. Code " << ret << endl; + } else { + uri = info.trackmeta.getprop("upnp:albumArtURI"); + } + } + } + } + + cout << uri << endl; + return 0; +} + +void tpPlayStop(const string& friendlyName, bool doplay) +{ + MRDH rdr = getRenderer(friendlyName); + if (!rdr) { + return; + } + AVTH avt = rdr->avt(); + if (!avt) { + cerr << "Device has no AVTransport service" << endl; + return; + } + int ret; + if (doplay) { + ret = avt->play(); + } else { + ret = avt->stop(); + } + if (ret != 0) { + cerr << "Operation failed: code: " << ret << endl; + } +} + +void tpPause(const string& friendlyName) +{ + MRDH rdr = getRenderer(friendlyName); + if (!rdr) { + return; + } + AVTH avt = rdr->avt(); + if (!avt) { + cerr << "Device has no AVTransport service" << endl; + return; + } + + avt->pause(); +} + +void readdir(const string& friendlyName, const string& cid) +{ + cout << "readdir: [" << friendlyName << "] [" << cid << "]" << endl; + CDSH server; + if (!ContentDirectory::getServerByName(friendlyName, server)) { + cerr << "Server not found" << endl; + return; + } + UPnPDirContent dirbuf; + int code = server->readDir(cid, dirbuf); + if (code) { + cerr << LibUPnP::errAsString("readdir", code) << endl; + return; + } + cout << "Browse: got " << dirbuf.m_containers.size() << + " containers and " << dirbuf.m_items.size() << " items " << endl; + for (unsigned int i = 0; i < dirbuf.m_containers.size(); i++) { + cout << dirbuf.m_containers[i].dump(); + } + for (unsigned int i = 0; i < dirbuf.m_items.size(); i++) { + cout << dirbuf.m_items[i].dump(); + } +} + +void getMetadata(const string& friendlyName, const string& cid) +{ + cout << "getMeta: [" << friendlyName << "] [" << cid << "]" << endl; + CDSH server; + if (!ContentDirectory::getServerByName(friendlyName, server)) { + cerr << "Server not found" << endl; + return; + } + UPnPDirContent dirbuf; + int code = server->getMetadata(cid, dirbuf); + if (code) { + cerr << LibUPnP::errAsString("readdir", code) << endl; + return; + } + cout << "getMeta: got " << dirbuf.m_containers.size() << + " containers and " << dirbuf.m_items.size() << " items " << endl; + for (unsigned int i = 0; i < dirbuf.m_containers.size(); i++) { + cout << dirbuf.m_containers[i].dump(); + } + for (unsigned int i = 0; i < dirbuf.m_items.size(); i++) { + cout << dirbuf.m_items[i].dump(); + } +} + +void search(const string& friendlyName, const string& ss) +{ + cout << "search: [" << friendlyName << "] [" << ss << "]" << endl; + CDSH server; + if (!ContentDirectory::getServerByName(friendlyName, server)) { + cerr << "Server not found" << endl; + return; + } + UPnPDirContent dirbuf; + string cid("0"); + int code = server->search(cid, ss, dirbuf); + if (code) { + cerr << LibUPnP::errAsString("search", code) << endl; + return; + } + cout << "Search: got " << dirbuf.m_containers.size() << + " containers and " << dirbuf.m_items.size() << " items " << endl; + for (unsigned int i = 0; i < dirbuf.m_containers.size(); i++) { + cout << dirbuf.m_containers[i].dump(); + } + for (unsigned int i = 0; i < dirbuf.m_items.size(); i++) { + cout << dirbuf.m_items[i].dump(); + } +} + +void getSearchCaps(const string& friendlyName) +{ + cout << "getSearchCaps: [" << friendlyName << "]" << endl; + CDSH server; + if (!ContentDirectory::getServerByName(friendlyName, server)) { + cerr << "Server not found" << endl; + return; + } + set capa; + int code = server->getSearchCapabilities(capa); + if (code) { + cerr << LibUPnP::errAsString("readdir", code) << endl; + return; + } + if (capa.empty()) { + cout << "No search capabilities"; + } else { + for (set::const_iterator it = capa.begin(); + it != capa.end(); it++) { + cout << "[" << *it << "]"; + } + } + cout << endl; +} + + + +static char *thisprog; +static char usage [] = + " -l : list devices\n" + " -1 : loop only once (initial discovery)\n" + " [-u] Add url to device lines\n" + " -r list object id (root is '0')\n" + " -s search for string\n" + " -m : list object metadata\n" + " -c get search capabilities\n" + " -M : monitor AVTransport\n" + " -v get volume\n" + " -V set volume\n" + " -p 1|0 play/stop\n" + " -P pause\n" + " --album-art print album art uri for playing track\n" + "\n params can be either \"friendly names\", or UDNs\n" + " params must be \"friendly names\"\n" + " \n" + ; +static void +Usage(void) +{ + fprintf(stderr, "%s: usage:\n%s", thisprog, usage); + exit(1); +} + +static struct option long_options[] = { + {"album-art", 0, 0, 'a'}, + {0, 0, 0, 0} +}; + +int main(int argc, char *argv[]) +{ + string fname; + string arg; + + thisprog = argv[0]; + + int ret; + int option_index = 0; + while ((ret = getopt_long(argc, argv, "1MPSVclmprsUuvx", + long_options, &option_index)) != -1) { + switch (ret) { + case '1': op_flags |= OPT_1; break; + case 'a': if (op_flags) Usage(); op_flags |= OPT_a; break; + case 'M': if (op_flags) Usage(); op_flags |= OPT_M; break; + case 'P': if (op_flags) Usage(); op_flags |= OPT_P; break; + case 'V': if (op_flags) Usage(); op_flags |= OPT_V; break; + case 'c': if (op_flags) Usage(); op_flags |= OPT_c; break; + case 'l': if (op_flags) Usage(); op_flags |= OPT_l; break; + case 'm': if (op_flags) Usage(); op_flags |= OPT_m; break; + case 'p': if (op_flags) Usage(); op_flags |= OPT_p; break; + case 'r': if (op_flags) Usage(); op_flags |= OPT_r; break; + case 's': if (op_flags) Usage(); op_flags |= OPT_s; break; + case 'u': op_flags |= OPT_u; break; + case 'U': op_flags |= OPT_U; break; + case 'v': if (op_flags) Usage(); op_flags |= OPT_v; break; + + default: + Usage(); + } + } + + if (op_flags & (OPT_l)) { + if (optind < argc) + Usage(); + } + + if (op_flags & (OPT_c | OPT_v | OPT_P | OPT_M | OPT_a)) { + if (optind != argc - 1) + Usage(); + fname = argv[optind++]; + } + if (op_flags & (OPT_r | OPT_s | OPT_m | OPT_V | OPT_p)) { + cerr << "optind " << optind << " argc " << argc << endl; + if (optind != argc - 2) + Usage(); + fname = argv[optind++]; + arg = argv[optind++]; + } + + if (Logger::getTheLog("/tmp/upexplo.log") == 0) { + cerr << "Can't initialize log" << endl; + //return 1; + } + Logger::getTheLog("")->setLogLevel(Logger::LLDEB1); + + string hwa; + LibUPnP *mylib = LibUPnP::getLibUPnP(false, &hwa); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + //cerr << "hwaddr " << hwa << endl; + + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } +// mylib->setLogFileName("/tmp/libupnp.log", LibUPnP::LogLevelDebug); + + if ((op_flags & OPT_l)) { + while (true) { + listDevices(); + if (op_flags & OPT_1) { + break; + } + sleep(5); + } + } else if ((op_flags & OPT_m)) { + getMetadata(fname, arg); + } else if ((op_flags & OPT_r)) { + readdir(fname, arg); + } else if ((op_flags & OPT_s)) { + search(fname, arg); + } else if ((op_flags & OPT_c)) { + getSearchCaps(fname); + } else if ((op_flags & OPT_V)) { + int volume = atoi(arg.c_str()); + getsetVolume(fname, volume); + } else if ((op_flags & OPT_v)) { + getsetVolume(fname); + } else if ((op_flags & OPT_M)) { + tpMonitor(fname); + } else if ((op_flags & OPT_p)) { + int iarg = atoi(arg.c_str()); + tpPlayStop(fname, iarg); + } else if ((op_flags & OPT_P)) { + tpPause(fname); + } else if ((op_flags & OPT_a)) { + return tpAlbumArt(fname); + } else { + Usage(); + } + + return 0; +} diff --git a/other/libupnppsamples-code/src/uplistdir.cpp b/other/libupnppsamples-code/src/uplistdir.cpp new file mode 100755 index 000000000..1ef1aa0c8 --- /dev/null +++ b/other/libupnppsamples-code/src/uplistdir.cpp @@ -0,0 +1,59 @@ +// This libupnpp sample program lists all devices and services found +// on the local network + +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/log.hxx" +#include "libupnpp/control/description.hxx" +#include "libupnpp/control/discovery.hxx" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +static bool traverser(const UPnPDeviceDesc& device, const UPnPServiceDesc& srv) +{ + cout << device.friendlyName <<" ("<< device.deviceType << ") " << + srv.serviceType << endl; + return true; +} + +int main(int argc, char *argv[]) +{ + // Initialize libupnpp logging + Logger::getTheLog("")->setLogLevel(Logger::LLERR); + + // Get a handle to the main lib object. You don't really need to + // do this actually. We just do it to check that the lib + // initialized ok, but there are other possible uses, see the doc + // in the include file. + LibUPnP *mylib = LibUPnP::getLibUPnP(); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + + // Get a handle to the device directory. You can call this + // multiple times, only the first call does something, any further + // call will just return the pointer to the singleton. + UPnPDeviceDirectory *superdir = UPnPDeviceDirectory::getTheDir(); + if (superdir == 0) { + cerr << "Cant access device directory\n"; + return 1; + } + + // Call the directory traversal. This will wait for the initial + // time window. It's possible to see the devices as they appear + // instead by using UPnPDeviceDirectory::addCallback(). See for + // example rdcvolume.cpp + superdir->traverse(traverser); + + return 0; +} diff --git a/other/libupnppsamples-code/upsend_src/streamer.cpp b/other/libupnppsamples-code/upsend_src/streamer.cpp new file mode 100755 index 000000000..a0f24c8cb --- /dev/null +++ b/other/libupnppsamples-code/upsend_src/streamer.cpp @@ -0,0 +1,257 @@ +/* Copyright (C) 2014 J.F.Dockes + * 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. + */ +#include "config.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "streamer.h" +#include "libupnpp/log.h" + +using namespace std; + +#ifndef MIN +#define MIN(A,B) ((A)<(B)?(A):(B)) +#endif + +// #define PRINT_KEYS + +// Only accept HTTP connections from localhost: no +#define ACCEPT_LOCALONLY 0 + +// The queue for audio blocks coming our way +static queue dataqueue; +static std::mutex dataqueueLock; +static std::condition_variable dataqueueWaitCond; + +#ifdef PRINT_KEYS +static const char *ValueKindToCp(enum MHD_ValueKind kind) +{ + switch (kind) { + case MHD_RESPONSE_HEADER_KIND: return "Response header"; + case MHD_HEADER_KIND: return "HTTP header"; + case MHD_COOKIE_KIND: return "Cookies"; + case MHD_POSTDATA_KIND: return "POST data"; + case MHD_GET_ARGUMENT_KIND: return "GET (URI) arguments"; + case MHD_FOOTER_KIND: return "HTTP footer"; + default: return "Unknown"; + } +} + +static int print_out_key (void *cls, enum MHD_ValueKind kind, + const char *key, const char *value) +{ + LOGDEB(ValueKindToCp(kind) << ": " << key << " -> " << value << endl); + return MHD_YES; +} +#endif /* PRINT_KEYS */ + +struct DataGenContext { + DataGenContext() : + eof(false) { + } + bool eof; +}; + +// This gets called by microhttpd when it needs data. +static ssize_t +data_generator(void *cls, uint64_t pos, char *buf, size_t max) +{ + LOGDEB1("data_generator: " << " max " << max << endl); + DataGenContext *dgc = (DataGenContext *)cls; + std::unique_lock lock(dataqueueLock); + if (dgc->eof) { + LOGDEB1("data_generator: already eof\n"); + return -1; + } + + // Loop reading on the input queue until we have satistified the request + size_t bytes = 0; + while (bytes < max) { + while (dataqueue.empty()) { + LOGDEB1("data_generator: waiting for buffer" << endl); + dataqueueWaitCond.wait(lock); + } + + AudioMessage *m = dataqueue.front(); + if (m->m_bytes == 0) { + // EOF + LOGDEB1("data_generator: empty buffer\n"); + dgc->eof = true; + // Do not notify or clear the queue: freeCallback will do it. + break; + } + LOGDEB1("data_generator: data buffer\n"); + + size_t newbytes = MIN(max - bytes, m->m_bytes - m->m_curoffs); + memcpy(buf + bytes, m->m_buf + m->m_curoffs, newbytes); + m->m_curoffs += newbytes; + bytes += newbytes; + if (m->m_curoffs == m->m_bytes) { + delete dataqueue.front(); + dataqueue.pop(); + dataqueueWaitCond.notify_all(); + } + } + + LOGDEB1("data_generator: returning " << bytes << " bytes" << endl); + return bytes; +} + +static void ContentReaderFreeCallback(void *cls) +{ + LOGDEB1("ContentReaderFreeCallback\n"); + DataGenContext *dgc = (DataGenContext*)cls; + std::unique_lock lock(dataqueueLock); + while (!dataqueue.empty()) { + delete dataqueue.front(); + dataqueue.pop(); + } + delete dgc; + dataqueueWaitCond.notify_all(); +} + +static int answer_to_connection(void *cls, struct MHD_Connection *connection, + const char *url, + const char *method, const char *version, + const char *upload_data, + size_t *upload_data_size, void **con_cls) +{ + AudioSink::Context *ctxt = (AudioSink::Context *)cls; + +#ifdef PRINT_KEYS + MHD_get_connection_values(connection, MHD_HEADER_KIND, &print_out_key, 0); +#endif + + static int aptr; + if (&aptr != *con_cls) { + /* do not respond on first call ?*/ + *con_cls = &aptr; + return MHD_YES; + } + + LOGDEB("answer_to_connection: url " << url << " method " << method << + " version " << version << endl); + + long long size = MHD_SIZE_UNKNOWN; + DataGenContext *dgc = new DataGenContext(); + + // the block size seems to be flatly ignored by libmicrohttpd + // Any random value would probably work the same + struct MHD_Response *response = + MHD_create_response_from_callback(size, 4096, &data_generator, + dgc, ContentReaderFreeCallback); + if (response == NULL) { + LOGERR("httpgate: answer: could not create response" << endl); + return MHD_NO; + } + + MHD_add_response_header(response, "Content-Type", + ctxt->content_type.c_str()); + +// #define FORCE_CHUNKED +#if defined(FORCE_CHUNKED) +#warning content-length is needed for mpd to play wav (else tries to seek). + MHD_add_response_header(response, "Transfer-Encoding", "chunked"); +#else + char cl[100]; + sprintf(cl, "%lld", (long long)ctxt->filesize); + MHD_add_response_header(response, "Content-Length", cl); +#endif + + int ret = MHD_queue_response(connection, MHD_HTTP_OK, response); + MHD_destroy_response(response); + return ret; +} + +static void *audioEater(AudioSink::Context *ctxt) +{ + LOGDEB1("audioEater\n"); + string value; + int port = 8869; + auto it = ctxt->config.find("httpport"); + if (it != ctxt->config.end()) { + port = atoi(it->second.c_str()); + } + + WorkQueue *queue = ctxt->queue; + + LOGDEB1("audioEater: queue " << ctxt->queue << " HTTP port " << port + << endl); + + struct MHD_Daemon *daemon = + MHD_start_daemon( + MHD_USE_SELECT_INTERNALLY, + port, + /* Accept policy callback and arg */ + NULL, NULL, + /* handler and arg */ + &answer_to_connection, ctxt, + MHD_OPTION_END); + + if (NULL == daemon) { + queue->workerExit(); + delete ctxt; + return (void *)0; + } + + bool eof = false; + while (true) { + AudioMessage *tsk = nullptr; + size_t qsz; + if (!queue->take(&tsk, &qsz)) { + tsk = nullptr; + eof = true; + } + std::unique_lock lock(dataqueueLock); + if (eof) { + LOGDEB1("audioEater: pushing empty buffer\n"); + dataqueue.push(new AudioMessage(nullptr, 0, 0)); + dataqueueWaitCond.notify_all(); + } + + /* limit size of queuing / wait for drain. */ + while (dataqueue.size() > (eof ? 0 : 2)) { + if (eof) { + LOGDEB1("audioEater: waiting for queue drain, sz " << + dataqueue.size() << endl); + } + dataqueueWaitCond.wait(lock); + } + if (eof) + break; + dataqueue.push(tsk); + dataqueueWaitCond.notify_all(); + } + LOGDEB0("audioEater: returning\n"); + MHD_stop_daemon(daemon); + queue->workerExit(); + delete ctxt; + return (void*)1; +} + +AudioSink httpAudioSink(&audioEater); diff --git a/other/libupnppsamples-code/upsend_src/streamer.h b/other/libupnppsamples-code/upsend_src/streamer.h new file mode 100755 index 000000000..445e005e2 --- /dev/null +++ b/other/libupnppsamples-code/upsend_src/streamer.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2016 J.F.Dockes + * 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. + */ +#ifndef _STREAMER_H_INCLUDED_ +#define _STREAMER_H_INCLUDED_ + +#include "workqueue.h" + +#include + +// The audio messages which get passed between the reader and the http +// server part. +class AudioMessage { +public: + // buf is is a malloced buffer, and we take ownership. The caller + // MUST NOT free it. Bytes is data count, allocbytes is the buffer size. + AudioMessage(char *buf, size_t bytes, size_t allocbytes) + : m_bytes(bytes), m_allocbytes(allocbytes), m_buf(buf), m_curoffs(0) { + } + + ~AudioMessage() { + if (m_buf) + free(m_buf); + } + unsigned int m_bytes; // Useful bytes + unsigned int m_allocbytes; // buffer size + char *m_buf; + unsigned int m_curoffs; /* Used by the http data emitter */ +}; + +class AudioSink { +public: + struct Context { + Context(WorkQueue *q) + : queue(q), config(0), filesize(0) { + } + WorkQueue *queue; + std::unordered_map config; + std::string filename; + std::string content_type; + std::string ext; + off_t filesize; + }; + + AudioSink(void *(*w)(Context *)) + : worker(w) { + } + + /** Worker routine for fetching bufs from the rcvqueue and sending them + * further. The param is actually an AudioSink::Context */ + void *(*worker)(Context *); +}; + +extern AudioSink httpAudioSink; + +#endif /* _STREAMER_H_INCLUDED_ */ diff --git a/other/libupnppsamples-code/upsend_src/upsend.cpp b/other/libupnppsamples-code/upsend_src/upsend.cpp new file mode 100755 index 000000000..421ac1b77 --- /dev/null +++ b/other/libupnppsamples-code/upsend_src/upsend.cpp @@ -0,0 +1,323 @@ +/* Copyright (C) 2013 J.F.Dockes + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "libupnpp/upnpplib.hxx" +#include "libupnpp/log.hxx" +#include "libupnpp/soaphelp.hxx" +#include "libupnpp/upnpputils.hxx" +#include "libupnpp/control/mediarenderer.hxx" +#include "libupnpp/control/avtransport.hxx" +#include "libupnpp/control/discovery.hxx" + +#include "streamer.h" +#include "wav.h" + +using namespace std; +using namespace UPnPClient; +using namespace UPnPP; + +WorkQueue audioqueue("audioqueue", 4); + +// @param name can be uuid or friendly name, we try both. The chance that a +// device would have a uuid which would be the friendly name of +// another is small... +MRDH getRenderer(const string& name) +{ + static UPnPDeviceDirectory *superdir; + if (superdir == 0) { + superdir = UPnPDeviceDirectory::getTheDir(); + if (superdir == 0) { + cerr << "Discovery init failed\n"; + return MRDH(); + } + } + + UPnPDeviceDesc ddesc; + if (superdir->getDevByFName(name, ddesc)) { + return MRDH(new MediaRenderer(ddesc)); + } else if (superdir->getDevByUDN(name, ddesc)) { + return MRDH(new MediaRenderer(ddesc)); + } + cerr << "Can't connect to " << name << endl; + return MRDH(); +} + +static string path_suffix(const string& s) +{ + string::size_type dotp = s.rfind('.'); + if (dotp == string::npos) { + return string(); + } + return s.substr(dotp + 1); +} + +static bool whatfile(const string& audiofile, AudioSink::Context *ctxt) +{ + if (access(audiofile.c_str(), R_OK) != 0) { + cerr << "No read access " << audiofile << " errno " << errno << endl; + return false; + } + struct stat st; + if (stat(audiofile.c_str(), &st)) { + cerr << "Can't stat " << audiofile << " errno " << errno << endl; + return false; + } + + string ext = path_suffix(audiofile); + ctxt->filename = audiofile; + ctxt->filesize = st.st_size; + ctxt->ext = ext; + const char* cext = ext.c_str(); + if (!strcasecmp("flac", cext)) { + ctxt->content_type = "audio/flac"; + } else if (!strcasecmp("mp3", cext)) { + ctxt->content_type = "audio/mpeg"; + } else if (!strcasecmp("wav", cext)) { + ctxt->content_type = "audio/wav"; + } else { + cerr << "Unknown extension " << ext << endl; + return false; + } + return true; +} + +void *readworker(void *a) +{ + AudioSink::Context *ctxt = (AudioSink::Context *)a; + + int fd = 0; + if (ctxt->filename.compare("stdin")) { + if ((fd = open(ctxt->filename.c_str(), O_RDONLY)) < 0) { + cerr << "readWorker: can't open " << ctxt->filename << + " for reading, errno " << errno << endl; + exit(1); + } + } + + for (;;) { + unsigned int allocbytes = 4096; + char *buf = (char *)malloc(allocbytes); + if (buf == 0) { + cerr << "readWorker: can't allocate " << allocbytes << " bytes\n"; + exit(1); + } + ssize_t readbytes = read(fd, buf, allocbytes); + //cerr << "readworker: got " << readbytes << "bytes\n"; + if (readbytes < 0) { + cerr << "readWorker: read error on " << ctxt->filename << + " errno " << errno << endl; + exit(1); + } else if (readbytes == 0) { + audioqueue.waitIdle(); + audioqueue.setTerminateAndWait(); + return nullptr; + } + AudioMessage *ap = new AudioMessage(buf, readbytes, allocbytes); + if (!audioqueue.put(ap, false)) { + cerr << "readWorker: queue dead: exiting\n"; + exit(1); + } + } +} + +string didlmake(const string& uri, const string& mime) +{ + ostringstream ss; + ss << "" + "" + << ""; + + ss << "" << SoapHelp::xmlQuote("Streaming") << ""; + ss << "object.item.audioItem.musicTrack"; + +#warning "problem with resource values!" + ss << "" + << SoapHelp::xmlQuote(uri) + << "" + << ""; + return ss.str(); +} + +static char *thisprog; +static char usage [] = +" : play audio on given renderer\n" + ; +static void Usage(void) +{ + fprintf(stderr, "%s: usage:\n%s", thisprog, usage); + exit(1); +} +static int op_flags; +#define OPT_h 0x1 +#define OPT_p 0x2 +static struct option long_options[] = { + {"host", required_argument, 0, 'h'}, + {"port", required_argument, 0, 'p'}, + {0, 0, 0, 0} +}; + + +int main(int argc, char *argv[]) +{ + thisprog = argv[0]; + string host = "localhost"; + int port = 8869; + + int option_index = 0; + int ret; + while ((ret = getopt_long(argc, argv, "h:p:", + long_options, &option_index)) != -1) { + cerr << "ret is " << ret << endl; + switch (ret) { + case 'h': op_flags |= OPT_h; host = optarg; break; + case 'p': op_flags |= OPT_h; port = atoi(optarg); break; + default: Usage(); + } + } + + if (optind != argc - 2) + Usage(); + string audiofile = argv[optind++]; + string renderer = argv[optind++]; + + if (Logger::getTheLog("stderr") == 0) { + cerr << "Can't initialize log" << endl; + return 1; + } + Logger::getTheLog("")->setLogLevel(Logger::LLDEB1); + + string hwa; + LibUPnP *mylib = LibUPnP::getLibUPnP(false, &hwa); + if (!mylib) { + cerr << "Can't get LibUPnP" << endl; + return 1; + } + + if (!(op_flags & OPT_h)) { +#if FUTURE + host = mylib->host(); + if (host.empty()) { + cerr << "Can't retrieve IP address\n"; + return 1; + } +#else + char hostname[1024]; + if (gethostname(hostname, 1024)) { + perror("gethostname failed. use -h:"); + return 1; + } + host = hostname; +#endif + } + if (!mylib->ok()) { + cerr << "Lib init failed: " << + mylib->errAsString("main", mylib->getInitError()) << endl; + return 1; + } + //mylib->setLogFileName("/tmp/libupnp.log", LibUPnP::LogLevelDebug); + + MRDH rdr = getRenderer(renderer); + if (!rdr) { + cerr << "Can't connect to renderer\n"; + return 1; + } + AVTH avth = rdr->avt(); + if (!avth) { + cerr << "Device has no AVTransport service" << endl; + return 1; + } + + + // Identify file + AudioSink::Context *ctxt = new AudioSink::Context(&audioqueue); + bool makewav = false; + if (!audiofile.compare("stdin")) { + ctxt->filename = audiofile; + ctxt->ext = "wav"; + ctxt->content_type = "audio/wav"; + makewav = true; + } else { + if (!whatfile(audiofile, ctxt)) { + cerr << "Can't identify file " << audiofile << endl; + return 1; + } + } + + unordered_map c{{"httpport", SoapHelp::i2s(port)}, + {"httphost", host}}; + ctxt->config = c; + + // Start the http thread + audioqueue.start(1, (void *(*)(void *))(httpAudioSink.worker), ctxt); + + if (makewav) { + unsigned int allocbytes = 512; + char *buf = (char *)malloc(allocbytes); + if (buf == 0) { + cerr << "Can't allocate " << allocbytes << " bytes\n"; + exit(1); + } + int freq = 44100; + int bits = 16; + int chans = 2; + int databytes = 2 * 1000 * 1000 * 1000; + // Using buf+bytes in case we ever insert icy before the audio + int sz = makewavheader(buf, allocbytes, freq, bits, chans, databytes); + AudioMessage *ap = new AudioMessage(buf, sz, allocbytes); + audioqueue.put(ap, false); + } + + // Start the reading thread + std::thread readthread(readworker, ctxt); + + string uri("http://" + host + ":" + SoapHelp::i2s(port) + "/stream." + + ctxt->ext); + + // We'd need a few options here to decide what to do if already playing: + // wait (would allow to queue multiple songs), or interrupt. + + // Start the renderer + if (avth->setAVTransportURI(uri, didlmake(uri, ctxt->content_type)) != 0) { + cerr << "setAVTransportURI failed\n"; + return 1; + } + + if (avth->play() != 0) { + cerr << "play failed\n"; + return 1; + } + readthread.join(); + return 0; +} diff --git a/other/libupnppsamples-code/upsend_src/wav.cpp b/other/libupnppsamples-code/upsend_src/wav.cpp new file mode 100755 index 000000000..d31e535af --- /dev/null +++ b/other/libupnppsamples-code/upsend_src/wav.cpp @@ -0,0 +1,106 @@ +/* Copyright (C) 2014 J.F.Dockes + * 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. + */ + +#include "config.h" + +#include + +#include "wav.h" + +inline int inttoichar4(unsigned char *cdb, unsigned int addr) +{ + cdb[3] = (addr & 0xff000000) >> 24; + cdb[2] = (addr & 0x00ff0000) >> 16; + cdb[1] = (addr & 0x0000ff00) >> 8; + cdb[0] = addr & 0x000000ff; + return 4; +} + +inline int inttoichar2(unsigned char *cdb, unsigned int cnt) +{ + cdb[1] = (cnt & 0x0000ff00) >> 8; + cdb[0] = cnt & 0x000000ff; + return 2; +} + + +#if 0 +// For reference: definition of a wav header +// commented values are given for 44100/16/2 +struct wav_header { + /*0 */char riff[4]; /* = 'RIFF' */ + /*4 */int32 rifflen; /* longueur des infos qui suivent= datalen+36 */ + /*8 */char wave[4]; /* = 'WAVE' */ + + /*12*/char fmt[4]; /* = 'fmt ' */ + /*16*/int32 fmtlen; /* = 16 */ + /*20*/int16 formtag; /* = 1 : PCM */ + /*22*/int16 nchan; /* = 2 : nombre de canaux */ + /*24*/int32 sampspersec; /* = 44100 : Nbr d'echantillons par seconde */ + /*28*/int32 avgbytpersec;/* = 176400 : Nbr moyen octets par seconde */ + /*32*/int16 blockalign; /* = 4 : nombre d'octets par echantillon */ + /*34*/int16 bitspersamp; /* = 16 : bits par echantillon */ + + /*36*/char data[4]; /* = 'data' */ + /*40*/int32 datalen; /* Nombre d'octets de son qui suivent */ + /*44*/char data[]; +}; +#endif /* if 0 */ + +#define WAVHSIZE 44 +#define RIFFTOWAVCNT 36 + +// Format header. Note the use of intel format integers. Input buffer must +// be of size >= 44 +int makewavheader(char *buf, int maxsize, int freq, int bits, + int chans, unsigned int databytecnt) +{ + if (maxsize < WAVHSIZE) + return -1; + + unsigned char *cp = (unsigned char *)buf; + memcpy(cp, "RIFF", 4); + cp += 4; + inttoichar4(cp, databytecnt + RIFFTOWAVCNT); + cp += 4; + memcpy(cp, "WAVE", 4); + cp += 4; + + memcpy(cp, "fmt ", 4); + cp += 4; + inttoichar4(cp, 16); + cp += 4; + inttoichar2(cp, 1); + cp += 2; + inttoichar2(cp, chans); + cp += 2; + inttoichar4(cp, freq); + cp += 4; + inttoichar4(cp, freq * chans * (bits / 8)); + cp += 4; + inttoichar2(cp, chans * bits / 8); + cp += 2; + inttoichar2(cp, bits); + cp += 2; + + memcpy(cp, "data", 4); + cp += 4; + inttoichar4(cp, databytecnt); + cp += 4; + + return WAVHSIZE; +} diff --git a/other/libupnppsamples-code/upsend_src/wav.h b/other/libupnppsamples-code/upsend_src/wav.h new file mode 100755 index 000000000..1be723639 --- /dev/null +++ b/other/libupnppsamples-code/upsend_src/wav.h @@ -0,0 +1,23 @@ +/* Copyright (C) 2014 J.F.Dockes + * 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. + */ +#ifndef _WAV_H_INCLUDED_ +#define _WAV_H_INCLUDED_ + +extern int makewavheader(char *buf, int maxsize, int freq, int bits, + int chans, unsigned int databytecnt); + +#endif /* _WAV_H_INCLUDED_ */ diff --git a/other/libupnppsamples-code/upsend_src/workqueue.h b/other/libupnppsamples-code/upsend_src/workqueue.h new file mode 100755 index 000000000..216876acb --- /dev/null +++ b/other/libupnppsamples-code/upsend_src/workqueue.h @@ -0,0 +1,357 @@ +/* Copyright (C) 2006-2016 J.F.Dockes + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ +#ifndef _WORKQUEUE_H_INCLUDED_ +#define _WORKQUEUE_H_INCLUDED_ + +#include +#if HAVE_STD_FUTURE +#include +#endif +#include +#include +#include +#include +#include + +#include "log.h" + +/** + * A WorkQueue manages the synchronisation around a queue of work items, + * where a number of client threads queue tasks and a number of worker + * threads take and execute them. The goal is to introduce some level + * of parallelism between the successive steps of a previously single + * threaded pipeline. For example data extraction / data preparation / index + * update, but this could have other uses. + * + * There is no individual task status return. In case of fatal error, + * the client or worker sets an end condition on the queue. A second + * queue could conceivably be used for returning individual task + * status. + * + * The strange thread functions argument and return values + * comes from compatibility with an earlier pthread-based + * implementation. + */ +template class WorkQueue { +public: + + /** Create a WorkQueue + * @param name for message printing + * @param hi number of tasks on queue before clients blocks. Default 0 + * meaning no limit. hi == -1 means that the queue is disabled. + * @param lo minimum count of tasks before worker starts. Default 1. + */ + WorkQueue(const std::string& name, size_t hi = 0, size_t lo = 1) + : m_name(name), m_high(hi), m_low(lo), m_workers_exited(0), + m_ok(true), m_clients_waiting(0), m_workers_waiting(0), + m_tottasks(0), m_nowake(0), m_workersleeps(0), m_clientsleeps(0) { + } + + ~WorkQueue() { + if (!m_worker_threads.empty()) { + setTerminateAndWait(); + } + } + + /** Start the worker threads. + * + * @param nworkers number of threads copies to start. + * @param start_routine thread function. It should loop + * taking (QueueWorker::take()) and executing tasks. + * @param arg initial parameter to thread function. + * @return true if ok. + */ + bool start(int nworkers, void *(workproc)(void *), void *arg) { + std::unique_lock lock(m_mutex); + for (int i = 0; i < nworkers; i++) { + Worker w; +#if HAVE_STD_FUTURE + std::packaged_task task(workproc); + w.res = task.get_future(); + w.thr = std::thread(std::move(task), arg); +#else + w.thr = std::thread(workproc, arg); +#endif + m_worker_threads.push_back(std::move(w)); + } + return true; + } + + /** Add item to work queue, called from client. + * + * Sleeps if there are already too many. + */ + bool put(T t, bool flushprevious = false) { + std::unique_lock lock(m_mutex); + if (!ok()) { + LOGERR("WorkQueue::put:" << m_name << ": !ok\n"); + return false; + } + + while (ok() && m_high > 0 && m_queue.size() >= m_high) { + m_clientsleeps++; + // Keep the order: we test ok() AFTER the sleep... + m_clients_waiting++; + m_ccond.wait(lock); + if (!ok()) { + m_clients_waiting--; + return false; + } + m_clients_waiting--; + } + if (flushprevious) { + while (!m_queue.empty()) { + m_queue.pop(); + } + } + + m_queue.push(t); + if (m_workers_waiting > 0) { + // Just wake one worker, there is only one new task. + m_wcond.notify_one(); + } else { + m_nowake++; + } + + return true; + } + + /** Wait until the queue is inactive. Called from client. + * + * Waits until the task queue is empty and the workers are all + * back sleeping. Used by the client to wait for all current work + * to be completed, when it needs to perform work that couldn't be + * done in parallel with the worker's tasks, or before shutting + * down. Work can be resumed after calling this. Note that the + * only thread which can call it safely is the client just above + * (which can control the task flow), else there could be + * tasks in the intermediate queues. + * To rephrase: there is no warranty on return that the queue is actually + * idle EXCEPT if the caller knows that no jobs are still being created. + * It would be possible to transform this into a safe call if some kind + * of suspend condition was set on the queue by waitIdle(), to be reset by + * some kind of "resume" call. Not currently the case. + */ + bool waitIdle() { + std::unique_lock lock(m_mutex); + if (!ok()) { + LOGERR("WorkQueue::waitIdle:" << m_name << ": not ok\n"); + return false; + } + + // We're done when the queue is empty AND all workers are back + // waiting for a task. + while (ok() && (m_queue.size() > 0 || + m_workers_waiting != m_worker_threads.size())) { + m_clients_waiting++; + m_ccond.wait(lock); + m_clients_waiting--; + } + + return ok(); + } + + /** Tell the workers to exit, and wait for them. + * + * Does not bother about tasks possibly remaining on the queue, so + * should be called after waitIdle() for an orderly shutdown. + */ + void *setTerminateAndWait() { + std::unique_lock lock(m_mutex); + LOGDEB("setTerminateAndWait:" << m_name << "\n"); + + if (m_worker_threads.empty()) { + // Already called ? + return (void*)0; + } + + // Wait for all worker threads to have called workerExit() + m_ok = false; + while (m_workers_exited < m_worker_threads.size()) { + m_wcond.notify_all(); + m_clients_waiting++; + m_ccond.wait(lock); + m_clients_waiting--; + } + + LOGINFO("" << m_name << ": tasks " << m_tottasks << " nowakes " << + m_nowake << " wsleeps " << m_workersleeps << " csleeps " << + m_clientsleeps << "\n"); + // Perform the thread joins and compute overall status + // Workers return (void*)1 if ok + void *statusall = (void*)1; + while (!m_worker_threads.empty()) { +#if HAVE_STD_FUTURE + void *status = m_worker_threads.front().res.get(); +#else + void *status = (void*) 1; +#endif + m_worker_threads.front().thr.join(); + if (status == (void *)0) { + statusall = status; + } + m_worker_threads.pop_front(); + } + + // Reset to start state. + m_workers_exited = m_clients_waiting = m_workers_waiting = + m_tottasks = m_nowake = m_workersleeps = m_clientsleeps = 0; + m_ok = true; + + LOGDEB("setTerminateAndWait:" << m_name << " done\n"); + return statusall; + } + + /** Take task from queue. Called from worker. + * + * Sleeps if there are not enough. Signal if we go to sleep on empty + * queue: client may be waiting for our going idle. + */ + bool take(T* tp, size_t *szp = 0) { + std::unique_lock lock(m_mutex); + if (!ok()) { + LOGDEB("WorkQueue::take:" << m_name << ": not ok\n"); + return false; + } + + while (ok() && m_queue.size() < m_low) { + m_workersleeps++; + m_workers_waiting++; + if (m_queue.empty()) { + m_ccond.notify_all(); + } + m_wcond.wait(lock); + if (!ok()) { + // !ok is a normal condition when shutting down + m_workers_waiting--; + return false; + } + m_workers_waiting--; + } + + m_tottasks++; + *tp = m_queue.front(); + if (szp) { + *szp = m_queue.size(); + } + m_queue.pop(); + if (m_clients_waiting > 0) { + // No reason to wake up more than one client thread + m_ccond.notify_one(); + } else { + m_nowake++; + } + return true; + } + + bool waitminsz(size_t sz) { + std::unique_lock lock(m_mutex); + if (!ok()) { + return false; + } + + while (ok() && m_queue.size() < sz) { + m_workersleeps++; + m_workers_waiting++; + if (m_queue.empty()) { + m_ccond.notify_all(); + } + m_wcond.wait(lock); + if (!ok()) { + m_workers_waiting--; + return false; + } + m_workers_waiting--; + } + return true; + } + + /** Advertise exit and abort queue. Called from worker + * + * This would happen after an unrecoverable error, or when + * the queue is terminated by the client. Workers never exit normally, + * except when the queue is shut down (at which point m_ok is set to + * false by the shutdown code anyway). The thread must return/exit + * immediately after calling this. + */ + void workerExit() { + LOGDEB("workerExit:" << m_name << "\n"); + std::unique_lock lock(m_mutex); + m_workers_exited++; + m_ok = false; + m_ccond.notify_all(); + } + + size_t qsize() { + std::unique_lock lock(m_mutex); + return m_queue.size(); + } + +private: + bool ok() { + bool isok = m_ok && m_workers_exited == 0 && !m_worker_threads.empty(); + if (!isok) { + LOGDEB("WorkQueue:ok:" << m_name << ": not ok m_ok " << m_ok << + " m_workers_exited " << m_workers_exited << + " m_worker_threads size " << m_worker_threads.size() << + "\n"); + } + return isok; + } + + struct Worker { + std::thread thr; +#if HAVE_STD_FUTURE + std::future res; +#endif + }; + + // Configuration + std::string m_name; + size_t m_high; + size_t m_low; + + // Worker threads having called exit. Used to decide when we're done + unsigned int m_workers_exited; + // Status + bool m_ok; + + // Our threads. + std::list m_worker_threads; + + // Jobs input queue + std::queue m_queue; + + // Synchronization + std::condition_variable m_ccond; + std::condition_variable m_wcond; + std::mutex m_mutex; + + // Client/Worker threads currently waiting for a job + unsigned int m_clients_waiting; + unsigned int m_workers_waiting; + + // Statistics + unsigned int m_tottasks; + unsigned int m_nowake; + unsigned int m_workersleeps; + unsigned int m_clientsleeps; +}; + +#endif /* _WORKQUEUE_H_INCLUDED_ */ + diff --git a/other/mpd/mpd-0.20.12 b/other/mpd/mpd-0.20.12 deleted file mode 100755 index bb0a3fed3..000000000 Binary files a/other/mpd/mpd-0.20.12 and /dev/null differ diff --git a/other/mpd/mpd-0.20.12.tar.xz b/other/mpd/mpd-0.20.12.tar.xz deleted file mode 100755 index bedd400b7..000000000 Binary files a/other/mpd/mpd-0.20.12.tar.xz and /dev/null differ diff --git a/other/mpd/mpd-0.20.18 b/other/mpd/mpd-0.20.18 new file mode 100755 index 000000000..37dcc28f3 Binary files /dev/null and b/other/mpd/mpd-0.20.18 differ diff --git a/other/mpd/mpd-0.20.18.tar.xz b/other/mpd/mpd-0.20.18.tar.xz new file mode 100644 index 000000000..a2e8799c6 Binary files /dev/null and b/other/mpd/mpd-0.20.18.tar.xz differ diff --git a/other/squeezelite/squeezelite-1.8.7-1020.zip b/other/squeezelite/squeezelite-1.8.7-1020.zip deleted file mode 100644 index f2f1f609d..000000000 Binary files a/other/squeezelite/squeezelite-1.8.7-1020.zip and /dev/null differ diff --git a/other/squeezelite/squeezelite-1.8.7-1020 b/other/squeezelite/squeezelite-1.8.7-1052 similarity index 61% rename from other/squeezelite/squeezelite-1.8.7-1020 rename to other/squeezelite/squeezelite-1.8.7-1052 index 4b792583f..1e81037f8 100755 Binary files a/other/squeezelite/squeezelite-1.8.7-1020 and b/other/squeezelite/squeezelite-1.8.7-1052 differ diff --git a/other/squeezelite/squeezelite-1.8.7-1052.zip b/other/squeezelite/squeezelite-1.8.7-1052.zip new file mode 100644 index 000000000..5e450fdf4 Binary files /dev/null and b/other/squeezelite/squeezelite-1.8.7-1052.zip differ diff --git a/other/upmpdcli/upmpdcli-1.2.15.tar.gz b/other/upmpdcli/upmpdcli-1.2.15.tar.gz deleted file mode 100644 index 64b439541..000000000 Binary files a/other/upmpdcli/upmpdcli-1.2.15.tar.gz and /dev/null differ diff --git a/other/upmpdcli/upmpdcli-code-1.2.16.tar.gz b/other/upmpdcli/upmpdcli-code-1.2.16.tar.gz new file mode 100755 index 000000000..ac4b1f6b2 Binary files /dev/null and b/other/upmpdcli/upmpdcli-code-1.2.16.tar.gz differ diff --git a/other/wiringpi/wiringPi-96344ff/.gitignore b/other/wiringpi/wiringPi-96344ff/.gitignore deleted file mode 100644 index ed2ec801b..000000000 --- a/other/wiringpi/wiringPi-96344ff/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -*.o -*.so -lib*.so.* -*~ -debian-template/wiringPi -debian-template/wiringpi-*.deb -gpio/gpio diff --git a/other/wiringpi/wiringPi-96344ff/COPYING.LESSER b/other/wiringpi/wiringPi-96344ff/COPYING.LESSER deleted file mode 100644 index 65c5ca88a..000000000 --- a/other/wiringpi/wiringPi-96344ff/COPYING.LESSER +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser 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 -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/other/wiringpi/wiringPi-96344ff/INSTALL b/other/wiringpi/wiringPi-96344ff/INSTALL deleted file mode 100644 index 8e0c43cf3..000000000 --- a/other/wiringpi/wiringPi-96344ff/INSTALL +++ /dev/null @@ -1,36 +0,0 @@ - -How to install wiringPi -======================= - -The easiest way is to use the supplied 'build' script: - - ./build - -that should do a complete install or upgrade of wiringPi for you. - -That will install a dynamic library. - -Some distributions do not have /usr/local/lib in the default LD_LIBRARY_PATH. To -fix this, you need to edit /etc/ld.so.conf and add in a single line: - - /usr/local/lib - -then run the ldconfig command. - - sudo ldconfig - -If you want to install a static library, you may need to do this manually: - - cd wiringPi - make static - sudo make install-static - - -To un-install wiringPi: - - ./build uninstall - -Gordon Henderson - -projects@drogon.net -https://projects.drogon.net/ diff --git a/other/wiringpi/wiringPi-96344ff/People b/other/wiringpi/wiringPi-96344ff/People deleted file mode 100644 index b339494e1..000000000 --- a/other/wiringpi/wiringPi-96344ff/People +++ /dev/null @@ -1,33 +0,0 @@ - -Just a quick note to some people who've provided help, suggestions, -bug-fixes, etc. along the way... - -Nick Lott: (And others) - Hints about making it work with C++ - -Philipp Stefan Neininger: - Minor bug in the Makefile to do with cross compiling - -Chris McSweeny - Hints and tips about the use of arithmetic in gettimeofday() - inside the dealyMicrosecondsHard() function. - And spotting a couple of schoolboy errors in the (experimental) - softServo code, prompting me to completely re-write it. - -Armin (Via projects website) - Some pointers about the i2c-dev.h files. - -Arno Wagner - Suggestions for the mmap calls in wiringPiSetup() - -CHARLES Thibaut: - A small issue in softTone - -Xian Stannard - Fixing some typos in the man page! - -Andre Crone - Suggested the __WIRING_PI.H__ round wiringPi.h - -Rik Teerling - Pointing out some silly mistooks in the I2C code... diff --git a/other/wiringpi/wiringPi-96344ff/README.TXT b/other/wiringpi/wiringPi-96344ff/README.TXT deleted file mode 100644 index 7789b2eba..000000000 --- a/other/wiringpi/wiringPi-96344ff/README.TXT +++ /dev/null @@ -1,26 +0,0 @@ - -wiringPi README -=============== - -Please note that the official way to get wiringPi is via git from -git.drogon.net and not GitHub. - -ie. - - git clone git://git.drogon.net/wiringPi - -The version of wiringPi held on GitHub by "Gadgetoid" is used to build the -wiringPython, Ruby, Perl, etc. wrappers for these other languages. This -version may lag the official Drogon release. Pull requests may not be -accepted to Github.... - -Please see - - http://wiringpi.com/ - -for the official documentation, etc. and the best way to submit bug reports, etc. -is by sending an email to projects@drogon.net - -Thanks! - - -Gordon diff --git a/other/wiringpi/wiringPi-96344ff/VERSION b/other/wiringpi/wiringPi-96344ff/VERSION deleted file mode 100644 index f454b8169..000000000 --- a/other/wiringpi/wiringPi-96344ff/VERSION +++ /dev/null @@ -1 +0,0 @@ -2.44 diff --git a/other/wiringpi/wiringPi-96344ff/build b/other/wiringpi/wiringPi-96344ff/build deleted file mode 100755 index 7dc074c24..000000000 --- a/other/wiringpi/wiringPi-96344ff/build +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/sh -e - -# build -# Simple wiringPi build and install script -# -# Copyright (c) 2012-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# -# -# wiringPi is designed to run on a Raspberry Pi only. -# However if you're clever enough to actually look at this script to -# see why it's not building for you, then good luck. -# -# To everyone else: Stop using cheap alternatives. Support the -# Raspberry Pi Foundation as they're the only ones putting money -# back into education! -################################################################################# - -check_make_ok() { - if [ $? != 0 ]; then - echo "" - echo "Make Failed..." - echo "Please check the messages and fix any problems. If you're still stuck," - echo "then please email all the output and as many details as you can to" - echo " projects@drogon.net" - echo "" - exit 1 - fi -} - -sudo=${WIRINGPI_SUDO-sudo} - -if [ x$1 = "xclean" ]; then - cd wiringPi - echo -n "wiringPi: " ; make clean - cd ../devLib - echo -n "DevLib: " ; make clean - cd ../gpio - echo -n "gpio: " ; make clean - cd ../examples - echo -n "Examples: " ; make clean - cd Gertboard - echo -n "Gertboard: " ; make clean - cd ../PiFace - echo -n "PiFace: " ; make clean - cd ../q2w - echo -n "Quick2Wire: " ; make clean - cd ../PiGlow - echo -n "PiGlow: " ; make clean - cd ../scrollPhat - echo -n "scrollPhat: " ; make clean - exit -fi - -if [ x$1 = "xuninstall" ]; then - cd wiringPi - echo -n "wiringPi: " ; $sudo make uninstall - cd ../devLib - echo -n "DevLib: " ; $sudo make uninstall - cd ../gpio - echo -n "gpio: " ; $sudo make uninstall - exit -fi - -# Only if you know what you're doing! - -if [ x$1 = "xdebian" ]; then - here=`pwd` - cd debian-template/wiringPi - rm -rf usr - cd $here/wiringPi - make install-deb - cd $here/devLib - make install-deb INCLUDE='-I. -I../wiringPi' - cd $here/gpio - make install-deb INCLUDE='-I../wiringPi -I../devLib' LDFLAGS=-L../debian-template/wiringPi/usr/lib - cd $here/debian-template - fakeroot dpkg-deb --build wiringPi - mv wiringPi.deb wiringpi-`cat $here/VERSION`-1.deb - exit -fi - -if [ x$1 != "x" ]; then - echo "Usage: $0 [clean | uninstall]" - exit 1 -fi - - echo "wiringPi Build script" - echo "=====================" - echo - - hardware=`fgrep Hardware /proc/cpuinfo | head -1 | awk '{ print $3 }'` - -# if [ x$hardware != "xBCM2708" ]; then -# echo "" -# echo " +------------------------------------------------------------+" -# echo " | wiringPi is designed to run on the Raspberry Pi only. |" -# echo " | This processor does not appear to be a Raspberry Pi. |" -# echo " +------------------------------------------------------------+" -# echo " | In the unlikely event that you think it is a Raspberry Pi, |" -# echo " | then please accept my apologies and email the contents of |" -# echo " | /proc/cpuinfo to projects@drogon.net. |" -# echo " | - Thanks, Gordon |" -# echo " +------------------------------------------------------------+" -# echo "" -# exit 1 -# fi - - - echo - echo "WiringPi Library" - cd wiringPi - $sudo make uninstall - if [ x$1 = "xstatic" ]; then - make -j5 static - check_make_ok - $sudo make install-static - else - make -j5 - check_make_ok - $sudo make install - fi - check_make_ok - - echo - echo "WiringPi Devices Library" - cd ../devLib - $sudo make uninstall - if [ x$1 = "xstatic" ]; then - make -j5 static - check_make_ok - $sudo make install-static - else - make -j5 - check_make_ok - $sudo make install - fi - check_make_ok - - echo - echo "GPIO Utility" - cd ../gpio - make -j5 - check_make_ok - $sudo make install - check_make_ok - -# echo -# echo "wiringPi Daemon" -# cd ../wiringPiD -# make -j5 -# check_make_ok -# $sudo make install -# check_make_ok - -# echo -# echo "Examples" -# cd ../examples -# make -# cd .. - -echo -echo All Done. -echo "" -echo "NOTE: To compile programs with wiringPi, you need to add:" -echo " -lwiringPi" -echo " to your compile line(s) To use the Gertboard, MaxDetect, etc." -echo " code (the devLib), you need to also add:" -echo " -lwiringPiDev" -echo " to your compile line(s)." -echo "" diff --git a/other/wiringpi/wiringPi-96344ff/debian/.gitignore b/other/wiringpi/wiringPi-96344ff/debian/.gitignore deleted file mode 100644 index 6296064c7..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.debhelper.log -*.substvars -tmp -wiringpi -libwiringpi2 -libwiringpi-dev -files -*.postinst.debhelper -*.postrm.debhelper diff --git a/other/wiringpi/wiringPi-96344ff/debian/changelog b/other/wiringpi/wiringPi-96344ff/debian/changelog deleted file mode 100644 index 7f04ad542..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/changelog +++ /dev/null @@ -1,6 +0,0 @@ -wiringpi (2.26~iwj) rpi-unstable; urgency=low - - * Initial version with real Debian source package build. - - -- Ian Jackson Sat, 12 Sep 2015 18:31:35 +0100 - diff --git a/other/wiringpi/wiringPi-96344ff/debian/compat b/other/wiringpi/wiringPi-96344ff/debian/compat deleted file mode 100644 index 45a4fb75d..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/compat +++ /dev/null @@ -1 +0,0 @@ -8 diff --git a/other/wiringpi/wiringPi-96344ff/debian/control b/other/wiringpi/wiringPi-96344ff/debian/control deleted file mode 100644 index 1d6d228ee..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/control +++ /dev/null @@ -1,29 +0,0 @@ -Source: wiringpi -Section: electronics -Priority: optional -Maintainer: Ian Jackson -Standards-Version: 3.8.0 -Homepage: http://wiringpi.com/ -Build-Depends: debhelper (>= 8) - -Package: libwiringpi2 -Section: libs -Architecture: armhf -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: GPIO librariees for Raspberry Pi (runtime). - Runtime for the popular wiringPi library. - -Package: wiringpi -Architecture: armhf -Depends: ${shlibs:Depends}, ${misc:Depends} -Description: gpio utility for Raspberry Pi - The wiringPi gpio command line utility, for GPIO access on a - Raspberry Pi from the command line. - -Package: libwiringpi-dev -Architecture: armhf -Depends: libwiringpi2 (= ${binary:Version}), libc6-dev, ${misc:Depends} -Suggests: wiringpi -Description: GPIO development library for Raspberry Pi - Development libraries to allow GPIO access on a Raspberry Pi from C - and C++ programs. diff --git a/other/wiringpi/wiringPi-96344ff/debian/copyright b/other/wiringpi/wiringPi-96344ff/debian/copyright deleted file mode 100644 index de8270108..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/copyright +++ /dev/null @@ -1,15 +0,0 @@ -wiringPi is Copyright (C) 2012-2015 Gordon Henderson. - -wiringPi is free software; you can redistribute it and/or modify it -under the terms of the GNU Lesser General Public License, as published -by the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -wiringPi 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 Lesser General Public License for more details. - -On all Debian and Raspbian systems, a copy of the GNU Lesser General -Public License version 3 can be found in -`/usr/share/common-licenses/LGPL-3'. diff --git a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi-dev.dirs b/other/wiringpi/wiringPi-96344ff/debian/libwiringpi-dev.dirs deleted file mode 100644 index 44188162e..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi-dev.dirs +++ /dev/null @@ -1,2 +0,0 @@ -usr/lib -usr/include diff --git a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi-dev.install b/other/wiringpi/wiringPi-96344ff/debian/libwiringpi-dev.install deleted file mode 100644 index d7ea901cb..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi-dev.install +++ /dev/null @@ -1,3 +0,0 @@ -debian/tmp/usr/include -debian/tmp/usr/lib/*.so -examples usr/share/doc/libwiringpi-dev diff --git a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi2.install b/other/wiringpi/wiringPi-96344ff/debian/libwiringpi2.install deleted file mode 100644 index c45ebcf2a..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi2.install +++ /dev/null @@ -1 +0,0 @@ -debian/tmp/usr/lib/lib*.so.* diff --git a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi2.shlibs b/other/wiringpi/wiringPi-96344ff/debian/libwiringpi2.shlibs deleted file mode 100644 index 0be8db165..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/libwiringpi2.shlibs +++ /dev/null @@ -1,2 +0,0 @@ -libwiringPi 2 libwiringpi2 -libwiringPiDev 2 libwiringpi2 diff --git a/other/wiringpi/wiringPi-96344ff/debian/rules b/other/wiringpi/wiringPi-96344ff/debian/rules deleted file mode 100755 index 423a47316..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/rules +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/make -f - -.PHONY: build - -VERSION:=$(shell cat VERSION) -export VERSION - -soname:=$(shell echo $${VERSION%%.*}) -WIRINGPI_SONAME_SUFFIX:=.$(soname) -export soname -export WIRINGPI_SONAME_SUFFIX - -build: - dh $@ - -override_dh_auto_configure: - -override_dh_prep: - dh_prep -Xdebian/tmp - -dirs: - dh_installdirs -A - mkdir debian/tmp - set -e; for p in `dh_listpackages`; do \ - (cd debian/$$p; find -type d) | \ - (cd debian/tmp; xargs mkdir -p) \ - done - -override_dh_clean: - dh_clean - WIRINGPI_SUDO= bash -xe ./build clean - -override_dh_auto_build: dirs - V=1 LDCONFIG=: WIRINGPI_SUDO= WIRINGPI_SUID=0 \ - DESTDIR=`pwd`/debian/tmp/usr \ - PREFIX= WIRINGPI_SUDO= \ - bash -xe ./build - -override_dh_auto_install: - dh_install - set -ex; for l in libwiringPi libwiringPiDev; do \ - ln -sf $$l.so.$${VERSION} \ - debian/libwiringpi$$soname/usr/lib/$$l.so.$$soname; \ - ln -sf $$l.so.$${VERSION} \ - debian/libwiringpi-dev/usr/lib/$$l.so; \ - done - -%: - dh $@ diff --git a/other/wiringpi/wiringPi-96344ff/debian/wiringpi.dirs b/other/wiringpi/wiringPi-96344ff/debian/wiringpi.dirs deleted file mode 100644 index e77248175..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/wiringpi.dirs +++ /dev/null @@ -1 +0,0 @@ -usr/bin diff --git a/other/wiringpi/wiringPi-96344ff/debian/wiringpi.install b/other/wiringpi/wiringPi-96344ff/debian/wiringpi.install deleted file mode 100644 index 41ae22d7d..000000000 --- a/other/wiringpi/wiringPi-96344ff/debian/wiringpi.install +++ /dev/null @@ -1,4 +0,0 @@ -debian/tmp/usr/bin -debian/tmp/usr/man usr/share -README.TXT usr/share/doc/wiringpi -People usr/share/doc/wiringpi diff --git a/other/wiringpi/wiringPi-96344ff/devLib/Makefile b/other/wiringpi/wiringPi-96344ff/devLib/Makefile deleted file mode 100644 index cf665d6ab..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/Makefile +++ /dev/null @@ -1,140 +0,0 @@ -# -# Makefile: -# wiringPi device - A "wiring" library for the Raspberry Pi -# -# Copyright (c) 2012-2016 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# https://projects.drogon.net/raspberry-pi/wiringpi/ -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -VERSION=$(shell cat ../VERSION) -DESTDIR?=/usr -PREFIX?=/local - -LDCONFIG?=ldconfig - -ifneq ($V,1) -Q ?= @ -endif - -STATIC=libwiringPiDev.a -DYNAMIC=libwiringPiDev.so.$(VERSION) - -#DEBUG = -g -O0 -DEBUG = -O2 -CC = gcc -INCLUDE = -I. -DEFS = -D_GNU_SOURCE -CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Winline $(INCLUDE) -pipe -fPIC - -LIBS = - -############################################################################### - -SRC = ds1302.c maxdetect.c piNes.c \ - gertboard.c piFace.c \ - lcd128x64.c lcd.c \ - scrollPhat.c \ - piGlow.c - -OBJ = $(SRC:.c=.o) - -HEADERS = ds1302.h gertboard.h lcd128x64.h lcd.h maxdetect.h piFace.h piGlow.h piNes.h\ - scrollPhat.h - -all: $(DYNAMIC) - -static: $(STATIC) - -$(STATIC): $(OBJ) - $Q echo "[Link (Static)]" - $Q ar rcs $(STATIC) $(OBJ) - $Q ranlib $(STATIC) -# @size $(STATIC) - -$(DYNAMIC): $(OBJ) - $Q echo "[Link (Dynamic)]" - $Q $(CC) -shared -Wl,-soname,libwiringPiDev.so$(WIRINGPI_SONAME_SUFFIX) -o libwiringPiDev.so.$(VERSION) -lpthread $(OBJ) - -.c.o: - $Q echo [Compile] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -.PHONY: clean -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPiDev.* - -.PHONY: tags -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - - -.PHONY: install -install: $(DYNAMIC) - $Q echo "[Install Headers]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include - $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include - $Q echo "[Install Dynamic Lib]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib - $Q install -m 0755 libwiringPiDev.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) - $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPiDev.so.$(VERSION) $(DESTDIR)/lib/libwiringPiDev.so - $Q $(LDCONFIG) - -.PHONY: install-static -install-static: $(STATIC) - $Q echo "[Install Headers]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include - $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include - $Q echo "[Install Static Lib]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib - $Q install -m 0755 libwiringPiDev.a $(DESTDIR)$(PREFIX)/lib - -.PHONY: install-deb -install-deb: $(DYNAMIC) - $Q echo "[Install Headers: deb]" - $Q install -m 0755 -d ~/wiringPi/debian-template/wiringPi/usr/include - $Q install -m 0644 $(HEADERS) ~/wiringPi/debian-template/wiringPi/usr/include - $Q echo "[Install Dynamic Lib: deb]" - install -m 0755 -d ~/wiringPi/debian-template/wiringPi/usr/lib - install -m 0755 libwiringPiDev.so.$(VERSION) ~/wiringPi/debian-template/wiringPi/usr/lib/libwiringPiDev.so.$(VERSION) - ln -sf ~/wiringPi/debian-template/wiringPi/usr/lib/libwiringPiDev.so.$(VERSION) ~/wiringPi/debian-template/wiringPi/usr/lib/libwiringPiDev.so - -.PHONY: uninstall -uninstall: - $Q echo "[UnInstall]" - $Q cd $(DESTDIR)$(PREFIX)/include/ && rm -f $(HEADERS) - $Q cd $(DESTDIR)$(PREFIX)/lib/ && rm -f libwiringPiDev.* - $Q $(LDCONFIG) - - -.PHONY: depend -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE - -ds1302.o: ds1302.h -maxdetect.o: maxdetect.h -piNes.o: piNes.h -gertboard.o: gertboard.h -piFace.o: piFace.h -lcd128x64.o: font.h lcd128x64.h -lcd.o: lcd.h -scrollPhat.o: scrollPhatFont.h scrollPhat.h -piGlow.o: piGlow.h diff --git a/other/wiringpi/wiringPi-96344ff/devLib/ds1302.c b/other/wiringpi/wiringPi-96344ff/devLib/ds1302.c deleted file mode 100644 index cf64de77d..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/ds1302.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * ds1302.c: - * Real Time clock - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include - -#include "ds1302.h" - -// Register defines - -#define RTC_SECS 0 -#define RTC_MINS 1 -#define RTC_HOURS 2 -#define RTC_DATE 3 -#define RTC_MONTH 4 -#define RTC_DAY 5 -#define RTC_YEAR 6 -#define RTC_WP 7 -#define RTC_TC 8 -#define RTC_BM 31 - - -// Locals - -static int dPin, cPin, sPin ; - -/* - * dsShiftIn: - * Shift a number in from the chip, LSB first. Note that the data is - * sampled on the trailing edge of the last clock, so it's valid immediately. - ********************************************************************************* - */ - -static unsigned int dsShiftIn (void) -{ - uint8_t value = 0 ; - int i ; - - pinMode (dPin, INPUT) ; delayMicroseconds (1) ; - - for (i = 0 ; i < 8 ; ++i) - { - value |= (digitalRead (dPin) << i) ; - digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ; - digitalWrite (cPin, LOW) ; delayMicroseconds (1) ; - } - - return value; -} - - -/* - * dsShiftOut: - * A normal LSB-first shift-out, just slowed down a bit - the Pi is - * a bit faster than the chip can handle. - ********************************************************************************* - */ - -static void dsShiftOut (unsigned int data) -{ - int i ; - - pinMode (dPin, OUTPUT) ; - - for (i = 0 ; i < 8 ; ++i) - { - digitalWrite (dPin, data & (1 << i)) ; delayMicroseconds (1) ; - digitalWrite (cPin, HIGH) ; delayMicroseconds (1) ; - digitalWrite (cPin, LOW) ; delayMicroseconds (1) ; - } -} - - -/* - * ds1302regRead: ds1302regWrite: - * Read/Write a value to an RTC Register or RAM location on the chip - ********************************************************************************* - */ - -static unsigned int ds1302regRead (const int reg) -{ - unsigned int data ; - - digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; - dsShiftOut (reg) ; - data = dsShiftIn () ; - digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; - - return data ; -} - -static void ds1302regWrite (const int reg, const unsigned int data) -{ - digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; - dsShiftOut (reg) ; - dsShiftOut (data) ; - digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; -} - - -/* - * ds1302rtcWrite: ds1302rtcRead: - * Writes/Reads the data to/from the RTC register - ********************************************************************************* - */ - -unsigned int ds1302rtcRead (const int reg) -{ - return ds1302regRead (0x81 | ((reg & 0x1F) << 1)) ; -} - -void ds1302rtcWrite (int reg, unsigned int data) -{ - ds1302regWrite (0x80 | ((reg & 0x1F) << 1), data) ; -} - - -/* - * ds1302ramWrite: ds1302ramRead: - * Writes/Reads the data to/from the RTC register - ********************************************************************************* - */ - -unsigned int ds1302ramRead (const int addr) -{ - return ds1302regRead (0xC1 | ((addr & 0x1F) << 1)) ; -} - -void ds1302ramWrite (const int addr, const unsigned int data) -{ - ds1302regWrite ( 0xC0 | ((addr & 0x1F) << 1), data) ; -} - -/* - * ds1302clockRead: - * Read all 8 bytes of the clock in a single operation - ********************************************************************************* - */ - -void ds1302clockRead (int clockData [8]) -{ - int i ; - unsigned int regVal = 0x81 | ((RTC_BM & 0x1F) << 1) ; - - digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; - - dsShiftOut (regVal) ; - for (i = 0 ; i < 8 ; ++i) - clockData [i] = dsShiftIn () ; - - digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; -} - - -/* - * ds1302clockWrite: - * Write all 8 bytes of the clock in a single operation - ********************************************************************************* - */ - -void ds1302clockWrite (const int clockData [8]) -{ - int i ; - unsigned int regVal = 0x80 | ((RTC_BM & 0x1F) << 1) ; - - digitalWrite (sPin, HIGH) ; delayMicroseconds (1) ; - - dsShiftOut (regVal) ; - for (i = 0 ; i < 8 ; ++i) - dsShiftOut (clockData [i]) ; - - digitalWrite (sPin, LOW) ; delayMicroseconds (1) ; -} - - -/* - * ds1302trickleCharge: - * Set the bits on the trickle charger. - * Probably best left alone... - ********************************************************************************* - */ - -void ds1302trickleCharge (const int diodes, const int resistors) -{ - if (diodes + resistors == 0) - ds1302rtcWrite (RTC_TC, 0x5C) ; // Disabled - else - ds1302rtcWrite (RTC_TC, 0xA0 | ((diodes & 3) << 2) | (resistors & 3)) ; -} - - - - -/* - * ds1302setup: - * Initialise the chip & remember the pins we're using - ********************************************************************************* - */ - -void ds1302setup (const int clockPin, const int dataPin, const int csPin) -{ - dPin = dataPin ; - cPin = clockPin ; - sPin = csPin ; - - digitalWrite (dPin, LOW) ; - digitalWrite (cPin, LOW) ; - digitalWrite (sPin, LOW) ; - - pinMode (dPin, OUTPUT) ; - pinMode (cPin, OUTPUT) ; - pinMode (sPin, OUTPUT) ; - - ds1302rtcWrite (RTC_WP, 0) ; // Remove write-protect -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/ds1302.h b/other/wiringpi/wiringPi-96344ff/devLib/ds1302.h deleted file mode 100644 index e82b3ed09..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/ds1302.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ds1302.h: - * Real Time clock - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern unsigned int ds1302rtcRead (const int reg) ; -extern void ds1302rtcWrite (const int reg, const unsigned int data) ; - -extern unsigned int ds1302ramRead (const int addr) ; -extern void ds1302ramWrite (const int addr, const unsigned int data) ; - -extern void ds1302clockRead (int clockData [8]) ; -extern void ds1302clockWrite (const int clockData [8]) ; - -extern void ds1302trickleCharge (const int diodes, const int resistors) ; - -extern void ds1302setup (const int clockPin, const int dataPin, const int csPin) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/font.h b/other/wiringpi/wiringPi-96344ff/devLib/font.h deleted file mode 100644 index ce99e1687..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/font.h +++ /dev/null @@ -1,2577 +0,0 @@ -/**********************************************/ -/* */ -/* Font file generated by cpi2fnt */ -/* ------------------------------ */ -/* Combined with the alpha-numeric */ -/* portion of Greg Harp's old PEARL */ -/* font (from earlier versions of */ -/* linux-m86k) by John Shifflett */ -/* */ -/**********************************************/ - -static const int fontHeight = 8 ; -static const int fontWidth = 8 ; - -static unsigned char font [] = -{ - /* 0 0x00 '^@' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 1 0x01 '^A' */ - 0x7e, /* 01111110 */ - 0x81, /* 10000001 */ - 0xa5, /* 10100101 */ - 0x81, /* 10000001 */ - 0xbd, /* 10111101 */ - 0x99, /* 10011001 */ - 0x81, /* 10000001 */ - 0x7e, /* 01111110 */ - - /* 2 0x02 '^B' */ - 0x7e, /* 01111110 */ - 0xff, /* 11111111 */ - 0xdb, /* 11011011 */ - 0xff, /* 11111111 */ - 0xc3, /* 11000011 */ - 0xe7, /* 11100111 */ - 0xff, /* 11111111 */ - 0x7e, /* 01111110 */ - - /* 3 0x03 '^C' */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x00, /* 00000000 */ - - /* 4 0x04 '^D' */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x7c, /* 01111100 */ - 0xfe, /* 11111110 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0x10, /* 00010000 */ - 0x00, /* 00000000 */ - - /* 5 0x05 '^E' */ - 0x38, /* 00111000 */ - 0x7c, /* 01111100 */ - 0x38, /* 00111000 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0xd6, /* 11010110 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - - /* 6 0x06 '^F' */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x7c, /* 01111100 */ - 0xfe, /* 11111110 */ - 0xfe, /* 11111110 */ - 0x7c, /* 01111100 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - - /* 7 0x07 '^G' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 8 0x08 '^H' */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xe7, /* 11100111 */ - 0xc3, /* 11000011 */ - 0xc3, /* 11000011 */ - 0xe7, /* 11100111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 9 0x09 '^I' */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x42, /* 01000010 */ - 0x42, /* 01000010 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 10 0x0a '^J' */ - 0xff, /* 11111111 */ - 0xc3, /* 11000011 */ - 0x99, /* 10011001 */ - 0xbd, /* 10111101 */ - 0xbd, /* 10111101 */ - 0x99, /* 10011001 */ - 0xc3, /* 11000011 */ - 0xff, /* 11111111 */ - - /* 11 0x0b '^K' */ - 0x0f, /* 00001111 */ - 0x07, /* 00000111 */ - 0x0f, /* 00001111 */ - 0x7d, /* 01111101 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x78, /* 01111000 */ - - /* 12 0x0c '^L' */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - - /* 13 0x0d '^M' */ - 0x3f, /* 00111111 */ - 0x33, /* 00110011 */ - 0x3f, /* 00111111 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x70, /* 01110000 */ - 0xf0, /* 11110000 */ - 0xe0, /* 11100000 */ - - /* 14 0x0e '^N' */ - 0x7f, /* 01111111 */ - 0x63, /* 01100011 */ - 0x7f, /* 01111111 */ - 0x63, /* 01100011 */ - 0x63, /* 01100011 */ - 0x67, /* 01100111 */ - 0xe6, /* 11100110 */ - 0xc0, /* 11000000 */ - - /* 15 0x0f '^O' */ - 0x18, /* 00011000 */ - 0xdb, /* 11011011 */ - 0x3c, /* 00111100 */ - 0xe7, /* 11100111 */ - 0xe7, /* 11100111 */ - 0x3c, /* 00111100 */ - 0xdb, /* 11011011 */ - 0x18, /* 00011000 */ - - /* 16 0x10 '^P' */ - 0x80, /* 10000000 */ - 0xe0, /* 11100000 */ - 0xf8, /* 11111000 */ - 0xfe, /* 11111110 */ - 0xf8, /* 11111000 */ - 0xe0, /* 11100000 */ - 0x80, /* 10000000 */ - 0x00, /* 00000000 */ - - /* 17 0x11 '^Q' */ - 0x02, /* 00000010 */ - 0x0e, /* 00001110 */ - 0x3e, /* 00111110 */ - 0xfe, /* 11111110 */ - 0x3e, /* 00111110 */ - 0x0e, /* 00001110 */ - 0x02, /* 00000010 */ - 0x00, /* 00000000 */ - - /* 18 0x12 '^R' */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - - /* 19 0x13 '^S' */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - - /* 20 0x14 '^T' */ - 0x7f, /* 01111111 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0x7b, /* 01111011 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x00, /* 00000000 */ - - /* 21 0x15 '^U' */ - 0x3e, /* 00111110 */ - 0x61, /* 01100001 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x86, /* 10000110 */ - 0x7c, /* 01111100 */ - - /* 22 0x16 '^V' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 23 0x17 '^W' */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - - /* 24 0x18 '^X' */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 25 0x19 '^Y' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 26 0x1a '^Z' */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0xfe, /* 11111110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 27 0x1b '^[' */ - 0x00, /* 00000000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xfe, /* 11111110 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 28 0x1c '^\' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 29 0x1d '^]' */ - 0x00, /* 00000000 */ - 0x24, /* 00100100 */ - 0x66, /* 01100110 */ - 0xff, /* 11111111 */ - 0x66, /* 01100110 */ - 0x24, /* 00100100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 30 0x1e '^^' */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 31 0x1f '^_' */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0x7e, /* 01111110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 32 0x20 ' ' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 33 0x21 '!' */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 34 0x22 '"' */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 35 0x23 '#' */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - - /* 36 0x24 '$' */ - 0x18, /* 00011000 */ - 0x3e, /* 00111110 */ - 0x60, /* 01100000 */ - 0x3c, /* 00111100 */ - 0x06, /* 00000110 */ - 0x7c, /* 01111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 37 0x25 '%' */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xcc, /* 11001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x66, /* 01100110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 38 0x26 '&' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x68, /* 01101000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 39 0x27 ''' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 40 0x28 '(' */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - - /* 41 0x29 ')' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - - /* 42 0x2a '*' */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0xff, /* 11111111 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 43 0x2b '+' */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 44 0x2c ',' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - - /* 45 0x2d '-' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 46 0x2e '.' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 47 0x2f '/' */ - 0x03, /* 00000011 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - - /* 48 0x30 '0' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xde, /* 11011110 */ - 0xfe, /* 11111110 */ - 0xf6, /* 11110110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 49 0x31 '1' */ - 0x18, /* 00011000 */ - 0x78, /* 01111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 50 0x32 '2' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 51 0x33 '3' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x06, /* 00000110 */ - 0x1c, /* 00011100 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 52 0x34 '4' */ - 0x1c, /* 00011100 */ - 0x3c, /* 00111100 */ - 0x6c, /* 01101100 */ - 0xcc, /* 11001100 */ - 0xfe, /* 11111110 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - - /* 53 0x35 '5' */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xfc, /* 11111100 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 54 0x36 '6' */ - 0x38, /* 00111000 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 55 0x37 '7' */ - 0xfe, /* 11111110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - - /* 56 0x38 '8' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 57 0x39 '9' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - - /* 58 0x3a ':' */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 59 0x3b ';' */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - - /* 60 0x3c '<' */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - - /* 61 0x3d '=' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 62 0x3e '>' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - - /* 63 0x3f '?' */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 64 0x40 '@' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xde, /* 11011110 */ - 0xde, /* 11011110 */ - 0xde, /* 11011110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 65 0x41 'A' */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 66 0x42 'B' */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - - /* 67 0x43 'C' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 68 0x44 'D' */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - - /* 69 0x45 'E' */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xf8, /* 11111000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 70 0x46 'F' */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xf8, /* 11111000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - - /* 71 0x47 'G' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xce, /* 11001110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 72 0x48 'H' */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 73 0x49 'I' */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 74 0x4a 'J' */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 75 0x4b 'K' */ - 0xc6, /* 11000110 */ - 0xcc, /* 11001100 */ - 0xd8, /* 11011000 */ - 0xf0, /* 11110000 */ - 0xd8, /* 11011000 */ - 0xcc, /* 11001100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 76 0x4c 'L' */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 77 0x4d 'M' */ - 0x82, /* 10000010 */ - 0xc6, /* 11000110 */ - 0xee, /* 11101110 */ - 0xfe, /* 11111110 */ - 0xd6, /* 11010110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 78 0x4e 'N' */ - 0xc6, /* 11000110 */ - 0xe6, /* 11100110 */ - 0xf6, /* 11110110 */ - 0xde, /* 11011110 */ - 0xce, /* 11001110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 79 0x4f 'O' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 80 0x50 'P' */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - - /* 81 0x51 'Q' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xf6, /* 11110110 */ - 0xde, /* 11011110 */ - 0x7c, /* 01111100 */ - 0x06, /* 00000110 */ - - /* 82 0x52 'R' */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0xd8, /* 11011000 */ - 0xcc, /* 11001100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 83 0x53 'S' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0x60, /* 01100000 */ - 0x38, /* 00111000 */ - 0x0c, /* 00001100 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 84 0x54 'T' */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 85 0x55 'U' */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 86 0x56 'V' */ - 0xc3, /* 11000011 */ - 0xc3, /* 11000011 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 87 0x57 'W' */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xd6, /* 11010110 */ - 0xfe, /* 11111110 */ - 0xee, /* 11101110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 88 0x58 'X' */ - 0xc3, /* 11000011 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0xc3, /* 11000011 */ - 0x00, /* 00000000 */ - - /* 89 0x59 'Y' */ - 0xc3, /* 11000011 */ - 0xc3, /* 11000011 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 90 0x5a 'Z' */ - 0xfe, /* 11111110 */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 91 0x5b '[' */ - 0x3c, /* 00111100 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 92 0x5c '\' */ - 0xc0, /* 11000000 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x06, /* 00000110 */ - 0x03, /* 00000011 */ - 0x00, /* 00000000 */ - - /* 93 0x5d ']' */ - 0x3c, /* 00111100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 94 0x5e '^' */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 95 0x5f '_' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - - /* 96 0x60 '`' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 97 0x61 'a' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0x06, /* 00000110 */ - 0x7e, /* 01111110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 98 0x62 'b' */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - - /* 99 0x63 'c' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 100 0x64 'd' */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x7e, /* 01111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 101 0x65 'e' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 102 0x66 'f' */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x60, /* 01100000 */ - 0xf0, /* 11110000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x60, /* 01100000 */ - 0x00, /* 00000000 */ - - /* 103 0x67 'g' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0x7c, /* 01111100 */ - - /* 104 0x68 'h' */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 105 0x69 'i' */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 106 0x6a 'j' */ - 0x06, /* 00000110 */ - 0x00, /* 00000000 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - - /* 107 0x6b 'k' */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xcc, /* 11001100 */ - 0xd8, /* 11011000 */ - 0xf0, /* 11110000 */ - 0xd8, /* 11011000 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - - /* 108 0x6c 'l' */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 109 0x6d 'm' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xec, /* 11101100 */ - 0xfe, /* 11111110 */ - 0xd6, /* 11010110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 110 0x6e 'n' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 111 0x6f 'o' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 112 0x70 'p' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfc, /* 11111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfc, /* 11111100 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - - /* 113 0x71 'q' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - - /* 114 0x72 'r' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xdc, /* 11011100 */ - 0xe6, /* 11100110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - - /* 115 0x73 's' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x06, /* 00000110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - - /* 116 0x74 't' */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x7c, /* 01111100 */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x36, /* 00110110 */ - 0x1c, /* 00011100 */ - 0x00, /* 00000000 */ - - /* 117 0x75 'u' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 118 0x76 'v' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - - /* 119 0x77 'w' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xd6, /* 11010110 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - - /* 120 0x78 'x' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 121 0x79 'y' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xc3, /* 11000011 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - - /* 122 0x7a 'z' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x0c, /* 00001100 */ - 0x38, /* 00111000 */ - 0x60, /* 01100000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 123 0x7b '{' */ - 0x0e, /* 00001110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x70, /* 01110000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x0e, /* 00001110 */ - 0x00, /* 00000000 */ - - /* 124 0x7c '|' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 125 0x7d '}' */ - 0x70, /* 01110000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x0e, /* 00001110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - - /* 126 0x7e '~' */ - 0x72, /* 01110010 */ - 0x9c, /* 10011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 127 0x7f '' */ - 0x00, /* 00000000 */ - 0x10, /* 00010000 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 128 0x80 '' */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x0c, /* 00001100 */ - 0x78, /* 01111000 */ - - /* 129 0x81 '' */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 130 0x82 '' */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 131 0x83 '' */ - 0x7c, /* 01111100 */ - 0x82, /* 10000010 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 132 0x84 '' */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 133 0x85 '' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 134 0x86 '' */ - 0x30, /* 00110000 */ - 0x30, /* 00110000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 135 0x87 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x7e, /* 01111110 */ - 0x0c, /* 00001100 */ - 0x38, /* 00111000 */ - - /* 136 0x88 '' */ - 0x7c, /* 01111100 */ - 0x82, /* 10000010 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 137 0x89 '' */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 138 0x8a '' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 139 0x8b '' */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 140 0x8c '' */ - 0x7c, /* 01111100 */ - 0x82, /* 10000010 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 141 0x8d '' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 142 0x8e '' */ - 0xc6, /* 11000110 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 143 0x8f '' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 144 0x90 '' */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xf8, /* 11111000 */ - 0xc0, /* 11000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 145 0x91 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0xd8, /* 11011000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 146 0x92 '' */ - 0x3e, /* 00111110 */ - 0x6c, /* 01101100 */ - 0xcc, /* 11001100 */ - 0xfe, /* 11111110 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xce, /* 11001110 */ - 0x00, /* 00000000 */ - - /* 147 0x93 '' */ - 0x7c, /* 01111100 */ - 0x82, /* 10000010 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 148 0x94 '' */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 149 0x95 '' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 150 0x96 '' */ - 0x78, /* 01111000 */ - 0x84, /* 10000100 */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 151 0x97 '' */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 152 0x98 '' */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7e, /* 01111110 */ - 0x06, /* 00000110 */ - 0xfc, /* 11111100 */ - - /* 153 0x99 '' */ - 0xc6, /* 11000110 */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - - /* 154 0x9a '' */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 155 0x9b '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 156 0x9c '' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x64, /* 01100100 */ - 0xf0, /* 11110000 */ - 0x60, /* 01100000 */ - 0x66, /* 01100110 */ - 0xfc, /* 11111100 */ - 0x00, /* 00000000 */ - - /* 157 0x9d '' */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 158 0x9e '' */ - 0xf8, /* 11111000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xfa, /* 11111010 */ - 0xc6, /* 11000110 */ - 0xcf, /* 11001111 */ - 0xc6, /* 11000110 */ - 0xc7, /* 11000111 */ - - /* 159 0x9f '' */ - 0x0e, /* 00001110 */ - 0x1b, /* 00011011 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0xd8, /* 11011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - - /* 160 0xa0 '' */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x7c, /* 01111100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 161 0xa1 '' */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x38, /* 00111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 162 0xa2 '' */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - - /* 163 0xa3 '' */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 164 0xa4 '' */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0xdc, /* 11011100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x00, /* 00000000 */ - - /* 165 0xa5 '' */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0xe6, /* 11100110 */ - 0xf6, /* 11110110 */ - 0xde, /* 11011110 */ - 0xce, /* 11001110 */ - 0x00, /* 00000000 */ - - /* 166 0xa6 '' */ - 0x3c, /* 00111100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x3e, /* 00111110 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 167 0xa7 '' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 168 0xa8 '' */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x63, /* 01100011 */ - 0x3e, /* 00111110 */ - 0x00, /* 00000000 */ - - /* 169 0xa9 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 170 0xaa '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x06, /* 00000110 */ - 0x06, /* 00000110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 171 0xab '' */ - 0x63, /* 01100011 */ - 0xe6, /* 11100110 */ - 0x6c, /* 01101100 */ - 0x7e, /* 01111110 */ - 0x33, /* 00110011 */ - 0x66, /* 01100110 */ - 0xcc, /* 11001100 */ - 0x0f, /* 00001111 */ - - /* 172 0xac '' */ - 0x63, /* 01100011 */ - 0xe6, /* 11100110 */ - 0x6c, /* 01101100 */ - 0x7a, /* 01111010 */ - 0x36, /* 00110110 */ - 0x6a, /* 01101010 */ - 0xdf, /* 11011111 */ - 0x06, /* 00000110 */ - - /* 173 0xad '' */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 174 0xae '' */ - 0x00, /* 00000000 */ - 0x33, /* 00110011 */ - 0x66, /* 01100110 */ - 0xcc, /* 11001100 */ - 0x66, /* 01100110 */ - 0x33, /* 00110011 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 175 0xaf '' */ - 0x00, /* 00000000 */ - 0xcc, /* 11001100 */ - 0x66, /* 01100110 */ - 0x33, /* 00110011 */ - 0x66, /* 01100110 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 176 0xb0 '' */ - 0x22, /* 00100010 */ - 0x88, /* 10001000 */ - 0x22, /* 00100010 */ - 0x88, /* 10001000 */ - 0x22, /* 00100010 */ - 0x88, /* 10001000 */ - 0x22, /* 00100010 */ - 0x88, /* 10001000 */ - - /* 177 0xb1 '' */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - 0x55, /* 01010101 */ - 0xaa, /* 10101010 */ - - /* 178 0xb2 '' */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - 0x77, /* 01110111 */ - 0xdd, /* 11011101 */ - - /* 179 0xb3 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 180 0xb4 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 181 0xb5 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 182 0xb6 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf6, /* 11110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 183 0xb7 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 184 0xb8 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 185 0xb9 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf6, /* 11110110 */ - 0x06, /* 00000110 */ - 0xf6, /* 11110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 186 0xba '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 187 0xbb '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x06, /* 00000110 */ - 0xf6, /* 11110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 188 0xbc '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf6, /* 11110110 */ - 0x06, /* 00000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 189 0xbd '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 190 0xbe '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 191 0xbf '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xf8, /* 11111000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 192 0xc0 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 193 0xc1 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 194 0xc2 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 195 0xc3 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 196 0xc4 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 197 0xc5 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 198 0xc6 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 199 0xc7 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x37, /* 00110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 200 0xc8 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x37, /* 00110111 */ - 0x30, /* 00110000 */ - 0x3f, /* 00111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 201 0xc9 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3f, /* 00111111 */ - 0x30, /* 00110000 */ - 0x37, /* 00110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 202 0xca '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf7, /* 11110111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 203 0xcb '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xf7, /* 11110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 204 0xcc '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x37, /* 00110111 */ - 0x30, /* 00110000 */ - 0x37, /* 00110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 205 0xcd '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 206 0xce '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xf7, /* 11110111 */ - 0x00, /* 00000000 */ - 0xf7, /* 11110111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 207 0xcf '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 208 0xd0 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 209 0xd1 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 210 0xd2 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 211 0xd3 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x3f, /* 00111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 212 0xd4 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 213 0xd5 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 214 0xd6 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3f, /* 00111111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 215 0xd7 '' */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0xff, /* 11111111 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - - /* 216 0xd8 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0xff, /* 11111111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 217 0xd9 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xf8, /* 11111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 218 0xda '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x1f, /* 00011111 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 219 0xdb '' */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 220 0xdc '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - - /* 221 0xdd '' */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - 0xf0, /* 11110000 */ - - /* 222 0xde '' */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - 0x0f, /* 00001111 */ - - /* 223 0xdf '' */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0xff, /* 11111111 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 224 0xe0 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0xc8, /* 11001000 */ - 0xdc, /* 11011100 */ - 0x76, /* 01110110 */ - 0x00, /* 00000000 */ - - /* 225 0xe1 '' */ - 0x78, /* 01111000 */ - 0xcc, /* 11001100 */ - 0xcc, /* 11001100 */ - 0xd8, /* 11011000 */ - 0xcc, /* 11001100 */ - 0xc6, /* 11000110 */ - 0xcc, /* 11001100 */ - 0x00, /* 00000000 */ - - /* 226 0xe2 '' */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0xc0, /* 11000000 */ - 0x00, /* 00000000 */ - - /* 227 0xe3 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x00, /* 00000000 */ - - /* 228 0xe4 '' */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - - /* 229 0xe5 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0x70, /* 01110000 */ - 0x00, /* 00000000 */ - - /* 230 0xe6 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x7c, /* 01111100 */ - 0xc0, /* 11000000 */ - - /* 231 0xe7 '' */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - - /* 232 0xe8 '' */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x3c, /* 00111100 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - - /* 233 0xe9 '' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xfe, /* 11111110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - - /* 234 0xea '' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0xee, /* 11101110 */ - 0x00, /* 00000000 */ - - /* 235 0xeb '' */ - 0x0e, /* 00001110 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x3e, /* 00111110 */ - 0x66, /* 01100110 */ - 0x66, /* 01100110 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - - /* 236 0xec '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 237 0xed '' */ - 0x06, /* 00000110 */ - 0x0c, /* 00001100 */ - 0x7e, /* 01111110 */ - 0xdb, /* 11011011 */ - 0xdb, /* 11011011 */ - 0x7e, /* 01111110 */ - 0x60, /* 01100000 */ - 0xc0, /* 11000000 */ - - /* 238 0xee '' */ - 0x1e, /* 00011110 */ - 0x30, /* 00110000 */ - 0x60, /* 01100000 */ - 0x7e, /* 01111110 */ - 0x60, /* 01100000 */ - 0x30, /* 00110000 */ - 0x1e, /* 00011110 */ - 0x00, /* 00000000 */ - - /* 239 0xef '' */ - 0x00, /* 00000000 */ - 0x7c, /* 01111100 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0xc6, /* 11000110 */ - 0x00, /* 00000000 */ - - /* 240 0xf0 '' */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0xfe, /* 11111110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 241 0xf1 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x7e, /* 01111110 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 242 0xf2 '' */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 243 0xf3 '' */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x18, /* 00011000 */ - 0x0c, /* 00001100 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - - /* 244 0xf4 '' */ - 0x0e, /* 00001110 */ - 0x1b, /* 00011011 */ - 0x1b, /* 00011011 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - - /* 245 0xf5 '' */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0xd8, /* 11011000 */ - 0xd8, /* 11011000 */ - 0x70, /* 01110000 */ - - /* 246 0xf6 '' */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x7e, /* 01111110 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 247 0xf7 '' */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0x76, /* 01110110 */ - 0xdc, /* 11011100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 248 0xf8 '' */ - 0x38, /* 00111000 */ - 0x6c, /* 01101100 */ - 0x6c, /* 01101100 */ - 0x38, /* 00111000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 249 0xf9 '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 250 0xfa '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x18, /* 00011000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 251 0xfb '' */ - 0x0f, /* 00001111 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0x0c, /* 00001100 */ - 0xec, /* 11101100 */ - 0x6c, /* 01101100 */ - 0x3c, /* 00111100 */ - 0x1c, /* 00011100 */ - - /* 252 0xfc '' */ - 0x6c, /* 01101100 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x36, /* 00110110 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 253 0xfd '' */ - 0x78, /* 01111000 */ - 0x0c, /* 00001100 */ - 0x18, /* 00011000 */ - 0x30, /* 00110000 */ - 0x7c, /* 01111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 254 0xfe '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x3c, /* 00111100 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - - /* 255 0xff '' */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - 0x00, /* 00000000 */ - -}; diff --git a/other/wiringpi/wiringPi-96344ff/devLib/gertboard.c b/other/wiringpi/wiringPi-96344ff/devLib/gertboard.c deleted file mode 100644 index 6a8441576..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/gertboard.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * gertboard.c: - * Access routines for the SPI devices on the Gertboard - * Copyright (c) 2012 Gordon Henderson - * - * The Gertboard has: - * - * An MCP3002 dual-channel A to D convertor connected - * to the SPI bus, selected by chip-select A, and: - * - * An MCP4802 dual-channel D to A convertor connected - * to the SPI bus, selected via chip-select B. - * - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -#include -#include -#include -#include -#include - -#include -#include - -#include "gertboard.h" - -// The A-D convertor won't run at more than 1MHz @ 3.3v - -#define SPI_ADC_SPEED 1000000 -#define SPI_DAC_SPEED 1000000 -#define SPI_A2D 0 -#define SPI_D2A 1 - - -/* - * gertboardAnalogWrite: - * Write an 8-bit data value to the MCP4802 Analog to digital - * convertor on the Gertboard. - ********************************************************************************* - */ - -void gertboardAnalogWrite (const int chan, const int value) -{ - uint8_t spiData [2] ; - uint8_t chanBits, dataBits ; - - if (chan == 0) - chanBits = 0x30 ; - else - chanBits = 0xB0 ; - - chanBits |= ((value >> 4) & 0x0F) ; - dataBits = ((value << 4) & 0xF0) ; - - spiData [0] = chanBits ; - spiData [1] = dataBits ; - - wiringPiSPIDataRW (SPI_D2A, spiData, 2) ; -} - - -/* - * gertboardAnalogRead: - * Return the analog value of the given channel (0/1). - * The A/D is a 10-bit device - ********************************************************************************* - */ - -int gertboardAnalogRead (const int chan) -{ - uint8_t spiData [2] ; - - uint8_t chanBits ; - - if (chan == 0) - chanBits = 0b11010000 ; - else - chanBits = 0b11110000 ; - - spiData [0] = chanBits ; - spiData [1] = 0 ; - - wiringPiSPIDataRW (SPI_A2D, spiData, 2) ; - - return ((spiData [0] << 8) | (spiData [1] >> 1)) & 0x3FF ; -} - - -/* - * gertboardSPISetup: - * Initialise the SPI bus, etc. - ********************************************************************************* - */ - -int gertboardSPISetup (void) -{ - if (wiringPiSPISetup (SPI_A2D, SPI_ADC_SPEED) < 0) - return -1 ; - - if (wiringPiSPISetup (SPI_D2A, SPI_DAC_SPEED) < 0) - return -1 ; - - return 0 ; -} - - -/* - * New wiringPi node extension methods. - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, const int chan) -{ - return gertboardAnalogRead (chan - node->pinBase) ; -} - -static void myAnalogWrite (struct wiringPiNodeStruct *node, const int chan, const int value) -{ - gertboardAnalogWrite (chan - node->pinBase, value) ; -} - - -/* - * gertboardAnalogSetup: - * Create a new wiringPi device node for the analog devices on the - * Gertboard. We create one node with 2 pins - each pin being read - * and write - although the operations actually go to different - * hardware devices. - ********************************************************************************* - */ - -int gertboardAnalogSetup (const int pinBase) -{ - struct wiringPiNodeStruct *node ; - int x ; - - if (( x = gertboardSPISetup ()) != 0) - return x; - - node = wiringPiNewNode (pinBase, 2) ; - node->analogRead = myAnalogRead ; - node->analogWrite = myAnalogWrite ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/gertboard.h b/other/wiringpi/wiringPi-96344ff/devLib/gertboard.h deleted file mode 100644 index 3fa191974..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/gertboard.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * gertboard.h: - * Access routines for the SPI devices on the Gertboard - * Copyright (c) 2012 Gordon Henderson - * - * The Gertboard has an MCP4802 dual-channel D to A convertor - * connected to the SPI bus, selected via chip-select B. - * - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -// Old routines - -extern void gertboardAnalogWrite (const int chan, const int value) ; -extern int gertboardAnalogRead (const int chan) ; -extern int gertboardSPISetup (void) ; - -// New - -extern int gertboardAnalogSetup (const int pinBase) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/lcd.c b/other/wiringpi/wiringPi-96344ff/devLib/lcd.c deleted file mode 100644 index 6c0e47494..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/lcd.c +++ /dev/null @@ -1,495 +0,0 @@ -/* - * lcd.c: - * Text-based LCD driver. - * This is designed to drive the parallel interface LCD drivers - * based in the Hitachi HD44780U controller and compatables. - * - * Copyright (c) 2012 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include - -#include "lcd.h" - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -// HD44780U Commands - -#define LCD_CLEAR 0x01 -#define LCD_HOME 0x02 -#define LCD_ENTRY 0x04 -#define LCD_CTRL 0x08 -#define LCD_CDSHIFT 0x10 -#define LCD_FUNC 0x20 -#define LCD_CGRAM 0x40 -#define LCD_DGRAM 0x80 - -// Bits in the entry register - -#define LCD_ENTRY_SH 0x01 -#define LCD_ENTRY_ID 0x02 - -// Bits in the control register - -#define LCD_BLINK_CTRL 0x01 -#define LCD_CURSOR_CTRL 0x02 -#define LCD_DISPLAY_CTRL 0x04 - -// Bits in the function register - -#define LCD_FUNC_F 0x04 -#define LCD_FUNC_N 0x08 -#define LCD_FUNC_DL 0x10 - -#define LCD_CDSHIFT_RL 0x04 - -struct lcdDataStruct -{ - int bits, rows, cols ; - int rsPin, strbPin ; - int dataPins [8] ; - int cx, cy ; -} ; - -struct lcdDataStruct *lcds [MAX_LCDS] ; - -static int lcdControl ; - -// Row offsets - -static const int rowOff [4] = { 0x00, 0x40, 0x14, 0x54 } ; - - -/* - * strobe: - * Toggle the strobe (Really the "E") pin to the device. - * According to the docs, data is latched on the falling edge. - ********************************************************************************* - */ - -static void strobe (const struct lcdDataStruct *lcd) -{ - -// Note timing changes for new version of delayMicroseconds () - - digitalWrite (lcd->strbPin, 1) ; delayMicroseconds (50) ; - digitalWrite (lcd->strbPin, 0) ; delayMicroseconds (50) ; -} - - -/* - * sentDataCmd: - * Send an data or command byte to the display. - ********************************************************************************* - */ - -static void sendDataCmd (const struct lcdDataStruct *lcd, unsigned char data) -{ - register unsigned char myData = data ; - unsigned char i, d4 ; - - if (lcd->bits == 4) - { - d4 = (myData >> 4) & 0x0F; - for (i = 0 ; i < 4 ; ++i) - { - digitalWrite (lcd->dataPins [i], (d4 & 1)) ; - d4 >>= 1 ; - } - strobe (lcd) ; - - d4 = myData & 0x0F ; - for (i = 0 ; i < 4 ; ++i) - { - digitalWrite (lcd->dataPins [i], (d4 & 1)) ; - d4 >>= 1 ; - } - } - else - { - for (i = 0 ; i < 8 ; ++i) - { - digitalWrite (lcd->dataPins [i], (myData & 1)) ; - myData >>= 1 ; - } - } - strobe (lcd) ; -} - - -/* - * putCommand: - * Send a command byte to the display - ********************************************************************************* - */ - -static void putCommand (const struct lcdDataStruct *lcd, unsigned char command) -{ - digitalWrite (lcd->rsPin, 0) ; - sendDataCmd (lcd, command) ; - delay (2) ; -} - -static void put4Command (const struct lcdDataStruct *lcd, unsigned char command) -{ - register unsigned char myCommand = command ; - register unsigned char i ; - - digitalWrite (lcd->rsPin, 0) ; - - for (i = 0 ; i < 4 ; ++i) - { - digitalWrite (lcd->dataPins [i], (myCommand & 1)) ; - myCommand >>= 1 ; - } - strobe (lcd) ; -} - - -/* - ********************************************************************************* - * User Callable code below here - ********************************************************************************* - */ - -/* - * lcdHome: lcdClear: - * Home the cursor or clear the screen. - ********************************************************************************* - */ - -void lcdHome (const int fd) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - putCommand (lcd, LCD_HOME) ; - lcd->cx = lcd->cy = 0 ; - delay (5) ; -} - -void lcdClear (const int fd) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - putCommand (lcd, LCD_CLEAR) ; - putCommand (lcd, LCD_HOME) ; - lcd->cx = lcd->cy = 0 ; - delay (5) ; -} - - -/* - * lcdDisplay: lcdCursor: lcdCursorBlink: - * Turn the display, cursor, cursor blinking on/off - ********************************************************************************* - */ - -void lcdDisplay (const int fd, int state) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - if (state) - lcdControl |= LCD_DISPLAY_CTRL ; - else - lcdControl &= ~LCD_DISPLAY_CTRL ; - - putCommand (lcd, LCD_CTRL | lcdControl) ; -} - -void lcdCursor (const int fd, int state) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - if (state) - lcdControl |= LCD_CURSOR_CTRL ; - else - lcdControl &= ~LCD_CURSOR_CTRL ; - - putCommand (lcd, LCD_CTRL | lcdControl) ; -} - -void lcdCursorBlink (const int fd, int state) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - if (state) - lcdControl |= LCD_BLINK_CTRL ; - else - lcdControl &= ~LCD_BLINK_CTRL ; - - putCommand (lcd, LCD_CTRL | lcdControl) ; -} - - -/* - * lcdSendCommand: - * Send any arbitary command to the display - ********************************************************************************* - */ - -void lcdSendCommand (const int fd, unsigned char command) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - putCommand (lcd, command) ; -} - - -/* - * lcdPosition: - * Update the position of the cursor on the display. - * Ignore invalid locations. - ********************************************************************************* - */ - -void lcdPosition (const int fd, int x, int y) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - if ((x > lcd->cols) || (x < 0)) - return ; - if ((y > lcd->rows) || (y < 0)) - return ; - - putCommand (lcd, x + (LCD_DGRAM | rowOff [y])) ; - - lcd->cx = x ; - lcd->cy = y ; -} - - -/* - * lcdCharDef: - * Defines a new character in the CGRAM - ********************************************************************************* - */ - -void lcdCharDef (const int fd, int index, unsigned char data [8]) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - int i ; - - putCommand (lcd, LCD_CGRAM | ((index & 7) << 3)) ; - - digitalWrite (lcd->rsPin, 1) ; - for (i = 0 ; i < 8 ; ++i) - sendDataCmd (lcd, data [i]) ; -} - - -/* - * lcdPutchar: - * Send a data byte to be displayed on the display. We implement a very - * simple terminal here - with line wrapping, but no scrolling. Yet. - ********************************************************************************* - */ - -void lcdPutchar (const int fd, unsigned char data) -{ - struct lcdDataStruct *lcd = lcds [fd] ; - - digitalWrite (lcd->rsPin, 1) ; - sendDataCmd (lcd, data) ; - - if (++lcd->cx == lcd->cols) - { - lcd->cx = 0 ; - if (++lcd->cy == lcd->rows) - lcd->cy = 0 ; - - putCommand (lcd, lcd->cx + (LCD_DGRAM | rowOff [lcd->cy])) ; - } -} - - -/* - * lcdPuts: - * Send a string to be displayed on the display - ********************************************************************************* - */ - -void lcdPuts (const int fd, const char *string) -{ - while (*string) - lcdPutchar (fd, *string++) ; -} - - -/* - * lcdPrintf: - * Printf to an LCD display - ********************************************************************************* - */ - -void lcdPrintf (const int fd, const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - lcdPuts (fd, buffer) ; -} - - -/* - * lcdInit: - * Take a lot of parameters and initialise the LCD, and return a handle to - * that LCD, or -1 if any error. - ********************************************************************************* - */ - -int lcdInit (const int rows, const int cols, const int bits, - const int rs, const int strb, - const int d0, const int d1, const int d2, const int d3, const int d4, - const int d5, const int d6, const int d7) -{ - static int initialised = 0 ; - - unsigned char func ; - int i ; - int lcdFd = -1 ; - struct lcdDataStruct *lcd ; - - if (initialised == 0) - { - initialised = 1 ; - for (i = 0 ; i < MAX_LCDS ; ++i) - lcds [i] = NULL ; - } - -// Simple sanity checks - - if (! ((bits == 4) || (bits == 8))) - return -1 ; - - if ((rows < 0) || (rows > 20)) - return -1 ; - - if ((cols < 0) || (cols > 20)) - return -1 ; - -// Create a new LCD: - - for (i = 0 ; i < MAX_LCDS ; ++i) - { - if (lcds [i] == NULL) - { - lcdFd = i ; - break ; - } - } - - if (lcdFd == -1) - return -1 ; - - lcd = (struct lcdDataStruct *)malloc (sizeof (struct lcdDataStruct)) ; - if (lcd == NULL) - return -1 ; - - lcd->rsPin = rs ; - lcd->strbPin = strb ; - lcd->bits = 8 ; // For now - we'll set it properly later. - lcd->rows = rows ; - lcd->cols = cols ; - lcd->cx = 0 ; - lcd->cy = 0 ; - - lcd->dataPins [0] = d0 ; - lcd->dataPins [1] = d1 ; - lcd->dataPins [2] = d2 ; - lcd->dataPins [3] = d3 ; - lcd->dataPins [4] = d4 ; - lcd->dataPins [5] = d5 ; - lcd->dataPins [6] = d6 ; - lcd->dataPins [7] = d7 ; - - lcds [lcdFd] = lcd ; - - digitalWrite (lcd->rsPin, 0) ; pinMode (lcd->rsPin, OUTPUT) ; - digitalWrite (lcd->strbPin, 0) ; pinMode (lcd->strbPin, OUTPUT) ; - - for (i = 0 ; i < bits ; ++i) - { - digitalWrite (lcd->dataPins [i], 0) ; - pinMode (lcd->dataPins [i], OUTPUT) ; - } - delay (35) ; // mS - - -// 4-bit mode? -// OK. This is a PIG and it's not at all obvious from the documentation I had, -// so I guess some others have worked through either with better documentation -// or more trial and error... Anyway here goes: -// -// It seems that the controller needs to see the FUNC command at least 3 times -// consecutively - in 8-bit mode. If you're only using 8-bit mode, then it appears -// that you can get away with one func-set, however I'd not rely on it... -// -// So to set 4-bit mode, you need to send the commands one nibble at a time, -// the same three times, but send the command to set it into 8-bit mode those -// three times, then send a final 4th command to set it into 4-bit mode, and only -// then can you flip the switch for the rest of the library to work in 4-bit -// mode which sends the commands as 2 x 4-bit values. - - if (bits == 4) - { - func = LCD_FUNC | LCD_FUNC_DL ; // Set 8-bit mode 3 times - put4Command (lcd, func >> 4) ; delay (35) ; - put4Command (lcd, func >> 4) ; delay (35) ; - put4Command (lcd, func >> 4) ; delay (35) ; - func = LCD_FUNC ; // 4th set: 4-bit mode - put4Command (lcd, func >> 4) ; delay (35) ; - lcd->bits = 4 ; - } - else - { - func = LCD_FUNC | LCD_FUNC_DL ; - putCommand (lcd, func ) ; delay (35) ; - putCommand (lcd, func ) ; delay (35) ; - putCommand (lcd, func ) ; delay (35) ; - } - - if (lcd->rows > 1) - { - func |= LCD_FUNC_N ; - putCommand (lcd, func) ; delay (35) ; - } - -// Rest of the initialisation sequence - - lcdDisplay (lcdFd, TRUE) ; - lcdCursor (lcdFd, FALSE) ; - lcdCursorBlink (lcdFd, FALSE) ; - lcdClear (lcdFd) ; - - putCommand (lcd, LCD_ENTRY | LCD_ENTRY_ID) ; - putCommand (lcd, LCD_CDSHIFT | LCD_CDSHIFT_RL) ; - - return lcdFd ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/lcd.h b/other/wiringpi/wiringPi-96344ff/devLib/lcd.h deleted file mode 100644 index 0a0e5988c..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/lcd.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * lcd.h: - * Text-based LCD driver. - * This is designed to drive the parallel interface LCD drivers - * based in the Hitachi HD44780U controller and compatables. - * - * Copyright (c) 2012 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#define MAX_LCDS 8 - -#ifdef __cplusplus -extern "C" { -#endif - -extern void lcdHome (const int fd) ; -extern void lcdClear (const int fd) ; -extern void lcdDisplay (const int fd, int state) ; -extern void lcdCursor (const int fd, int state) ; -extern void lcdCursorBlink (const int fd, int state) ; -extern void lcdSendCommand (const int fd, unsigned char command) ; -extern void lcdPosition (const int fd, int x, int y) ; -extern void lcdCharDef (const int fd, int index, unsigned char data [8]) ; -extern void lcdPutchar (const int fd, unsigned char data) ; -extern void lcdPuts (const int fd, const char *string) ; -extern void lcdPrintf (const int fd, const char *message, ...) ; - -extern int lcdInit (const int rows, const int cols, const int bits, - const int rs, const int strb, - const int d0, const int d1, const int d2, const int d3, const int d4, - const int d5, const int d6, const int d7) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/lcd128x64.c b/other/wiringpi/wiringPi-96344ff/devLib/lcd128x64.c deleted file mode 100644 index accd5c3a7..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/lcd128x64.c +++ /dev/null @@ -1,673 +0,0 @@ -/* - * lcd128x64.c: - * Graphics-based LCD driver. - * This is designed to drive the parallel interface LCD drivers - * based on the generic 12864H chips - * - * There are many variations on these chips, however they all mostly - * seem to be similar. - * This implementation has the Pins from the Pi hard-wired into it, - * in particular wiringPi pins 0-7 so that we can use - * digitalWriteByete() to speed things up somewhat. - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -#include - -#include "font.h" -#include "lcd128x64.h" - -// Size - -#define LCD_WIDTH 128 -#define LCD_HEIGHT 64 - -// Hardware Pins -// Note pins 0-7 are the 8-bit data port - -#define CS1 10 -#define CS2 11 -#define STROBE 12 -#define RS 13 - -// Software copy of the framebuffer -// it's 8-bit deep although the display itself is only 1-bit deep. - -static unsigned char frameBuffer [LCD_WIDTH * LCD_HEIGHT] ; - -static int maxX, maxY ; -static int lastX, lastY ; -static int xOrigin, yOrigin ; -static int lcdOrientation = 0 ; - -/* - * strobe: - * Toggle the strobe (Really the "E") pin to the device. - * According to the docs, data is latched on the falling edge. - ********************************************************************************* - */ - -static void strobe (void) -{ - digitalWrite (STROBE, 1) ; delayMicroseconds (1) ; - digitalWrite (STROBE, 0) ; delayMicroseconds (5) ; -} - - -/* - * sentData: - * Send an data or command byte to the display. - ********************************************************************************* - */ - -static void sendData (const int data, const int chip) -{ - digitalWrite (chip, 0) ; - digitalWriteByte (data) ; - strobe () ; - digitalWrite (chip, 1) ; -} - - -/* - * sendCommand: - * Send a command byte to the display - ********************************************************************************* - */ - -static void sendCommand (const int command, const int chip) -{ - digitalWrite (RS, 0) ; - sendData (command, chip) ; - digitalWrite (RS, 1) ; -} - - -/* - * setCol: SetLine: - * Set the column and line addresses - ********************************************************************************* - */ - -static void setCol (int col, const int chip) - { sendCommand (0x40 | (col & 0x3F), chip) ; } - -static void setLine (int line, const int chip) - { sendCommand (0xB8 | (line & 0x07), chip) ; } - - -/* - * lcd128x64update: - * Copy our software version to the real display - ********************************************************************************* - */ - -void lcd128x64update (void) -{ - int line, x, y, fbLoc ; - unsigned char byte ; - -// Left side - - for (line = 0 ; line < 8 ; ++line) - { - setCol (0, CS1) ; - setLine (line, CS1) ; - - for (x = 63 ; x >= 0 ; --x) - { - byte = 0 ; - for (y = 0 ; y < 8 ; ++y) - { - fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ; - if (frameBuffer [fbLoc] != 0) - byte |= (1 << y) ; - } - sendData (byte, CS1) ; - } - } - -// Right side - - for (line = 0 ; line < 8 ; ++line) - { - setCol (0, CS2) ; - setLine (line, CS2) ; - - for (x = 127 ; x >= 64 ; --x) - { - byte = 0 ; - for (y = 0 ; y < 8 ; ++y) - { - fbLoc = x + (((7 - line) * 8) + (7 - y)) * LCD_WIDTH ; - if (frameBuffer [fbLoc] != 0) - byte |= (1 << y) ; - } - sendData (byte, CS2) ; - } - } -} - - -/* - * lcd128x64setOrigin: - * Set the display offset origin - ********************************************************************************* - */ - -void lcd128x64setOrigin (int x, int y) -{ - xOrigin = x ; - yOrigin = y ; -} - - -/* - * lcd128x64setOrientation: - * Set the display orientation: - * 0: Normal, the display is portrait mode, 0,0 is top left - * 1: Landscape - * 2: Portrait, flipped - * 3: Landscape, flipped - ********************************************************************************* - */ - -void lcd128x64setOrientation (int orientation) -{ - lcdOrientation = orientation & 3 ; - - lcd128x64setOrigin (0,0) ; - - switch (lcdOrientation) - { - case 0: - maxX = LCD_WIDTH ; - maxY = LCD_HEIGHT ; - break ; - - case 1: - maxX = LCD_HEIGHT ; - maxY = LCD_WIDTH ; - break ; - - case 2: - maxX = LCD_WIDTH ; - maxY = LCD_HEIGHT ; - break ; - - case 3: - maxX = LCD_HEIGHT ; - maxY = LCD_WIDTH ; - break ; - } -} - - -/* - * lcd128x64orientCoordinates: - * Adjust the coordinates given to the display orientation - ********************************************************************************* - */ - -void lcd128x64orientCoordinates (int *x, int *y) -{ - register int tmp ; - - *x += xOrigin ; - *y += yOrigin ; - *y = maxY - *y - 1 ; - - switch (lcdOrientation) - { - case 0: - break; - - case 1: - tmp = maxY - *y - 1 ; - *y = *x ; - *x = tmp ; - break; - - case 2: - *x = maxX - *x - 1 ; - *y = maxY - *y - 1 ; - break; - - case 3: - *x = maxX - *x - 1 ; - tmp = *y ; - *y = *x ; - *x = tmp ; - break ; - } -} - - -/* - * lcd128x64getScreenSize: - * Return the max X & Y screen sizes. Needs to be called again, if you - * change screen orientation. - ********************************************************************************* - */ - -void lcd128x64getScreenSize (int *x, int *y) -{ - *x = maxX ; - *y = maxY ; -} - - -/* - ********************************************************************************* - * Standard Graphical Functions - ********************************************************************************* - */ - - -/* - * lcd128x64point: - * Plot a pixel. - ********************************************************************************* - */ - -void lcd128x64point (int x, int y, int colour) -{ - lastX = x ; - lastY = y ; - - lcd128x64orientCoordinates (&x, &y) ; - - if ((x < 0) || (x >= LCD_WIDTH) || (y < 0) || (y >= LCD_HEIGHT)) - return ; - - frameBuffer [x + y * LCD_WIDTH] = colour ; -} - - -/* - * lcd128x64line: lcd128x64lineTo: - * Classic Bressenham Line code - ********************************************************************************* - */ - -void lcd128x64line (int x0, int y0, int x1, int y1, int colour) -{ - int dx, dy ; - int sx, sy ; - int err, e2 ; - - lastX = x1 ; - lastY = y1 ; - - dx = abs (x1 - x0) ; - dy = abs (y1 - y0) ; - - sx = (x0 < x1) ? 1 : -1 ; - sy = (y0 < y1) ? 1 : -1 ; - - err = dx - dy ; - - for (;;) - { - lcd128x64point (x0, y0, colour) ; - - if ((x0 == x1) && (y0 == y1)) - break ; - - e2 = 2 * err ; - - if (e2 > -dy) - { - err -= dy ; - x0 += sx ; - } - - if (e2 < dx) - { - err += dx ; - y0 += sy ; - } - } - -} - -void lcd128x64lineTo (int x, int y, int colour) -{ - lcd128x64line (lastX, lastY, x, y, colour) ; -} - - -/* - * lcd128x64rectangle: - * A rectangle is a spoilt days fishing - ********************************************************************************* - */ - -void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) -{ - register int x ; - - if (filled) - { - /**/ if (x1 == x2) - lcd128x64line (x1, y1, x2, y2, colour) ; - else if (x1 < x2) - for (x = x1 ; x <= x2 ; ++x) - lcd128x64line (x, y1, x, y2, colour) ; - else - for (x = x2 ; x <= x1 ; ++x) - lcd128x64line (x, y1, x, y2, colour) ; - } - else - { - lcd128x64line (x1, y1, x2, y1, colour) ; - lcd128x64lineTo (x2, y2, colour) ; - lcd128x64lineTo (x1, y2, colour) ; - lcd128x64lineTo (x1, y1, colour) ; - } -} - - -/* - * lcd128x64circle: - * This is the midpoint circle algorithm. - ********************************************************************************* - */ - -void lcd128x64circle (int x, int y, int r, int colour, int filled) -{ - int ddF_x = 1 ; - int ddF_y = -2 * r ; - - int f = 1 - r ; - int x1 = 0 ; - int y1 = r ; - - if (filled) - { - lcd128x64line (x, y + r, x, y - r, colour) ; - lcd128x64line (x + r, y, x - r, y, colour) ; - } - else - { - lcd128x64point (x, y + r, colour) ; - lcd128x64point (x, y - r, colour) ; - lcd128x64point (x + r, y, colour) ; - lcd128x64point (x - r, y, colour) ; - } - - while (x1 < y1) - { - if (f >= 0) - { - y1-- ; - ddF_y += 2 ; - f += ddF_y ; - } - x1++ ; - ddF_x += 2 ; - f += ddF_x ; - if (filled) - { - lcd128x64line (x + x1, y + y1, x - x1, y + y1, colour) ; - lcd128x64line (x + x1, y - y1, x - x1, y - y1, colour) ; - lcd128x64line (x + y1, y + x1, x - y1, y + x1, colour) ; - lcd128x64line (x + y1, y - x1, x - y1, y - x1, colour) ; - } - else - { - lcd128x64point (x + x1, y + y1, colour) ; lcd128x64point (x - x1, y + y1, colour) ; - lcd128x64point (x + x1, y - y1, colour) ; lcd128x64point (x - x1, y - y1, colour) ; - lcd128x64point (x + y1, y + x1, colour) ; lcd128x64point (x - y1, y + x1, colour) ; - lcd128x64point (x + y1, y - x1, colour) ; lcd128x64point (x - y1, y - x1, colour) ; - } - } -} - - -/* - * lcd128x64ellipse: - * Fast ellipse drawing algorithm by - * John Kennedy - * Mathematics Department - * Santa Monica College - * 1900 Pico Blvd. - * Santa Monica, CA 90405 - * jrkennedy6@gmail.com - * -Confirned in email this algorithm is in the public domain -GH- - ********************************************************************************* - */ - -static void plot4ellipsePoints (int cx, int cy, int x, int y, int colour, int filled) -{ - if (filled) - { - lcd128x64line (cx + x, cy + y, cx - x, cy + y, colour) ; - lcd128x64line (cx - x, cy - y, cx + x, cy - y, colour) ; - } - else - { - lcd128x64point (cx + x, cy + y, colour) ; - lcd128x64point (cx - x, cy + y, colour) ; - lcd128x64point (cx - x, cy - y, colour) ; - lcd128x64point (cx + x, cy - y, colour) ; - } -} - -void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) -{ - int x, y ; - int xChange, yChange, ellipseError ; - int twoAsquare, twoBsquare ; - int stoppingX, stoppingY ; - - twoAsquare = 2 * xRadius * xRadius ; - twoBsquare = 2 * yRadius * yRadius ; - - x = xRadius ; - y = 0 ; - - xChange = yRadius * yRadius * (1 - 2 * xRadius) ; - yChange = xRadius * xRadius ; - - ellipseError = 0 ; - stoppingX = twoBsquare * xRadius ; - stoppingY = 0 ; - - while (stoppingX >= stoppingY) // 1st set of points - { - plot4ellipsePoints (cx, cy, x, y, colour, filled) ; - ++y ; - stoppingY += twoAsquare ; - ellipseError += yChange ; - yChange += twoAsquare ; - - if ((2 * ellipseError + xChange) > 0 ) - { - --x ; - stoppingX -= twoBsquare ; - ellipseError += xChange ; - xChange += twoBsquare ; - } - } - - x = 0 ; - y = yRadius ; - - xChange = yRadius * yRadius ; - yChange = xRadius * xRadius * (1 - 2 * yRadius) ; - - ellipseError = 0 ; - stoppingX = 0 ; - stoppingY = twoAsquare * yRadius ; - - while (stoppingX <= stoppingY) //2nd set of points - { - plot4ellipsePoints (cx, cy, x, y, colour, filled) ; - ++x ; - stoppingX += twoBsquare ; - ellipseError += xChange ; - xChange += twoBsquare ; - - if ((2 * ellipseError + yChange) > 0 ) - { - --y ; - stoppingY -= twoAsquare ; - ellipseError += yChange ; - yChange += twoAsquare ; - } - } -} - - -/* - * lcd128x64putchar: - * Print a single character to the screen - ********************************************************************************* - */ - -void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) -{ - int y1, y2 ; - - unsigned char line ; - unsigned char *fontPtr ; - -// Can't print if we're offscreen - -//if ((x < 0) || (x >= (maxX - fontWidth)) || (y < 0) || (y >= (maxY - fontHeight))) -// return ; - - fontPtr = font + c * fontHeight ; - - for (y1 = fontHeight - 1 ; y1 >= 0 ; --y1) - { - y2 = y + y1 ; - line = *fontPtr++ ; - lcd128x64point (x + 0, y2, (line & 0x80) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 1, y2, (line & 0x40) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 2, y2, (line & 0x20) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 3, y2, (line & 0x10) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 4, y2, (line & 0x08) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 5, y2, (line & 0x04) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 6, y2, (line & 0x02) == 0 ? bgCol : fgCol) ; - lcd128x64point (x + 7, y2, (line & 0x01) == 0 ? bgCol : fgCol) ; - } -} - - -/* - * lcd128x64puts: - * Send a string to the display. Obeys \n and \r formatting - ********************************************************************************* - */ - -void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) -{ - int c, mx, my ; - - mx = x ; my = y ; - - while (*str) - { - c = *str++ ; - - if (c == '\r') - { - mx = x ; - continue ; - } - - if (c == '\n') - { - mx = x ; - my -= fontHeight ; - continue ; - } - - lcd128x64putchar (mx, my, c, bgCol, fgCol) ; - - mx += fontWidth ; - if (mx >= (maxX - fontWidth)) - { - mx = 0 ; - my -= fontHeight ; - } - } -} - - -/* - * lcd128x64clear: - * Clear the display to the given colour. - ********************************************************************************* - */ - -void lcd128x64clear (int colour) -{ - register int i ; - register unsigned char *ptr = frameBuffer ; - - for (i = 0 ; i < (maxX * maxY) ; ++i) - *ptr++ = colour ; -} - - - - -/* - * lcd128x64setup: - * Initialise the display and GPIO. - ********************************************************************************* - */ - -int lcd128x64setup (void) -{ - int i ; - - for (i = 0 ; i < 8 ; ++i) - pinMode (i, OUTPUT) ; - - digitalWrite (CS1, 1) ; - digitalWrite (CS2, 1) ; - digitalWrite (STROBE, 0) ; - digitalWrite (RS, 1) ; - - pinMode (CS1, OUTPUT) ; - pinMode (CS2, OUTPUT) ; - pinMode (STROBE, OUTPUT) ; - pinMode (RS, OUTPUT) ; - - sendCommand (0x3F, CS1) ; // Display ON - sendCommand (0xC0, CS1) ; // Set display start line to 0 - - sendCommand (0x3F, CS2) ; // Display ON - sendCommand (0xC0, CS2) ; // Set display start line to 0 - - lcd128x64clear (0) ; - lcd128x64setOrientation (0) ; - lcd128x64update () ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/lcd128x64.h b/other/wiringpi/wiringPi-96344ff/devLib/lcd128x64.h deleted file mode 100644 index b448bbc83..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/lcd128x64.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * lcd128x64.h: - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -extern void lcd128x64setOrigin (int x, int y) ; -extern void lcd128x64setOrientation (int orientation) ; -extern void lcd128x64orientCoordinates (int *x, int *y) ; -extern void lcd128x64getScreenSize (int *x, int *y) ; -extern void lcd128x64point (int x, int y, int colour) ; -extern void lcd128x64line (int x0, int y0, int x1, int y1, int colour) ; -extern void lcd128x64lineTo (int x, int y, int colour) ; -extern void lcd128x64rectangle (int x1, int y1, int x2, int y2, int colour, int filled) ; -extern void lcd128x64circle (int x, int y, int r, int colour, int filled) ; -extern void lcd128x64ellipse (int cx, int cy, int xRadius, int yRadius, int colour, int filled) ; -extern void lcd128x64putchar (int x, int y, int c, int bgCol, int fgCol) ; -extern void lcd128x64puts (int x, int y, const char *str, int bgCol, int fgCol) ; -extern void lcd128x64update (void) ; -extern void lcd128x64clear (int colour) ; - -extern int lcd128x64setup (void) ; diff --git a/other/wiringpi/wiringPi-96344ff/devLib/maxdetect.c b/other/wiringpi/wiringPi-96344ff/devLib/maxdetect.c deleted file mode 100755 index 74ff70e9b..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/maxdetect.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * maxdetect.c: - * Driver for the MaxDetect series sensors - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -//#include -//#include - -#include - -#include "maxdetect.h" - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - - -/* - * maxDetectLowHighWait: - * Wait for a transition from low to high on the bus - ********************************************************************************* - */ - -static int maxDetectLowHighWait (const int pin) -{ - struct timeval now, timeOut, timeUp ; - -// If already high then wait for pin to go low - - gettimeofday (&now, NULL) ; - timerclear (&timeOut) ; - timeOut.tv_usec = 1000 ; - timeradd (&now, &timeOut, &timeUp) ; - - while (digitalRead (pin) == HIGH) - { - gettimeofday (&now, NULL) ; - if (timercmp (&now, &timeUp, >)) - return FALSE ; - } - -// Wait for it to go HIGH - - gettimeofday (&now, NULL) ; - timerclear (&timeOut) ; - timeOut.tv_usec = 1000 ; - timeradd (&now, &timeOut, &timeUp) ; - - while (digitalRead (pin) == LOW) - { - gettimeofday (&now, NULL) ; - if (timercmp (&now, &timeUp, >)) - return FALSE ; - } - - return TRUE ; -} - - -/* - * maxDetectClockByte: - * Read in a single byte from the MaxDetect bus - ********************************************************************************* - */ - -static unsigned int maxDetectClockByte (const int pin) -{ - unsigned int byte = 0 ; - int bit ; - - for (bit = 0 ; bit < 8 ; ++bit) - { - if (!maxDetectLowHighWait (pin)) - return 0 ; - -// bit starting now - we need to time it. - - delayMicroseconds (30) ; - byte <<= 1 ; - if (digitalRead (pin) == HIGH) // It's a 1 - byte |= 1 ; - } - - return byte ; -} - - -/* - * maxDetectRead: - * Read in and return the 4 data bytes from the MaxDetect sensor. - * Return TRUE/FALSE depending on the checksum validity - ********************************************************************************* - */ - -int maxDetectRead (const int pin, unsigned char buffer [4]) -{ - int i ; - unsigned int checksum ; - unsigned char localBuf [5] ; - struct timeval now, then, took ; - -// See how long we took - - gettimeofday (&then, NULL) ; - -// Wake up the RHT03 by pulling the data line low, then high -// Low for 10mS, high for 40uS. - - pinMode (pin, OUTPUT) ; - digitalWrite (pin, 0) ; delay (10) ; - digitalWrite (pin, 1) ; delayMicroseconds (40) ; - pinMode (pin, INPUT) ; - -// Now wait for sensor to pull pin low - - if (!maxDetectLowHighWait (pin)) - return FALSE ; - -// and read in 5 bytes (40 bits) - - for (i = 0 ; i < 5 ; ++i) - localBuf [i] = maxDetectClockByte (pin) ; - - checksum = 0 ; - for (i = 0 ; i < 4 ; ++i) - { - buffer [i] = localBuf [i] ; - checksum += localBuf [i] ; - } - checksum &= 0xFF ; - -// See how long we took - - gettimeofday (&now, NULL) ; - timersub (&now, &then, &took) ; - -// Total time to do this should be: -// 10mS + 40µS - reset -// + 80µS + 80µS - sensor doing its low -> high thing -// + 40 * (50µS + 27µS (0) or 70µS (1) ) -// = 15010µS -// so if we take more than that, we've had a scheduling interruption and the -// reading is probably bogus. - - if ((took.tv_sec != 0) || (took.tv_usec > 16000)) - return FALSE ; - - return checksum == localBuf [4] ; -} - - -/* - * readRHT03: - * Read the Temperature & Humidity from an RHT03 sensor - * Values returned are *10, so 123 is 12.3. - ********************************************************************************* - */ - -int readRHT03 (const int pin, int *temp, int *rh) -{ - static struct timeval then ; // will initialise to zero - static int lastTemp = 0 ; - static int lastRh = 0 ; - - int result ; - struct timeval now, timeOut ; - unsigned char buffer [4] ; - -// The data sheets say to not read more than once every 2 seconds, so you -// get the last good reading - - gettimeofday (&now, NULL) ; - if (timercmp (&now, &then, <)) - { - *rh = lastRh ; - *temp = lastTemp ; - return TRUE ; - } - -// Set timeout for next read - - gettimeofday (&now, NULL) ; - timerclear (&timeOut) ; - timeOut.tv_sec = 2 ; - timeradd (&now, &timeOut, &then) ; - -// Read ... - - result = maxDetectRead (pin, buffer) ; - - if (!result) // Try again, but just once - result = maxDetectRead (pin, buffer) ; - - if (!result) - return FALSE ; - - *rh = (buffer [0] * 256 + buffer [1]) ; - *temp = (buffer [2] * 256 + buffer [3]) ; - - if ((*temp & 0x8000) != 0) // Negative - { - *temp &= 0x7FFF ; - *temp = -*temp ; - } - -// Discard obviously bogus readings - the checksum can't detect a 2-bit error -// (which does seem to happen - no realtime here) - - if ((*rh > 999) || (*temp > 800) || (*temp < -400)) - return FALSE ; - - lastRh = *rh ; - lastTemp = *temp ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/maxdetect.h b/other/wiringpi/wiringPi-96344ff/devLib/maxdetect.h deleted file mode 100755 index a1fd742e4..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/maxdetect.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * maxdetect.h: - * Driver for the MaxDetect series sensors - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - - -#ifdef __cplusplus -extern "C" { -#endif - -// Main generic function - -int maxDetectRead (const int pin, unsigned char buffer [4]) ; - -// Individual sensors - -int readRHT03 (const int pin, int *temp, int *rh) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piFace.c b/other/wiringpi/wiringPi-96344ff/devLib/piFace.c deleted file mode 100644 index 4475c7f5b..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piFace.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * piFace.: - * This file to interface with the PiFace peripheral device which - * has an MCP23S17 GPIO device connected via the SPI bus. - * - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -#include -#include - -#include -#include - -#include "piFace.h" - - -/* - * myDigitalWrite: - * Perform the digitalWrite function on the PiFace board - ********************************************************************************* - */ - -void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - digitalWrite (pin + 16, value) ; -} - - -/* - * myDigitalRead: - * Perform the digitalRead function on the PiFace board - * With a slight twist - if we read from base + 8, then we - * read from the output latch... - ********************************************************************************* - */ - -int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - if ((pin - node->pinBase) >= 8) - return digitalRead (pin + 8) ; - else - return digitalRead (pin + 16 + 8) ; -} - - -/* - * myPullUpDnControl: - * Perform the pullUpDnControl function on the PiFace board - ********************************************************************************* - */ - -void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud) -{ - pullUpDnControl (pin + 16 + 8, pud) ; -} - - -/* - * piFaceSetup - * We're going to create an instance of the mcp23s17 here, then - * provide our own read/write routines on-top of it... - * The supplied PiFace code (in Pithon) treats it as an 8-bit device - * where you write the output ports and read the input port using the - * same pin numbers, however I have had a request to be able to read - * the output port, so reading 8..15 will read the output latch. - ********************************************************************************* - */ - -int piFaceSetup (const int pinBase) -{ - int i ; - struct wiringPiNodeStruct *node ; - -// Create an mcp23s17 instance: - - mcp23s17Setup (pinBase + 16, 0, 0) ; - -// Set the direction bits - - for (i = 0 ; i < 8 ; ++i) - { - pinMode (pinBase + 16 + i, OUTPUT) ; // Port A is the outputs - pinMode (pinBase + 16 + 8 + i, INPUT) ; // Port B inputs. - } - - node = wiringPiNewNode (pinBase, 16) ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->pullUpDnControl = myPullUpDnControl ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piFace.h b/other/wiringpi/wiringPi-96344ff/devLib/piFace.h deleted file mode 100644 index 49653144e..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piFace.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * piFace.h: - * Control the PiFace Interface board for the Raspberry Pi - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int piFaceSetup (const int pinBase) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piFaceOld.c b/other/wiringpi/wiringPi-96344ff/devLib/piFaceOld.c deleted file mode 100644 index cadbfe80d..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piFaceOld.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * piFace.: - * Copyright (c) 2012-2016 Gordon Henderson - * - * This file to interface with the PiFace peripheral device which - * has an MCP23S17 GPIO device connected via the SPI bus. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -#include -#include - -#include -#include - -#include "../wiringPi/mcp23x0817.h" - -#include "piFace.h" - -#define PIFACE_SPEED 4000000 -#define PIFACE_DEVNO 0 - - - -/* - * writeByte: - * Write a byte to a register on the MCP23S17 on the SPI bus. - ********************************************************************************* - */ - -static void writeByte (uint8_t reg, uint8_t data) -{ - uint8_t spiData [4] ; - - spiData [0] = CMD_WRITE ; - spiData [1] = reg ; - spiData [2] = data ; - - wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ; -} - -/* - * readByte: - * Read a byte from a register on the MCP23S17 on the SPI bus. - ********************************************************************************* - */ - -static uint8_t readByte (uint8_t reg) -{ - uint8_t spiData [4] ; - - spiData [0] = CMD_READ ; - spiData [1] = reg ; - - wiringPiSPIDataRW (PIFACE_DEVNO, spiData, 3) ; - - return spiData [2] ; -} - - -/* - * myDigitalWrite: - * Perform the digitalWrite function on the PiFace board - ********************************************************************************* - */ - -void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - uint8_t mask, old ; - - pin -= node->pinBase ; - mask = 1 << pin ; - old = readByte (MCP23x17_GPIOA) ; - - if (value == 0) - old &= (~mask) ; - else - old |= mask ; - - writeByte (MCP23x17_GPIOA, old) ; -} - - -/* - * myDigitalRead: - * Perform the digitalRead function on the PiFace board - ********************************************************************************* - */ - -int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - uint8_t mask, reg ; - - mask = 1 << ((pin - node->pinBase) & 7) ; - - if (pin < 8) - reg = MCP23x17_GPIOB ; // Input regsiter - else - reg = MCP23x17_OLATA ; // Output latch regsiter - - if ((readByte (reg) & mask) != 0) - return HIGH ; - else - return LOW ; -} - - -/* - * myPullUpDnControl: - * Perform the pullUpDnControl function on the PiFace board - ********************************************************************************* - */ - -void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int pud) -{ - uint8_t mask, old ; - - mask = 1 << (pin - node->pinBase) ; - old = readByte (MCP23x17_GPPUB) ; - - if (pud == 0) - old &= (~mask) ; - else - old |= mask ; - - writeByte (MCP23x17_GPPUB, old) ; -} - - -/* - * piFaceSetup - * Setup the SPI interface and initialise the MCP23S17 chip - * We create one node with 16 pins - each if the first 8 pins being read - * and write - although the operations actually go to different - * hardware ports. The top 8 let you read the state of the output register. - ********************************************************************************* - */ - -int piFaceSetup (const int pinBase) -{ - int x ; - struct wiringPiNodeStruct *node ; - - if ((x = wiringPiSPISetup (PIFACE_DEVNO, PIFACE_SPEED)) < 0) - return x ; - -// Setup the MCP23S17 - - writeByte (MCP23x17_IOCON, IOCON_INIT) ; - writeByte (MCP23x17_IODIRA, 0x00) ; // Port A -> Outputs - writeByte (MCP23x17_IODIRB, 0xFF) ; // Port B -> Inputs - - node = wiringPiNewNode (pinBase, 16) ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->pullUpDnControl = myPullUpDnControl ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piGlow.c b/other/wiringpi/wiringPi-96344ff/devLib/piGlow.c deleted file mode 100644 index 44e3db8e5..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piGlow.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * piGlow.c: - * Easy access to the Pimoroni PiGlow board. - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -#include "piGlow.h" - -#define PIGLOW_BASE 577 - -static int leg0 [6] = { 6, 7, 8, 5, 4, 9 } ; -static int leg1 [6] = { 17, 16, 15, 13, 11, 10 } ; -static int leg2 [6] = { 0, 1, 2, 3, 14, 12 } ; - - -/* - * piGlow1: - * Light up an individual LED - ********************************************************************************* - */ - -void piGlow1 (const int leg, const int ring, const int intensity) -{ - int *legLeds ; - - if ((leg < 0) || (leg > 2)) return ; - if ((ring < 0) || (ring > 5)) return ; - - /**/ if (leg == 0) - legLeds = leg0 ; - else if (leg == 1) - legLeds = leg1 ; - else - legLeds = leg2 ; - - analogWrite (PIGLOW_BASE + legLeds [ring], intensity) ; -} - -/* - * piGlowLeg: - * Light up all 6 LEDs on a leg - ********************************************************************************* - */ - -void piGlowLeg (const int leg, const int intensity) -{ - int i ; - int *legLeds ; - - if ((leg < 0) || (leg > 2)) - return ; - - /**/ if (leg == 0) - legLeds = leg0 ; - else if (leg == 1) - legLeds = leg1 ; - else - legLeds = leg2 ; - - for (i = 0 ; i < 6 ; ++i) - analogWrite (PIGLOW_BASE + legLeds [i], intensity) ; -} - - -/* - * piGlowRing: - * Light up 3 LEDs in a ring. Ring 0 is the outermost, 5 the innermost - ********************************************************************************* - */ - -void piGlowRing (const int ring, const int intensity) -{ - if ((ring < 0) || (ring > 5)) - return ; - - analogWrite (PIGLOW_BASE + leg0 [ring], intensity) ; - analogWrite (PIGLOW_BASE + leg1 [ring], intensity) ; - analogWrite (PIGLOW_BASE + leg2 [ring], intensity) ; -} - -/* - * piGlowSetup: - * Initialise the board & remember the pins we're using - ********************************************************************************* - */ - -void piGlowSetup (int clear) -{ - sn3218Setup (PIGLOW_BASE) ; - - if (clear) - { - piGlowLeg (0, 0) ; - piGlowLeg (1, 0) ; - piGlowLeg (2, 0) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piGlow.h b/other/wiringpi/wiringPi-96344ff/devLib/piGlow.h deleted file mode 100644 index a4d89d01b..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piGlow.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * piglow.h: - * Easy access to the Pimoroni PiGlow board. - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - - -#define PIGLOW_RED 0 -#define PIGLOW_ORANGE 1 -#define PIGLOW_YELLOW 2 -#define PIGLOW_GREEN 3 -#define PIGLOW_BLUE 4 -#define PIGLOW_WHITE 5 - - -#ifdef __cplusplus -extern "C" { -#endif - -extern void piGlow1 (const int leg, const int ring, const int intensity) ; -extern void piGlowLeg (const int leg, const int intensity) ; -extern void piGlowRing (const int ring, const int intensity) ; -extern void piGlowSetup (int clear) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piNes.c b/other/wiringpi/wiringPi-96344ff/devLib/piNes.c deleted file mode 100644 index a115050e8..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piNes.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * piNes.c: - * Driver for the NES Joystick controller on the Raspberry Pi - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include - -#include "piNes.h" - -#define MAX_NES_JOYSTICKS 8 - -#define NES_RIGHT 0x01 -#define NES_LEFT 0x02 -#define NES_DOWN 0x04 -#define NES_UP 0x08 -#define NES_START 0x10 -#define NES_SELECT 0x20 -#define NES_B 0x40 -#define NES_A 0x80 - - -#define PULSE_TIME 25 - -// Data to store the pins for each controller - -struct nesPinsStruct -{ - unsigned int cPin, dPin, lPin ; -} ; - -static struct nesPinsStruct nesPins [MAX_NES_JOYSTICKS] ; - -static int joysticks = 0 ; - - -/* - * setupNesJoystick: - * Create a new NES joystick interface, program the pins, etc. - ********************************************************************************* - */ - -int setupNesJoystick (int dPin, int cPin, int lPin) -{ - if (joysticks == MAX_NES_JOYSTICKS) - return -1 ; - - nesPins [joysticks].dPin = dPin ; - nesPins [joysticks].cPin = cPin ; - nesPins [joysticks].lPin = lPin ; - - digitalWrite (lPin, LOW) ; - digitalWrite (cPin, LOW) ; - - pinMode (lPin, OUTPUT) ; - pinMode (cPin, OUTPUT) ; - pinMode (dPin, INPUT) ; - - return joysticks++ ; -} - - -/* - * readNesJoystick: - * Do a single scan of the NES Joystick. - ********************************************************************************* - */ - -unsigned int readNesJoystick (int joystick) -{ - unsigned int value = 0 ; - int i ; - - struct nesPinsStruct *pins = &nesPins [joystick] ; - -// Toggle Latch - which presents the first bit - - digitalWrite (pins->lPin, HIGH) ; delayMicroseconds (PULSE_TIME) ; - digitalWrite (pins->lPin, LOW) ; delayMicroseconds (PULSE_TIME) ; - -// Read first bit - - value = digitalRead (pins->dPin) ; - -// Now get the next 7 bits with the clock - - for (i = 0 ; i < 7 ; ++i) - { - digitalWrite (pins->cPin, HIGH) ; delayMicroseconds (PULSE_TIME) ; - digitalWrite (pins->cPin, LOW) ; delayMicroseconds (PULSE_TIME) ; - value = (value << 1) | digitalRead (pins->dPin) ; - } - - return value ^ 0xFF ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/piNes.h b/other/wiringpi/wiringPi-96344ff/devLib/piNes.h deleted file mode 100644 index 897f18159..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/piNes.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * piNes.h: - * Driver for the NES Joystick controller on the Raspberry Pi - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#define MAX_NES_JOYSTICKS 8 - -#define NES_RIGHT 0x01 -#define NES_LEFT 0x02 -#define NES_DOWN 0x04 -#define NES_UP 0x08 -#define NES_START 0x10 -#define NES_SELECT 0x20 -#define NES_B 0x40 -#define NES_A 0x80 - -#ifdef __cplusplus -extern "C" { -#endif - -extern int setupNesJoystick (int dPin, int cPin, int lPin) ; -extern unsigned int readNesJoystick (int joystick) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/devLib/scrollPhat.c b/other/wiringpi/wiringPi-96344ff/devLib/scrollPhat.c deleted file mode 100644 index c1a6f1103..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/scrollPhat.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * scrollPhat.c: - * Simple driver for the Pimoroni Scroll Phat device - * - * Copyright (c) 2015 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include - -#include - -#include "scrollPhatFont.h" -#include "scrollPhat.h" - -// Size - -#define SP_WIDTH 11 -#define SP_HEIGHT 5 - -// I2C - -#define PHAT_I2C_ADDR 0x60 - -// Software copy of the framebuffer -// it's 8-bit deep although the display itself is only 1-bit deep. - -static unsigned char frameBuffer [SP_WIDTH * SP_HEIGHT] ; - -static int lastX, lastY ; -static int printDelayFactor ; -static int scrollPhatFd ; - -static int putcharX ; - -#undef DEBUG - - -/* - * delay: - * Wait for some number of milliseconds. - * This taken from wiringPi as there is no-need to include the whole of - * wiringPi just for the delay function. - ********************************************************************************* - */ - -static void delay (unsigned int howLong) -{ - struct timespec sleeper, dummy ; - - sleeper.tv_sec = (time_t)(howLong / 1000) ; - sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ; - - nanosleep (&sleeper, &dummy) ; -} - - - -/* - * scrollPhatUpdate: - * Copy our software version to the real display - ********************************************************************************* - */ - -void scrollPhatUpdate (void) -{ - register int x, y ; - register unsigned char data, pixel ; - unsigned char pixels [SP_WIDTH] ; - -#ifdef DEBUG - printf ("+-----------+\n") ; - for (y = 0 ; y < SP_HEIGHT ; ++y) - { - putchar ('|') ; - for (x = 0 ; x < SP_WIDTH ; ++x) - { - pixel = frameBuffer [x + y * SP_WIDTH] ; - putchar (pixel == 0 ? ' ' : '*') ; - } - printf ("|\n") ; - } - printf ("+-----------+\n") ; -#endif - - for (x = 0 ; x < SP_WIDTH ; ++x) - { - data = 0 ; - for (y = 0 ; y < SP_HEIGHT ; ++y) - { - pixel = frameBuffer [x + y * SP_WIDTH] ; - data = (data << 1) | ((pixel == 0) ? 0 : 1) ; - } - pixels [x] = data ; - } - - for (x = 0 ; x < SP_WIDTH ; ++x) - wiringPiI2CWriteReg8 (scrollPhatFd, 1 + x, pixels [x]) ; - - wiringPiI2CWriteReg8 (scrollPhatFd, 0x0C, 0) ; -} - - -/* - ********************************************************************************* - * Standard Graphical Functions - ********************************************************************************* - */ - - -/* - * scrollPhatPoint: - * Plot a pixel. Crude clipping - speed is not the essence here. - ********************************************************************************* - */ - -void scrollPhatPoint (int x, int y, int colour) -{ - lastX = x ; - lastY = y ; - - if ((x < 0) || (x >= SP_WIDTH) || (y < 0) || (y >= SP_HEIGHT)) - return ; - - frameBuffer [x + y * SP_WIDTH] = colour ; -} - - -/* - * scrollPhatLine: scrollPhatLineTo: - * Classic Bressenham Line code - rely on the point function to do the - * clipping for us here. - ********************************************************************************* - */ - -void scrollPhatLine (int x0, int y0, int x1, int y1, int colour) -{ - int dx, dy ; - int sx, sy ; - int err, e2 ; - - lastX = x1 ; - lastY = y1 ; - - dx = abs (x1 - x0) ; - dy = abs (y1 - y0) ; - - sx = (x0 < x1) ? 1 : -1 ; - sy = (y0 < y1) ? 1 : -1 ; - - err = dx - dy ; - - for (;;) - { - scrollPhatPoint (x0, y0, colour) ; - - if ((x0 == x1) && (y0 == y1)) - break ; - - e2 = 2 * err ; - - if (e2 > -dy) - { - err -= dy ; - x0 += sx ; - } - - if (e2 < dx) - { - err += dx ; - y0 += sy ; - } - } - -} - -void scrollPhatLineTo (int x, int y, int colour) -{ - scrollPhatLine (lastX, lastY, x, y, colour) ; -} - - -/* - * scrollPhatRectangle: - * A rectangle is a spoilt days fishing - ********************************************************************************* - */ - -void scrollPhatRectangle (int x1, int y1, int x2, int y2, int colour, int filled) -{ - register int x ; - - if (filled) - { - /**/ if (x1 == x2) - scrollPhatLine (x1, y1, x2, y2, colour) ; - else if (x1 < x2) - for (x = x1 ; x <= x2 ; ++x) - scrollPhatLine (x, y1, x, y2, colour) ; - else - for (x = x2 ; x <= x1 ; ++x) - scrollPhatLine (x, y1, x, y2, colour) ; - } - else - { - scrollPhatLine (x1, y1, x2, y1, colour) ; - scrollPhatLineTo (x2, y2, colour) ; - scrollPhatLineTo (x1, y2, colour) ; - scrollPhatLineTo (x1, y1, colour) ; - } -} - - -/* - * scrollPhatPutchar: - * Print a single character to the screen then advance the pointer by an - * appropriate ammount (variable width font). - * We rely on the clipping done by the pixel plot function to keep us - * out of trouble. - * Return the width + space - ********************************************************************************* - */ - -int scrollPhatPutchar (int c) -{ - register int x, y ; - - unsigned char line ; - unsigned char *fontPtr ; - unsigned char *p2 ; - int lineWidth, width, mask ; - -// The font is printable characters, uppercase only... -// and somewhat varaible width... - - c &= 0x7F ; - if (c > 0x60) - c -= 64 ; - else - c -= 32 ; - - fontPtr = scrollPhatFont + c * fontHeight ; - -// Work out width of this character -// There probably is a more efficient way to do this, but... - - p2 = fontPtr ; - width = 0 ; - for (y = 0 ; y < fontHeight ; ++y) - { - mask = 0x80 ; - for (lineWidth = 8 ; lineWidth > 0 ; --lineWidth) - { - if ((*p2 & mask) != 0) - break ; - mask >>= 1 ; - } - if (lineWidth > width) - width = lineWidth ; - - ++p2 ; - } - - if (width == 0) // Likely to be a blank or space character - width = 3 ; - - for (y = fontHeight - 1 ; y >= 0 ; --y) - { - x = 0 ; - line = *fontPtr++ ; - for (mask = 1 << (width - 1) ; mask != 0 ; mask >>= 1) - { - scrollPhatPoint (putcharX + x, y, (line & mask)) ; - ++x ; - } - } - -// make a line of space - - for (y = fontHeight - 1 ; y >= 0 ; --y) - scrollPhatPoint (putcharX + width, y, 0) ; - - putcharX = putcharX + width + 1 ; - - return width + 1 ; -} - - -/* - * scrollPhatPuts: - * Send a string to the display - and scroll it across. - * This is somewhat of a hack in that we print the entire string to the - * display and let the point clipping take care of what's off-screen... - ********************************************************************************* - */ - -void scrollPhatPuts (const char *str) -{ - int i ; - int movingX = 0 ; - const char *s ; - int pixelLen ; - -// Print it once, then we know the width in pixels... - - putcharX = 0 ; - s = str ; - while (*s) - scrollPhatPutchar (*s++) ; - - pixelLen = putcharX ; - -// Now scroll it by printing it and moving left one pixel - - movingX = 0 ; - for (i = 0 ; i < pixelLen ; ++i) - { - putcharX = movingX ; - s = str ; - while (*s) - scrollPhatPutchar (*s++) ; - --movingX ; - scrollPhatUpdate () ; - delay (printDelayFactor) ; - } -} - - -/* - * scrollPhatPrintf: - * Does what it says - ********************************************************************************* - */ - -void scrollPhatPrintf (const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - scrollPhatPuts (buffer) ; -} - - -/* - * scrollPhatPrintSpeed: - * Change the print speed - mS per shift by 1 pixel - ********************************************************************************* - */ - -void scrollPhatPrintSpeed (const int pps) -{ - if (pps < 0) - printDelayFactor = 0 ; - else - printDelayFactor = pps ; -} - - -/* - * scrollPhatClear: - * Clear the display - ********************************************************************************* - */ - -void scrollPhatClear (void) -{ - register int i ; - register unsigned char *ptr = frameBuffer ; - - for (i = 0 ; i < (SP_WIDTH * SP_HEIGHT) ; ++i) - *ptr++ = 0 ; - - scrollPhatUpdate () ; -} - - -/* - * scrollPhatIntensity: - * Set the display brightness - percentage - ********************************************************************************* - */ - -void scrollPhatIntensity (const int percent) -{ - wiringPiI2CWriteReg8 (scrollPhatFd, 0x19, (127 * percent) / 100) ; -} - - -/* - * scrollPhatSetup: - * Initialise the Scroll Phat display - ********************************************************************************* - */ - -int scrollPhatSetup (void) -{ - if ((scrollPhatFd = wiringPiI2CSetup (PHAT_I2C_ADDR)) < 0) - return scrollPhatFd ; - - wiringPiI2CWriteReg8 (scrollPhatFd, 0x00, 0x03) ; // Enable display, set to 5x11 mode - scrollPhatIntensity (10) ; - scrollPhatClear () ; - scrollPhatPrintSpeed (100) ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/devLib/scrollPhat.h b/other/wiringpi/wiringPi-96344ff/devLib/scrollPhat.h deleted file mode 100644 index 0e762b127..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/scrollPhat.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * scrollPhat.h: - * Simple driver for the Pimoroni Scroll Phat device - * - * Copyright (c) 2015 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -extern void scrollPhatPoint (int x, int y, int colour) ; -extern void scrollPhatLine (int x0, int y0, int x1, int y1, int colour) ; -extern void scrollPhatLineTo (int x, int y, int colour) ; -extern void scrollPhatRectangle (int x1, int y1, int x2, int y2, int colour, int filled) ; -extern void scrollPhatUpdate (void) ; -extern void scrollPhatClear (void) ; - -extern int scrollPhatPutchar (int c) ; -//extern void scrollPhatPutchar (int c) ; -extern void scrollPhatPuts (const char *str) ; -extern void scrollPhatPrintf (const char *message, ...) ; -extern void scrollPhatPrintSpeed (const int cps10) ; - -extern void scrollPhatIntensity (const int percent) ; -extern int scrollPhatSetup (void) ; diff --git a/other/wiringpi/wiringPi-96344ff/devLib/scrollPhatFont.h b/other/wiringpi/wiringPi-96344ff/devLib/scrollPhatFont.h deleted file mode 100644 index 92f623ac4..000000000 --- a/other/wiringpi/wiringPi-96344ff/devLib/scrollPhatFont.h +++ /dev/null @@ -1,544 +0,0 @@ -/* - * scrollPhatFont.h: - * Simple font for the Pimoroni Scroll Phat. - * Note: this is a very much reduced font - 5 pixels high and - * mostly 4 pixels wide - sometimes 5. Also only - * printable characters from space to _ uppercase only. - * - * Copyright (c) 2015-2016 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -static const int fontHeight = 5 ; - -static unsigned char scrollPhatFont [] = -{ - -// 0x20, Space. Handeled as a special case in the code. - - 0x0, // .... - 0x0, // .... - 0x0, // .... - 0x0, // .... - 0x0, // .... - -// 0x21, ! - - 0x1, // * - 0x1, // * - 0x1, // * - 0x0, // . - 0x1, // * - -// 0x22, " - - 0x5, // *..* - 0x5, // *..* - 0x0, // .... - 0x0, // .... - 0x0, // .... - -// 0x23, # - - 0x9, // *..* - 0xF, // **** - 0x9, // *..* - 0xF, // **** - 0x9, // *..* - -// 0x24, $ - - 0x1, // ..*. - 0x7, // .*** - 0x2, // ..*. - 0xE, // ***. - 0x8, // ..*. - -// 0x25, % - - 0x9, // *..* - 0x1, // ...* - 0x6, // .**. - 0x8, // *... - 0x9, // *..* - -// 0x26, & - - 0x6, // .**. - 0x8, // *... - 0x4, // .*.. - 0xA, // *.*. - 0x5, // .*.* - -// 0x27, ' - - 0x1, // .* - 0x2, // *. - 0x0, // .. - 0x0, // .. - 0x0, // .. - -// 0x28, ( - - 0x3, // ..** - 0x4, // .*.. - 0x8, // *... - 0x4, // .*.. - 0x3, // ..** - -// 0x29, ) - - 0xC, // **.. - 0x2, // ..*. - 0x1, // ...* - 0x2, // ..*. - 0xC, // **.. - -// 0x2A, * - - 0x9, // *..* - 0x6, // .**. - 0xF, // **** - 0x6, // .**. - 0x9, // *..* - -// 0x2B, + - - 0x6, // .**. - 0x6, // .**. - 0xF, // **** - 0x6, // .**. - 0x6, // .**. - -// 0x2C, , - - 0x0, // .. - 0x0, // .. - 0x0, // .. - 0x1, // .* - 0x2, // *. - -// 0x2D, - - - 0x0, // .... - 0x0, // .... - 0xF, // **** - 0x0, // .... - 0x0, // .... - -// 0x2E, . - - 0x0, // . - 0x0, // . - 0x0, // . - 0x0, // . - 0x1, // * - -// 0x2F, / - - 0x1, // ...* - 0x3, // ..** - 0x4, // ..*. - 0xC, // **.. - 0x8, // *... - -// 0x30, 0 - - 0x6, // .**. - 0x9, // *..* - 0x9, // *..* - 0x9, // *..* - 0x6, // .**. - -// 0x31, 1 - - 0x2, // ..*. - 0x6, // .**. - 0x2, // ..*. - 0x2, // ..*. - 0x7, // .*** - -// 0x32, 2 - - 0x6, // .**. - 0x1, // ...* - 0x6, // .**. - 0x8, // *... - 0xF, // **** - -// 0x33, 3 - - 0xE, // ***. - 0x1, // ...* - 0xE, // ***. - 0x1, // ...* - 0xE, // ***. - -// 0x34, 4 - - 0x6, // .**. - 0xA, // *.*. - 0xF, // **** - 0x2, // ..*. - 0x2, // ..*. - -// 0x35, 5 - - 0xF, // **** - 0x8, // *... - 0xF, // **** - 0x1, // ...* - 0xE, // ***. - -// 0x36, 6 - - 0x2, // ..*. - 0x4, // .*.. - 0xA, // *.*. - 0x9, // *..* - 0x6, // .**. - -// 0x37, 7 - - 0xF, // **** - 0x1, // ...* - 0x2, // ..*. - 0x4, // .*.. - 0x8, // *... - -// 0x38, 8 - - 0x6, // .**. - 0x9, // *..* - 0x6, // .**. - 0x9, // *..* - 0x6, // .**. - -// 0x39, 9 - - 0x6, // .**. - 0x9, // *..* - 0x7, // .*.* - 0x1, // ..*. - 0x2, // .*.. - -// 0x3A, : - - 0x0, // . - 0x1, // * - 0x0, // . - 0x1, // * - 0x0, // . - -// 0x3B, ; - - 0x0, // .. - 0x1, // .* - 0x0, // .. - 0x1, // .* - 0x2, // *. - -// 0x3C, < - - 0x2, // ..*. - 0x4, // .*.. - 0x8, // *... - 0x4, // .*.. - 0x2, // ..*. - -// 0x3D, = - - 0x0, // .... - 0xF, // **** - 0x0, // .... - 0xF, // **** - 0x0, // .... - -// 0x3E, > - - 0x0, // .*.. - 0x0, // ..*. - 0x0, // ...* - 0x0, // ..*. - 0x0, // .*.. - -// 0x3F, ? - - 0x6, // .**. - 0x1, // ...* - 0x2, // ..*. - 0x0, // .... - 0x2, // ..*. - -// 0x40, @ - - 0x6, // .**. - 0xD, // **.* - 0x8, // *... - 0x4, // .*.. - 0x3, // ..** - -// 0x41, A - - 0x6, // .**. - 0x9, // *..* - 0xF, // **** - 0x9, // *..* - 0x9, // *..* - -// 0x42, B - - 0xE, // ***. - 0x9, // *..* - 0xE, // ***. - 0x9, // *..* - 0xE, // ***. - -// 0x43, C - - 0x6, // .**. - 0x9, // *..* - 0x8, // *... - 0x9, // *..* - 0x6, // .**. - -// 0x44, D - - 0xE, // ***. - 0x9, // *..* - 0x9, // *..* - 0x9, // *..* - 0xE, // ***. - -// 0x45, E - - 0xF, // **** - 0x8, // *... - 0xE, // ***. - 0x8, // *... - 0xF, // **** - -// 0x46, F - - 0xF, // **** - 0x8, // *... - 0xE, // ***. - 0x8, // *... - 0x8, // *... - -// 0x47, G - - 0x6, // .**. - 0x9, // *..* - 0x8, // *... - 0xB, // *.** - 0x6, // .**. - -// 0x48, H - - 0x9, // *..* - 0x9, // *..* - 0xF, // **** - 0x9, // *..* - 0x9, // *..* - -// 0x49, I - - 0x7, // *** - 0x2, // .*. - 0x2, // .*. - 0x2, // .*. - 0x7, // *** - -// 0x4A, J - - 0x7, // .*** - 0x2, // ..*. - 0x2, // ..*. - 0xA, // *.*. - 0x4, // .*.. - -// 0x4B, K - - 0x9, // *..* - 0xA, // *.*. - 0xC, // **.. - 0xA, // *.*. - 0x9, // *..* - -// 0x4C, L - - 0x4, // *.. - 0x4, // *.. - 0x4, // *.. - 0x4, // *.. - 0x7, // *** - -// 0x4D, M - - 0x11, // *...* - 0x1B, // **.** - 0x15, // *.*.* - 0x11, // *...* - 0x11, // *...* - -// 0x4E, N - - 0x9, // *..* - 0xD, // **.* - 0xB, // *.** - 0x9, // *..* - 0x9, // *..* - -// 0x4F, O - - 0x6, // .**. - 0x9, // *..* - 0x9, // *..* - 0x9, // *..* - 0x6, // .**. - -// 0x50, P - - 0xE, // ***. - 0x9, // *..* - 0xE, // ***. - 0x8, // *... - 0x8, // *... - -// 0x51, Q - - 0x6, // .**. - 0x9, // *..* - 0x9, // *..* - 0xA, // *.*. - 0x5, // .*.* - -// 0x52, R - - 0xE, // ***. - 0x9, // *..* - 0xF, // ***. - 0xA, // *.*. - 0x9, // *..* - -// 0x53, S - - 0x6, // .**. - 0x8, // *... - 0x6, // .**. - 0x1, // ...* - 0x6, // .**. - -// 0x54, T - - 0x7, // .*** - 0x2, // ..*. - 0x2, // ..*. - 0x2, // ..*. - 0x2, // ..*. - -// 0x55, U - - 0x9, // *..* - 0x9, // *..* - 0x9, // *..* - 0x9, // *..* - 0x6, // .**. - -// 0x56, V - - 0x11, // *...* - 0x11, // *...* - 0x11, // *...* - 0x0A, // .*.*. - 0x04, // ..*.. - -// 0x57, W - - 0x11, // *...* - 0x11, // *...* - 0x11, // *...* - 0x15, // *.*.* - 0x1B, // **.** - -// 0x58, X - - 0x9, // *..* - 0x9, // *..* - 0x6, // .**. - 0x9, // *..* - 0x9, // *..* - -// 0x59, Y - - 0x11, // *...* - 0x0A, // .*.*. - 0x04, // ..*.. - 0x04, // ..*.. - 0x04, // ..*.. - -// 0x5A, Z - - 0xF, // **** - 0x1, // ...* - 0x6, // .**. - 0x8, // *... - 0xF, // **** - -// 0x5B, [ - - 0xE, // ***. - 0x8, // *... - 0x8, // *... - 0x8, // *... - 0xE, // ***. - -// 0x5C, Backslash - - 0x8, // *... - 0xC, // **.. - 0x6, // .**. - 0x3, // ..** - 0x1, // ...* - -// 0x5D, ] - - 0x7, // .*** - 0x1, // ...* - 0x1, // ...* - 0x1, // ...* - 0x7, // .*** - -// 0x5E, ^ - - 0x6, // .**. - 0x9, // *..* - 0x0, // .... - 0x0, // .... - 0x0, // .... - -// 0x5F, _ - - 0x0, // .... - 0x0, // .... - 0x0, // .... - 0x0, // .... - 0xF, // **** -} ; diff --git a/other/wiringpi/wiringPi-96344ff/examples/COPYING.LESSER b/other/wiringpi/wiringPi-96344ff/examples/COPYING.LESSER deleted file mode 100644 index 65c5ca88a..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/COPYING.LESSER +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser 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 -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/7segments.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/7segments.c deleted file mode 100644 index 8797e492f..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/7segments.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * 7segments.c: - * Simple test program to see if we can drive a 7-segment LED - * display using the GPIO and little else on the Raspberry Pi - * - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - */ - -#undef PHOTO_HACK - -#include - -#include -#include -#include -#include - -/* - * Segment mapping - * - * --a-- - * | | - * f b - * | | - * --g-- - * | | - * e c - * | | - * --d-- p - */ - -// GPIO Pin Mapping - -static int digits [6] = { 7, 11, 10, 13, 12, 14 } ; -static int segments [7] = { 6, 5, 4, 3, 2, 1, 0 } ; - - -static const int segmentDigits [] = -{ -// a b c d e f g Segments -// 6 5 4 3 2 1 0, // wiringPi pin No. - - 1, 1, 1, 1, 1, 1, 0, // 0 - 0, 1, 1, 0, 0, 0, 0, // 1 - 1, 1, 0, 1, 1, 0, 1, // 2 - 1, 1, 1, 1, 0, 0, 1, // 3 - 0, 1, 1, 0, 0, 1, 1, // 4 - 1, 0, 1, 1, 0, 1, 1, // 5 - 1, 0, 1, 1, 1, 1, 1, // 6 - 1, 1, 1, 0, 0, 0, 0, // 7 - 1, 1, 1, 1, 1, 1, 1, // 8 - 1, 1, 1, 1, 0, 1, 1, // 9 - 1, 1, 1, 0, 1, 1, 1, // A - 0, 0, 1, 1, 1, 1, 1, // b - 1, 0, 0, 1, 1, 1, 0, // C - 0, 1, 1, 1, 1, 0, 1, // d - 1, 0, 0, 1, 1, 1, 1, // E - 1, 0, 0, 0, 1, 1, 1, // F - 0, 0, 0, 0, 0, 0, 0, // blank -} ; - - -// display: -// A global variable which is written to by the main program and -// read from by the thread that updates the display. Only the first -// 6 characters are used. - -char display [8] ; - - -/* - * displayDigits: - * This is our thread that's run concurrently with the main program. - * Essentially sit in a loop, parsing and displaying the data held in - * the "display" global. - ********************************************************************************* - */ - -PI_THREAD (displayDigits) -{ - int digit, segment ; - int index, d, segVal ; - - piHiPri (50) ; - - for (;;) - { - for (digit = 0 ; digit < 6 ; ++digit) - { - for (segment = 0 ; segment < 7 ; ++segment) - { - d = toupper (display [digit]) ; - /**/ if ((d >= '0') && (d <= '9')) // Digit - index = d - '0' ; - else if ((d >= 'A') && (d <= 'F')) // Hex - index = d - 'A' + 10 ; - else - index = 16 ; // Blank - - segVal = segmentDigits [index * 7 + segment] ; - - digitalWrite (segments [segment], segVal) ; - } - digitalWrite (digits [digit], 1) ; - delay (2) ; - digitalWrite (digits [digit], 0) ; - } - } -} - - -/* - * setup: - * Initialise the hardware and start the thread - ********************************************************************************* - */ - -void setup (void) -{ - int i, c ; - - wiringPiSetup () ; - -// 7 segments - - for (i = 0 ; i < 7 ; ++i) - { digitalWrite (segments [i], 0) ; pinMode (segments [i], OUTPUT) ; } - -// 6 digits - - for (i = 0 ; i < 6 ; ++i) - { digitalWrite (digits [i], 0) ; pinMode (digits [i], OUTPUT) ; } - - strcpy (display, " ") ; - piThreadCreate (displayDigits) ; - delay (10) ; // Just to make sure it's started - -// Quick countdown LED test sort of thing - - c = 999999 ; - for (i = 0 ; i < 10 ; ++i) - { - sprintf (display, "%06d", c) ; - delay (400) ; - c -= 111111 ; - } - - strcpy (display, " ") ; - delay (400) ; - -#ifdef PHOTO_HACK - sprintf (display, "%s", "123456") ; - for (;;) - delay (1000) ; -#endif - -} - - -/* - * teenager: - * No explanation needed. (Nor one given!) - ********************************************************************************* - */ - -void teenager (void) -{ - char *message = " feedbeef babe cafe b00b " ; - int i ; - - for (i = 0 ; i < strlen (message) - 4 ; ++i) - { - strncpy (display, &message [i], 6) ; - delay (200) ; - } - delay (1000) ; - for (i = 0 ; i < 3 ; ++i) - { - strcpy (display, " ") ; - delay (150) ; - strcpy (display, " b00b ") ; - delay (250) ; - } - delay (1000) ; - strcpy (display, " ") ; - delay (1000) ; -} - - -/* - ********************************************************************************* - * main: - * Let the fun begin - ********************************************************************************* - */ - -int main (void) -{ - struct tm *t ; - time_t tim ; - - setup () ; - teenager () ; - - tim = time (NULL) ; - for (;;) - { - while (time (NULL) == tim) - delay (5) ; - - tim = time (NULL) ; - t = localtime (&tim) ; - - sprintf (display, "%02d%02d%02d", t->tm_hour, t->tm_min, t->tm_sec) ; - - delay (500) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/Makefile b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/Makefile deleted file mode 100644 index 1939ad6ff..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/Makefile +++ /dev/null @@ -1,78 +0,0 @@ -# -# Makefile: -# Gertboard - Examples using wiringPi -# -# Copyright (c) 2013 Gordon Henderson -################################################################################# - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O3 -CC = gcc -INCLUDE = -I/usr/local/include -CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe - -LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm - -# Should not alter anything below this line -############################################################################### - -SRC = gertboard.c \ - buttons.c 7segments.c \ - voltmeter.c temperature.c vumeter.c \ - record.c - -OBJ = $(SRC:.c=.o) - -BINS = $(SRC:.c=) - -all: $(BINS) - -gertboard: gertboard.o - $Q echo [link] - $Q $(CC) -o $@ gertboard.o $(LDFLAGS) $(LDLIBS) - -buttons: buttons.o - $Q echo [link] - $Q $(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS) - -7segments: 7segments.o - $Q echo [link] - $Q $(CC) -o $@ 7segments.o $(LDFLAGS) $(LDLIBS) - -voltmeter: voltmeter.o - $Q echo [link] - $Q $(CC) -o $@ voltmeter.o $(LDFLAGS) $(LDLIBS) - -temperature: temperature.o - $Q echo [link] - $Q $(CC) -o $@ temperature.o $(LDFLAGS) $(LDLIBS) - -vumeter: vumeter.o - $Q echo [link] - $Q $(CC) -o $@ vumeter.o $(LDFLAGS) $(LDLIBS) - -record: record.o - $Q echo [link] - $Q $(CC) -o $@ record.o $(LDFLAGS) $(LDLIBS) - -.c.o: - $Q echo [CC] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -clean: - $Q echo [Clean] - $Q rm -f $(OBJ) *~ core tags $(BINS) - -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/buttons.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/buttons.c deleted file mode 100644 index 5f7676412..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/buttons.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * buttons.c: - * Read the Gertboard buttons. Each one will act as an on/off - * tiggle switch for 3 different LEDs - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -// Array to keep track of our LEDs - -int leds [] = { 0, 0, 0 } ; - -// scanButton: -// See if a button is pushed, if so, then flip that LED and -// wait for the button to be let-go - -void scanButton (int button) -{ - if (digitalRead (button) == HIGH) // Low is pushed - return ; - - leds [button] ^= 1 ; // Invert state - digitalWrite (4 + button, leds [button]) ; - - while (digitalRead (button) == LOW) // Wait for release - delay (10) ; -} - -int main (void) -{ - int i ; - - printf ("Raspberry Pi Gertboard Button Test\n") ; - - wiringPiSetup () ; - -// Setup the outputs: -// Pins 3, 4, 5, 6 and 7 output: -// We're not using 3 or 4, but make sure they're off anyway -// (Using same hardware config as blink12.c) - - for (i = 3 ; i < 8 ; ++i) - { - pinMode (i, OUTPUT) ; - digitalWrite (i, 0) ; - } - -// Setup the inputs - - for (i = 0 ; i < 3 ; ++i) - { - pinMode (i, INPUT) ; - pullUpDnControl (i, PUD_UP) ; - leds [i] = 0 ; - } - - for (;;) - { - for (i = 0 ; i < 3 ; ++i) - scanButton (i) ; - delay (1) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/gertboard.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/gertboard.c deleted file mode 100644 index aefcb1244..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/gertboard.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * gertboard.c: - * Simple test for the SPI bus on the Gertboard - * - * Hardware setup: - * D/A port 0 jumpered to A/D port 0. - * - * We output a sine wave on D/A port 0 and sample A/D port 0. We then - * plot the input value on the terminal as a sort of vertical scrolling - * oscilloscipe. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -// Gertboard D to A is an 8-bit unit. - -#define B_SIZE 256 - -#include -#include - -int main (void) -{ - double angle ; - int i, inputValue ; - int buffer [B_SIZE] ; - int cols ; - struct winsize w ; - - - printf ("Raspberry Pi Gertboard SPI test program\n") ; - printf ("=======================================\n") ; - - ioctl (fileno (stdin), TIOCGWINSZ, &w); - cols = w.ws_col - 2 ; - -// Always initialise wiringPi. Use wiringPiSys() if you don't need -// (or want) to run as root - - wiringPiSetupSys () ; - -// Initialise the Gertboard analog hardware at pin 100 - - gertboardAnalogSetup (100) ; - -// Generate a Sine Wave and store in our buffer - - for (i = 0 ; i < B_SIZE ; ++i) - { - angle = ((double)i / (double)B_SIZE) * M_PI * 2.0 ; - buffer [i] = (int)rint ((sin (angle)) * 127.0 + 128.0) ; - } - -// Loop, output the sine wave on analog out port 0, read it into A-D port 0 -// and display it on the screen - - for (;;) - { - for (i = 0 ; i < B_SIZE ; ++i) - { - analogWrite (100, buffer [i]) ; - - inputValue = analogRead (100) ; - -// We don't need to wory about the scale or sign - the analog hardware is -// a 10-bit value, so 0-1023. Just scale this to our terminal - - printf ("%*s\n", (inputValue * cols) / 1023, "*") ; - delay (2) ; - } - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/record.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/record.c deleted file mode 100644 index 71d87184e..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/record.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * record.c: - * Record some audio via the Gertboard - * - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - */ - -#include -#include - -#include -#include - -#define B_SIZE 40000 - -int main () -{ - int i ; - struct timeval tStart, tEnd, tTaken ; - unsigned char buffer [B_SIZE] ; - - printf ("\n") ; - printf ("Gertboard demo: Recorder\n") ; - printf ("========================\n") ; - -// Always initialise wiringPi. Use wiringPiSys() if you don't need -// (or want) to run as root - - wiringPiSetupSys () ; - -// Initialise the Gertboard analog hardware at pin 100 - - gertboardAnalogSetup (100) ; - - gettimeofday (&tStart, NULL) ; - - for (i = 0 ; i < B_SIZE ; ++i) - buffer [i] = analogRead (100) >> 2 ; - - gettimeofday (&tEnd, NULL) ; - - timersub (&tEnd, &tStart, &tTaken) ; - - printf ("Time taken for %d reads: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ; - - gettimeofday (&tStart, NULL) ; - - for (i = 0 ; i < B_SIZE ; ++i) - analogWrite (100, buffer [i]) ; - - gettimeofday (&tEnd, NULL) ; - - timersub (&tEnd, &tStart, &tTaken) ; - - printf ("Time taken for %d writes: %ld.%ld\n", B_SIZE, tTaken.tv_sec, tTaken.tv_usec) ; - - return 0 ; -} - diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/temperature.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/temperature.c deleted file mode 100644 index 5985a122c..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/temperature.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * temperature.c: - * Demonstrate use of the Gertboard A to D converter to make - * a simple thermometer using the LM35. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include - -int main () -{ - int x1, x2 ; - double v1, v2 ; - - printf ("\n") ; - printf ("Gertboard demo: Simple Thermemeter\n") ; - printf ("==================================\n") ; - -// Always initialise wiringPi. Use wiringPiSys() if you don't need -// (or want) to run as root - - wiringPiSetupSys () ; - -// Initialise the Gertboard analog hardware at pin 100 - - gertboardAnalogSetup (100) ; - - printf ("\n") ; - printf ("| Channel 0 | Channel 1 | Temperature 1 | Temperature 2 |\n") ; - - for (;;) - { - -// Read the 2 channels: - - x1 = analogRead (100) ; - x2 = analogRead (101) ; - -// Convert to a voltage: - - v1 = (double)x1 / 1023.0 * 3.3 ; - v2 = (double)x2 / 1023.0 * 3.3 ; - -// Print - - printf ("| %6.3f | %6.3f |", v1, v2) ; - -// Print Temperature of both channels by converting the LM35 reading -// to a temperature. Fortunately these are easy: 0.01 volts per C. - - printf (" %4.1f | %4.1f |\r", v1 * 100.0, v2 * 100.0) ; - fflush (stdout) ; - } - - return 0 ; -} - diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/voltmeter.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/voltmeter.c deleted file mode 100644 index c4d2113f1..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/voltmeter.c +++ /dev/null @@ -1,73 +0,0 @@ -/* - * voltmeter.c: - * Demonstrate use of the Gertboard A to D converter to make - * a simple voltmeter. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include - -int main () -{ - int x1, x2 ; - double v1, v2 ; - - printf ("\n") ; - printf ("Gertboard demo: Simple Voltmeters\n") ; - printf ("=================================\n") ; - -// Always initialise wiringPi. Use wiringPiSys() if you don't need -// (or want) to run as root - - wiringPiSetupSys () ; - -// Initialise the Gertboard analog hardware at pin 100 - - gertboardAnalogSetup (100) ; - - printf ("\n") ; - printf ("| Channel 0 | Channel 1 |\n") ; - - for (;;) - { - -// Read the 2 channels: - - x1 = analogRead (100) ; - x2 = analogRead (101) ; - -// Convert to a voltage: - - v1 = (double)x1 / 1023.0 * 3.3 ; - v2 = (double)x2 / 1023.0 * 3.3 ; - -// Print - - printf ("| %6.3f | %6.3f |\r", v1, v2) ; - fflush (stdout) ; - } - - return 0 ; -} - diff --git a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/vumeter.c b/other/wiringpi/wiringPi-96344ff/examples/Gertboard/vumeter.c deleted file mode 100644 index 9643ace97..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Gertboard/vumeter.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * vumeter.c: - * Simple VU meter - * - * Heres the theory: - * We will sample at 4000 samples/sec and put the data into a - * low-pass filter with a depth of 1000 samples. This will give - * us 1/4 a second of lag on the signal, but I think it might - * produce a more pleasing output. - * - * The input of the microphone should be at mid-pont with no - * sound input, but we might have to sample that too, to get - * our reference zero... - * - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -#ifndef TRUE -#define TRUE (1==1) -#define FALSE (!TRUE) -#endif - -#define B_SIZE 1000 -#define S_SIZE 128 - -static int buffer [B_SIZE] ; -static int bPtr = 0 ; - -/* - * ledPercent: - * Output the given value as a percentage on the LEDs - ********************************************************************************* - */ - -static void ledPercent (int percent) -{ - unsigned int output = 0 ; - - if (percent > 11) output |= 0x01 ; - if (percent > 22) output |= 0x02 ; - if (percent > 33) output |= 0x04 ; - if (percent > 44) output |= 0x08 ; - if (percent > 55) output |= 0x10 ; - if (percent > 66) output |= 0x20 ; - if (percent > 77) output |= 0x40 ; - if (percent > 88) output |= 0x80 ; - - digitalWriteByte (output) ; -} - -static unsigned int tPeriod, tNextSampleTime ; - -/* - * sample: - * Get a sample from the Gertboard. If not enough time has elapsed - * since the last sample, then wait... - ********************************************************************************* - */ - -static void sample (void) -{ - unsigned int tFuture ; - -// Calculate the future sample time - - tFuture = tPeriod + tNextSampleTime ; - -// Wait until the next sample time - - while (micros () < tNextSampleTime) - ; - - buffer [bPtr] = gertboardAnalogRead (0) ; - - tNextSampleTime = tFuture ; -} - - -int main () -{ - int quietLevel, min, max ; - int i, sum ; - unsigned int tStart, tEnd ; - - printf ("\n") ; - printf ("Gertboard demo: VU Meter\n") ; - printf ("========================\n") ; - - wiringPiSetup () ; - gertboardSPISetup () ; - - ledPercent (0) ; - for (i = 0 ; i < 8 ; ++i) - pinMode (i, OUTPUT) ; - - for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr) - buffer [bPtr] = 99 ; - - tPeriod = 1000000 / 1000 ; - - printf ("Shhhh.... ") ; fflush (stdout) ; - delay (1000) ; - printf ("Sampling quiet... ") ; fflush (stdout) ; - - tStart = micros () ; - - tNextSampleTime = micros () ; - for (bPtr = 0 ; bPtr < B_SIZE ; ++bPtr) - sample () ; - - tEnd = micros () ; - - quietLevel = 0 ; - max = 0 ; - min = 1024 ; - for (i = 0 ; i < B_SIZE ; ++i) - { - quietLevel += buffer [i] ; - if (buffer [i] > max) max = buffer [i] ; - if (buffer [i] < min) min = buffer [i] ; - } - quietLevel /= B_SIZE ; - - printf ("Done. Quiet level is: %d [%d:%d] [%d:%d]\n", quietLevel, min, max, quietLevel - min, max - quietLevel) ; - - printf ("Time taken for %d reads: %duS\n", B_SIZE, tEnd - tStart) ; - - for (bPtr = 0 ;;) - { - sample () ; - sum = 0 ; - for (i = 0 ; i < S_SIZE ; ++i) - sum += buffer [i] ; - sum /= S_SIZE ; - sum = abs (quietLevel - sum) ; - sum = (sum * 1000) / quietLevel ; - ledPercent (sum) ; - if (++bPtr > S_SIZE) - bPtr = 0 ; - } - - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/Makefile b/other/wiringpi/wiringPi-96344ff/examples/Makefile deleted file mode 100644 index 6d87885cd..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/Makefile +++ /dev/null @@ -1,171 +0,0 @@ -# -# Makefile: -# wiringPi - A "wiring" library for the Raspberry Pi -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# Wiring Compatable library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O3 -CC = gcc -INCLUDE = -I/usr/local/include -CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe - -LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt - -# Should not alter anything below this line -############################################################################### - -SRC = blink.c blink8.c blink12.c \ - blink12drcs.c \ - pwm.c \ - speed.c wfi.c isr.c isr-osc.c \ - lcd.c lcd-adafruit.c clock.c \ - nes.c \ - softPwm.c softTone.c \ - delayTest.c serialRead.c serialTest.c okLed.c ds1302.c \ - lowPower.c \ - max31855.c \ - rht03.c - -OBJ = $(SRC:.c=.o) - -BINS = $(SRC:.c=) - -all: - $Q cat README.TXT - $Q echo " $(BINS)" | fmt - $Q echo "" - -really-all: $(BINS) - -blink: blink.o - $Q echo [link] - $Q $(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) - -blink8: blink8.o - $Q echo [link] - $Q $(CC) -o $@ blink8.o $(LDFLAGS) $(LDLIBS) - -blink12drcs: blink12drcs.o - $Q echo [link] - $Q $(CC) -o $@ blink12drcs.o $(LDFLAGS) $(LDLIBS) - -blink12: blink12.o - $Q echo [link] - $Q $(CC) -o $@ blink12.o $(LDFLAGS) $(LDLIBS) - -speed: speed.o - $Q echo [link] - $Q $(CC) -o $@ speed.o $(LDFLAGS) $(LDLIBS) - -lcd: lcd.o - $Q echo [link] - $Q $(CC) -o $@ lcd.o $(LDFLAGS) $(LDLIBS) - -lcd-adafruit: lcd-adafruit.o - $Q echo [link] - $Q $(CC) -o $@ lcd-adafruit.o $(LDFLAGS) $(LDLIBS) - -clock: clock.o - $Q echo [link] - $Q $(CC) -o $@ clock.o $(LDFLAGS) $(LDLIBS) - -wfi: wfi.o - $Q echo [link] - $Q $(CC) -o $@ wfi.o $(LDFLAGS) $(LDLIBS) - -isr: isr.o - $Q echo [link] - $Q $(CC) -o $@ isr.o $(LDFLAGS) $(LDLIBS) - -isr-osc: isr-osc.o - $Q echo [link] - $Q $(CC) -o $@ isr-osc.o $(LDFLAGS) $(LDLIBS) - -nes: nes.o - $Q echo [link] - $Q $(CC) -o $@ nes.o $(LDFLAGS) $(LDLIBS) - -rht03: rht03.o - $Q echo [link] - $Q $(CC) -o $@ rht03.o $(LDFLAGS) $(LDLIBS) - -pwm: pwm.o - $Q echo [link] - $Q $(CC) -o $@ pwm.o $(LDFLAGS) $(LDLIBS) - -softPwm: softPwm.o - $Q echo [link] - $Q $(CC) -o $@ softPwm.o $(LDFLAGS) $(LDLIBS) - -softTone: softTone.o - $Q echo [link] - $Q $(CC) -o $@ softTone.o $(LDFLAGS) $(LDLIBS) - -delayTest: delayTest.o - $Q echo [link] - $Q $(CC) -o $@ delayTest.o $(LDFLAGS) $(LDLIBS) - -serialRead: serialRead.o - $Q echo [link] - $Q $(CC) -o $@ serialRead.o $(LDFLAGS) $(LDLIBS) - -serialTest: serialTest.o - $Q echo [link] - $Q $(CC) -o $@ serialTest.o $(LDFLAGS) $(LDLIBS) - -okLed: okLed.o - $Q echo [link] - $Q $(CC) -o $@ okLed.o $(LDFLAGS) $(LDLIBS) - -tone: tone.o - $Q echo [link] - $Q $(CC) -o $@ tone.o $(LDFLAGS) $(LDLIBS) - -ds1302: ds1302.o - $Q echo [link] - $Q $(CC) -o $@ ds1302.o $(LDFLAGS) $(LDLIBS) - -max31855: max31855.o - $Q echo [link] - $Q $(CC) -o $@ max31855.o $(LDFLAGS) $(LDLIBS) - -.c.o: - $Q echo [CC] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) *~ core tags $(BINS) - -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/Makefile b/other/wiringpi/wiringPi-96344ff/examples/PiFace/Makefile deleted file mode 100644 index f937c1432..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/Makefile +++ /dev/null @@ -1,88 +0,0 @@ -# -# Makefile: -# wiringPi - A "wiring" library for the Raspberry Pi -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O3 -CC = gcc -INCLUDE = -I/usr/local/include -CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe - -LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm - -# Should not alter anything below this line -############################################################################### - -SRC = blink.c buttons.c reaction.c ladder.c metro.c motor.c - -OBJ = $(SRC:.c=.o) - -BINS = $(SRC:.c=) - -all: $(BINS) - -blink: blink.o - $Q echo [link] - $Q $(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) - -buttons: buttons.o - $Q echo [link] - $Q $(CC) -o $@ buttons.o $(LDFLAGS) $(LDLIBS) - -reaction: reaction.o - $Q echo [link] - $Q $(CC) -o $@ reaction.o $(LDFLAGS) $(LDLIBS) - -ladder: ladder.o - $Q echo [link] - $Q $(CC) -o $@ ladder.o $(LDFLAGS) $(LDLIBS) - -metro: metro.o - $Q echo [link] - $Q $(CC) -o $@ metro.o $(LDFLAGS) $(LDLIBS) - -motor: motor.o - $Q echo [link] - $Q $(CC) -o $@ motor.o $(LDFLAGS) $(LDLIBS) - -.c.o: - $Q echo [CC] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) *~ core tags $(BINS) - -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/blink.c b/other/wiringpi/wiringPi-96344ff/examples/PiFace/blink.c deleted file mode 100644 index ffb8a2e34..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/blink.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * blink.c: - * Simple "blink" test for the PiFace interface board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include - -// Use 200 as the pin-base for the PiFace board, and pick a pin -// for the LED that's not connected to a relay - -#define PIFACE 200 -#define LED (PIFACE+2) - -int main (int argc, char *argv []) -{ - printf ("Raspberry Pi PiFace Blink\n") ; - printf ("=========================\n") ; - -// Always initialise wiringPi. Use wiringPiSys() if you don't need -// (or want) to run as root - - wiringPiSetupSys () ; - -// Setup the PiFace board - - piFaceSetup (PIFACE) ; - - for (;;) - { - digitalWrite (LED, HIGH) ; // On - delay (500) ; // mS - digitalWrite (LED, LOW) ; // Off - delay (500) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/buttons.c b/other/wiringpi/wiringPi-96344ff/examples/PiFace/buttons.c deleted file mode 100644 index 147a4bdbf..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/buttons.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * buttons.c: - * Simple test for the PiFace interface board. - * - * Read the buttons and output the same to the LEDs - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include - -int outputs [4] = { 0,0,0,0 } ; - -// Use 200 as the pin-base for the PiFace board - -#define PIFACE_BASE 200 - - -/* - * scanButton: - * Read the guiven button - if it's pressed, then flip the state - * of the correspoinding output pin - ********************************************************************************* - */ - -void scanButton (int button) -{ - if (digitalRead (PIFACE_BASE + button) == LOW) - { - outputs [button] ^= 1 ; - digitalWrite (PIFACE_BASE + button, outputs [button]) ; - printf ("Button %d pushed - output now: %s\n", - button, (outputs [button] == 0) ? "Off" : "On") ; - } - - while (digitalRead (PIFACE_BASE + button) == LOW) - delay (1) ; -} - - -/* - * start here - ********************************************************************************* - */ - -int main (void) -{ - int pin, button ; - - printf ("Raspberry Pi wiringPi + PiFace test program\n") ; - printf ("===========================================\n") ; - printf ("\n") ; - printf ( -"This program reads the buttons and uses them to toggle the first 4\n" -"outputs. Push a button once to turn an output on, and push it again to\n" -"turn it off again.\n\n") ; - -// Always initialise wiringPi. Use wiringPiSys() if you don't need -// (or want) to run as root - - wiringPiSetupSys () ; - - piFaceSetup (PIFACE_BASE) ; - -// Enable internal pull-ups & start with all off - - for (pin = 0 ; pin < 8 ; ++pin) - { - pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ; - digitalWrite (PIFACE_BASE + pin, 0) ; - } - -// Loop, scanning the buttons - - for (;;) - { - for (button = 0 ; button < 4 ; ++button) - scanButton (button) ; - delay (5) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/ladder.c b/other/wiringpi/wiringPi-96344ff/examples/PiFace/ladder.c deleted file mode 100755 index 4f08a6f55..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/ladder.c +++ /dev/null @@ -1,337 +0,0 @@ -/* - * ladder.c: - * - * Gordon Henderson, June 2012 - *********************************************************************** - */ - -#include -#include -#include -#include - -#include -#include - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -#undef DEBUG - -#define NUM_LEDS 8 - - -// Map the LEDs to the hardware pins -// using PiFace pin numbers here - -#define PIFACE 200 - -const int ledMap [NUM_LEDS] = -{ -// 0, 1, 2, 3, 4, 5, 6, 7, 8 - 200, 201, 202, 203, 204, 205, 206, 207 -} ; - - -// Some constants for our circuit simulation - -const double vBatt = 9.0 ; // Volts (ie. a PP3) -const double capacitor = 0.001 ; // 1000uF -const double rCharge = 2200.0 ; // ohms -const double rDischarge = 68000.0 ; // ohms -const double timeInc = 0.01 ; // Seconds - -double vCharge, vCap, vCapLast ; - - - -/* - * setup: - * Program the GPIO correctly and initialise the lamps - *********************************************************************** - */ - -void setup (void) -{ - int i ; - - wiringPiSetupSys () ; - - if (piFaceSetup (200) == -1) - exit (1) ; - -// Enable internal pull-ups - - for (i = 0 ; i < 8 ; ++i) - pullUpDnControl (PIFACE + i, PUD_UP) ; - -// Calculate the actual charging voltage - standard calculation of -// vCharge = r2 / (r1 + r2) * vBatt -// -// -// -----+--- vBatt -// | -// R1 -// | -// +---+---- vCharge -// | | -// R2 C -// | | -// -----+---+----- - - vCharge = rDischarge / (rCharge + rDischarge) * vBatt ; - -// Start with no charge - - vCap = vCapLast = 0.0 ; -} - - -/* - * introLeds - * Put a little pattern on the LEDs to start with - ********************************************************************************* - */ - -void introLeds (void) -{ - int i, j ; - - - printf ("Pi Ladder\n") ; - printf ("=========\n\n") ; - printf (" vBatt: %6.2f volts\n", vBatt) ; - printf (" rCharge: %6.0f ohms\n", rCharge) ; - printf (" rDischarge: %6.0f ohms\n", rDischarge) ; - printf (" vCharge: %6.2f volts\n", vCharge) ; - printf (" capacitor: %6.0f uF\n", capacitor * 1000.0) ; - -// Flash 3 times: - - for (j = 0 ; j < 3 ; ++j) - { - for (i = 0 ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 1) ; - delay (500) ; - for (i = 0 ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 0) ; - delay (100) ; - } - -// All On - - for (i = 0 ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 1) ; - delay (500) ; - -// Countdown... - - for (i = NUM_LEDS - 1 ; i >= 0 ; --i) - { - digitalWrite (ledMap [i], 0) ; - delay (100) ; - } - delay (500) ; -} - - -/* - * winningLeds - * Put a little pattern on the LEDs to start with - ********************************************************************************* - */ - -void winningLeds (void) -{ - int i, j ; - -// Flash 3 times: - - for (j = 0 ; j < 3 ; ++j) - { - for (i = 0 ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 1) ; - delay (500) ; - for (i = 0 ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 0) ; - delay (100) ; - } - -// All On - - for (i = 0 ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 1) ; - delay (500) ; - -// Countup... - - for (i = 0 ; i < NUM_LEDS ; ++i) - { - digitalWrite (ledMap [i], 0) ; - delay (100) ; - } - delay (500) ; -} - - -/* - * chargeCapacitor: dischargeCapacitor: - * Add or remove charge to the capacitor. - * Standard capacitor formulae. - ********************************************************************************* - */ - -void chargeCapacitor (void) -{ - vCap = (vCapLast - vCharge) * - exp (- timeInc / (rCharge * capacitor)) + vCharge ; - -#ifdef DEBUG - printf ("+vCap: %7.4f\n", vCap) ; -#endif - - vCapLast = vCap ; -} - -void dischargeCapacitor (void) -{ - vCap = vCapLast * - exp (- timeInc / (rDischarge * capacitor)) ; - -#ifdef DEBUG - printf ("-vCap: %7.4f\n", vCap) ; -#endif - - vCapLast = vCap ; -} - - -/* - * ledBargraph: - * Output the supplied number as a bargraph on the LEDs - ********************************************************************************* - */ - -void ledBargraph (double value, int topLedOn) -{ - int topLed = (int)floor (value / vCharge * (double)NUM_LEDS) + 1 ; - int i ; - - if (topLed > NUM_LEDS) - topLed = NUM_LEDS ; - - if (!topLedOn) - --topLed ; - - for (i = 0 ; i < topLed ; ++i) - digitalWrite (ledMap [i], 1) ; - - for (i = topLed ; i < NUM_LEDS ; ++i) - digitalWrite (ledMap [i], 0) ; -} - - -/* - * ledOnAction: - * Make sure the leading LED is on and check the button - ********************************************************************************* - */ - -void ledOnAction (void) -{ - if (digitalRead (PIFACE) == LOW) - { - chargeCapacitor () ; - ledBargraph (vCap, TRUE) ; - } -} - - -/* - * ledOffAction: - * Make sure the leading LED is off and check the button - ********************************************************************************* - */ - -void ledOffAction (void) -{ - dischargeCapacitor () ; - -// Are we still pushing the button? - - if (digitalRead (PIFACE) == LOW) - { - vCap = vCapLast = 0.0 ; - ledBargraph (vCap, FALSE) ; - -// Wait until we release the button - - while (digitalRead (PIFACE) == LOW) - delay (10) ; - } -} - - -/* - *********************************************************************** - * The main program - *********************************************************************** - */ - -int main (void) -{ - unsigned int then, ledOnTime, ledOffTime ; - unsigned int ourDelay = (int)(1000.0 * timeInc) ; - - setup () ; - introLeds () ; - -// Setup the LED times - TODO reduce the ON time as the game progresses - - ledOnTime = 1000 ; - ledOffTime = 1000 ; - -// This is our Gate/Squarewave loop - - for (;;) - { - -// LED ON: - - (void)ledBargraph (vCap, TRUE) ; - then = millis () + ledOnTime ; - while (millis () < then) - { - ledOnAction () ; - delay (ourDelay) ; - } - -// Have we won yet? -// We need vCap to be in the top NUM_LEDS of the vCharge - - if (vCap > ((double)(NUM_LEDS - 1) / (double)NUM_LEDS * vCharge)) // Woo hoo! - { - winningLeds () ; - while (digitalRead (PIFACE) == HIGH) - delay (10) ; - while (digitalRead (PIFACE) == LOW) - delay (10) ; - vCap = vCapLast = 0.0 ; - } - -// LED OFF: - - (void)ledBargraph (vCap, FALSE) ; - then = millis () + ledOffTime ; - while (millis () < then) - { - ledOffAction () ; - delay (ourDelay) ; - } - - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/metro.c b/other/wiringpi/wiringPi-96344ff/examples/PiFace/metro.c deleted file mode 100644 index a4a8c1d01..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/metro.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * metronome.c: - * Simple test for the PiFace interface board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -#define PIFACE 200 - -/* - * middleA: - * Play middle A (on the relays - yea!) - ********************************************************************************* - */ - -static void middleA (void) -{ - unsigned int next ; - - for (;;) - { - next = micros () + 1136 ; - digitalWrite (PIFACE + 0, 0) ; - digitalWrite (PIFACE + 1, 0) ; - while (micros () < next) - delayMicroseconds (1) ; - - next = micros () + 1137 ; - digitalWrite (PIFACE + 0, 1) ; - digitalWrite (PIFACE + 1, 1) ; - while (micros () < next) - delayMicroseconds (1) ; - - } -} - - -int main (int argc, char *argv []) -{ - int bpm, msPerBeat, state = 0 ; - unsigned int end ; - - printf ("Raspberry Pi PiFace Metronome\n") ; - printf ("=============================\n") ; - - piHiPri (50) ; - - wiringPiSetupSys () ; // Needed for timing functions - piFaceSetup (PIFACE) ; - - if (argc != 2) - { - printf ("Usage: %s \n", argv [0]) ; - exit (1) ; - } - - if (strcmp (argv [1], "a") == 0) - middleA () ; - - bpm = atoi (argv [1]) ; - - if ((bpm < 40) || (bpm > 208)) - { - printf ("%s range is 40 through 208 beats per minute\n", argv [0]) ; - exit (1) ; - } - - msPerBeat = 60000 / bpm ; - -// Main loop: -// Put some random LED pairs up for a few seconds, then blank ... - - for (;;) - { - end = millis () + msPerBeat ; - - digitalWrite (PIFACE + 0, state) ; - digitalWrite (PIFACE + 1, state) ; - - while (millis () < end) - delayMicroseconds (500) ; - - state ^= 1 ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/motor.c b/other/wiringpi/wiringPi-96344ff/examples/PiFace/motor.c deleted file mode 100644 index 14f55397e..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/motor.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * motor.c: - * Use the PiFace board to demonstrate an H bridge - * circuit via the 2 relays. - * Then add on an external transsitor to help with PWM. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include -#include - -int outputs [2] = { 0,0 } ; - -#define PIFACE_BASE 200 -#define PWM_OUT_PIN 204 -#define PWM_UP 202 -#define PWM_DOWN 203 - -void scanButton (int button) -{ - if (digitalRead (PIFACE_BASE + button) == LOW) - { - outputs [button] ^= 1 ; - digitalWrite (PIFACE_BASE + button, outputs [button]) ; - printf ("Button %d pushed - output now: %s\n", - button, (outputs [button] == 0) ? "Off" : "On") ; - } - - while (digitalRead (PIFACE_BASE + button) == LOW) - delay (1) ; -} - - -int main (void) -{ - int pin, button ; - int pwmValue = 0 ; - - printf ("Raspberry Pi PiFace - Motor control\n") ; - printf ("==================================\n") ; - printf ("\n") ; - printf ( -"This program is designed to be used with a motor connected to the relays\n" -"in an H-Bridge type configuration with optional speeed control via PWM.\n" -"\n" -"Use the leftmost buttons to turn each relay on and off, and the rigthmost\n" -"buttons to increase ot decrease the PWM output on the control pin (pin\n" -"4)\n\n") ; - - wiringPiSetup () ; - piFaceSetup (PIFACE_BASE) ; - softPwmCreate (PWM_OUT_PIN, 100, 100) ; - -// Enable internal pull-ups & start with all off - - for (pin = 0 ; pin < 8 ; ++pin) - { - pullUpDnControl (PIFACE_BASE + pin, PUD_UP) ; - digitalWrite (PIFACE_BASE + pin, 0) ; - } - - for (;;) - { - for (button = 0 ; button < 2 ; ++button) - scanButton (button) ; - - if (digitalRead (PWM_UP) == LOW) - { - pwmValue += 10 ; - if (pwmValue > 100) - pwmValue = 100 ; - - softPwmWrite (PWM_OUT_PIN, pwmValue) ; - printf ("PWM -> %3d\n", pwmValue) ; - - while (digitalRead (PWM_UP) == LOW) - delay (5) ; - } - - if (digitalRead (PWM_DOWN) == LOW) - { - pwmValue -= 10 ; - if (pwmValue < 0) - pwmValue = 0 ; - - softPwmWrite (PWM_OUT_PIN, pwmValue) ; - printf ("PWM -> %3d\n", pwmValue) ; - - while (digitalRead (PWM_DOWN) == LOW) - delay (5) ; - } - - delay (5) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiFace/reaction.c b/other/wiringpi/wiringPi-96344ff/examples/PiFace/reaction.c deleted file mode 100644 index 508450801..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiFace/reaction.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * reaction.c: - * Simple test for the PiFace interface board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - - -int outputs [4] = { 0,0,0,0 } ; - -#define PIFACE 200 - -/* - * light: - * Light up the given LED - actually lights up a pair - ********************************************************************************* - */ - -void light (int led, int value) -{ - led *= 2 ; - digitalWrite (PIFACE + led + 0, value) ; - digitalWrite (PIFACE + led + 1, value) ; -} - -/* - * lightAll: - * All On or Off - ********************************************************************************* - */ - -void lightAll (int onoff) -{ - light (0, onoff) ; - light (1, onoff) ; - light (2, onoff) ; - light (3, onoff) ; -} - - -/* - * waitForNoButtons: - * Wait for all buttons to be released - ********************************************************************************* - */ - -void waitForNoButtons (void) -{ - int i, button ; - - for (;;) - { - button = 0 ; - for (i = 0 ; i < 4 ; ++i) - button += digitalRead (PIFACE + i) ; - - if (button == 4) - break ; - } -} - - -void scanButton (int button) -{ - if (digitalRead (PIFACE + button) == LOW) - { - outputs [button] ^= 1 ; - digitalWrite (PIFACE + button, outputs [button]) ; - } - - while (digitalRead (PIFACE + button) == LOW) - delay (1) ; -} - - -int main (void) -{ - int i, j ; - int led, button ; - unsigned int start, stop ; - - printf ("Raspberry Pi PiFace Reaction Timer\n") ; - printf ("==================================\n") ; - - if (piFaceSetup (PIFACE) == -1) - exit (1) ; - -// Enable internal pull-ups - - for (i = 0 ; i < 8 ; ++i) - pullUpDnControl (PIFACE + i, PUD_UP) ; - - -// Main game loop: -// Put some random LED pairs up for a few seconds, then blank ... - - for (;;) - { - printf ("Press any button to start ... \n") ; fflush (stdout) ; - - for (;;) - { - led = rand () % 4 ; - light (led, 1) ; - delay (10) ; - light (led, 0) ; - - button = 0 ; - for (j = 0 ; j < 4 ; ++j) - button += digitalRead (PIFACE + j) ; - - if (button != 4) - break ; - } - - waitForNoButtons () ; - - printf ("Wait for it ... ") ; fflush (stdout) ; - - led = rand () % 4 ; - delay (rand () % 500 + 1000) ; - light (led, 1) ; - - start = millis () ; - for (button = -1 ; button == -1 ; ) - { - for (j = 0 ; j < 4 ; ++j) - if (digitalRead (PIFACE + j) == 0) // Pushed - { - button = j ; - break ; - } - } - stop = millis () ; - button = 3 - button ; // Correct for the buttons/LEDs reversed - - light (led, 0) ; - - waitForNoButtons () ; - - light (led, 1) ; - - if (button == led) - { - printf ("You got it in %3d mS\n", stop - start) ; - } - else - { - printf ("Missed: You pushed %d - LED was %d\n", button, led) ; - for (;;) - { - light (button, 1) ; - delay (100) ; - light (button, 0) ; - delay (100) ; - i = 0 ; - for (j = 0 ; j < 4 ; ++j) - i += digitalRead (PIFACE + j) ; - if (i != 4) - break ; - } - - waitForNoButtons () ; - } - light (led, 0) ; - delay (4000) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/Makefile b/other/wiringpi/wiringPi-96344ff/examples/PiGlow/Makefile deleted file mode 100644 index f182db721..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -# -# Makefile: -# wiringPi - A "wiring" library for the Raspberry Pi -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O3 -CC = gcc -INCLUDE = -I/usr/local/include -CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe - -LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm - -# Should not alter anything below this line -############################################################################### - -SRC = piGlow0.c piGlow1.c piglow.c - -OBJ = $(SRC:.c=.o) - -BINS = $(SRC:.c=) - -all: $(BINS) - -piGlow0: piGlow0.o - $Q echo [link] - $Q $(CC) -o $@ piGlow0.o $(LDFLAGS) $(LDLIBS) - -piGlow1: piGlow1.o - $Q echo [link] - $Q $(CC) -o $@ piGlow1.o $(LDFLAGS) $(LDLIBS) - -piglow: piglow.o - $Q echo [link] - $Q $(CC) -o $@ piglow.o $(LDFLAGS) $(LDLIBS) - -.c.o: - $Q echo [CC] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) *~ core tags $(BINS) - -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -install: piglow - $Q echo Installing piglow into /usr/local/bin - $Q cp -a piglow /usr/local/bin/piglow - $Q chmod 755 /usr/local/bin/piglow - $Q echo Done. Remember to load the I2C drivers! - -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piGlow0.c b/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piGlow0.c deleted file mode 100644 index d3fe4b969..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piGlow0.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * piglow.c: - * Very simple demonstration of the PiGlow board. - * This uses the SN3218 directly - soon there will be a new PiGlow - * devLib device which will handle the PiGlow board on a more easy - * to use manner... - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -#define LED_BASE 533 - -int main (void) -{ - int i, j ; - - wiringPiSetupSys () ; - - sn3218Setup (LED_BASE) ; - - for (;;) - { - for (i = 0 ; i < 256 ; ++i) - for (j = 0 ; j < 18 ; ++j) - analogWrite (LED_BASE + j, i) ; - - for (i = 255 ; i >= 0 ; --i) - for (j = 0 ; j < 18 ; ++j) - analogWrite (LED_BASE + j, i) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piGlow1.c b/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piGlow1.c deleted file mode 100644 index a00b31e30..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piGlow1.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * piGlow1.c: - * Very simple demonstration of the PiGlow board. - * This uses the piGlow devLib. - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -#define PIGLOW_BASE 533 - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) -#endif - - -/* - * keypressed: clearKeypressed: - * Simple but effective ways to tell if the enter key has been pressed - ********************************************************************************* - */ - -static int keypressed (void) -{ - struct pollfd polls ; - - polls.fd = fileno (stdin) ; - polls.events = POLLIN ; - - return poll (&polls, 1, 0) != 0 ; -} - -static void clearKeypressed (void) -{ - while (keypressed ()) - (void)getchar () ; -} - - -/* - * pulseLed: - * Pulses the LED at position leg, ring from off to a max. value, - * then off again - ********************************************************************************* - */ - -static void pulseLed (int leg, int ring) -{ - int i ; - - for (i = 0 ; i < 140 ; ++i) - { - piGlow1 (leg, ring, i) ; - delay (1) ; - } - delay (10) ; - for (i = 140 ; i >= 0 ; --i) - { - piGlow1 (leg, ring, i) ; - delay (1) ; - } -} - -/* - * pulseLeg: - * Same as above, but a whole leg at a time - ********************************************************************************* - */ - -static void pulseLeg (int leg) -{ - int i ; - - for (i = 0 ; i < 140 ; ++i) - { - piGlowLeg (leg, i) ; delay (1) ; - } - delay (10) ; - for (i = 140 ; i >= 0 ; --i) - { - piGlowLeg (leg, i) ; delay (1) ; - } -} - - -/* - * pulse Ring: - * Same as above, but a whole ring at a time - ********************************************************************************* - */ - -static void pulseRing (int ring) -{ - int i ; - - for (i = 0 ; i < 140 ; ++i) - { - piGlowRing (ring, i) ; delay (1) ; - } - delay (10) ; - for (i = 140 ; i >= 0 ; --i) - { - piGlowRing (ring, i) ; delay (1) ; - } -} - -#define LEG_STEPS 3 - -static int legSequence [] = -{ - 4, 12, 99, - 99, 4, 12, - 12, 99, 4, -} ; - - -#define RING_STEPS 16 - -static int ringSequence [] = -{ - 0, 0, 0, 0, 0, 64, - 0, 0, 0, 0, 64, 64, - 0, 0, 0, 64, 64, 0, - 0, 0, 64, 64, 0, 0, - 0, 64, 64, 0, 0, 0, - 64, 64, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, - 64, 64, 0, 0, 0, 0, - 0, 64, 64, 0, 0, 0, - 0, 0, 64, 64, 0, 0, - 0, 0, 0, 64, 64, 0, - 0, 0, 0, 0, 64, 64, - 0, 0, 0, 0, 0, 64, - 0, 0, 0, 0, 0, 0, -} ; - -/* - * main: - * Our little demo prgoram - ********************************************************************************* - */ - -int main (void) -{ - int i ; - int step, ring, leg ; - -// Always initialise wiringPi: -// Use the Sys method if you don't need to run as root - - wiringPiSetupSys () ; - -// Initialise the piGlow devLib with our chosen pin base - - piGlowSetup (1) ; - -// LEDs, one at a time - - printf ("LEDs, one at a time\n") ; - for (; !keypressed () ;) - for (leg = 0 ; leg < 3 ; ++leg) - { - for (ring = 0 ; ring < 6 ; ++ring) - { - pulseLed (leg, ring) ; - if (keypressed ()) - break ; - } - if (keypressed ()) - break ; - } - clearKeypressed () ; - -// Rings, one at a time - - printf ("Rings, one at a time\n") ; - for (; !keypressed () ;) - for (ring = 0 ; ring < 6 ; ++ring) - { - pulseRing (ring) ; - if (keypressed ()) - break ; - } - clearKeypressed () ; - -// Legs, one at a time - - printf ("Legs, one at a time\n") ; - for (; !keypressed () ;) - for (leg = 0 ; leg < 3 ; ++leg) - { - pulseLeg (leg) ; - if (keypressed ()) - break ; - } - clearKeypressed () ; - - delay (1000) ; - -// Sequence - alternating rings, legs and random - - printf ("Sequence now\n") ; - for (; !keypressed () ;) - { - for (i = 0 ; i < 20 ; ++i) - for (step = 0 ; step < LEG_STEPS ; ++step) - { - for (leg = 0 ; leg < 3 ; ++leg) - piGlowLeg (leg, legSequence [step * 3 + leg]) ; - delay (80) ; - } - - for (i = 0 ; i < 10 ; ++i) - for (step = 0 ; step < RING_STEPS ; ++step) - { - for (ring = 0 ; ring < 6 ; ++ring) - piGlowRing (ring, ringSequence [step * 6 + ring]) ; - delay (80) ; - } - - for (i = 0 ; i < 1000 ; ++i) - { - leg = random () % 3 ; - ring = random () % 6 ; - piGlow1 (leg, ring, random () % 256) ; - delay (5) ; - piGlow1 (leg, ring, 0) ; - } - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piglow.c b/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piglow.c deleted file mode 100644 index e6a2db367..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/PiGlow/piglow.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * piglow.c: - * Very simple demonstration of the PiGlow board. - * This uses the piGlow devLib. - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) -#endif - -#include -#include - -static void failUsage (void) -{ - fprintf (stderr, "Usage examples:\n") ; - fprintf (stderr, " piglow off # All off\n") ; - fprintf (stderr, " piglow red 50 # Light the 3 red LEDs to 50%%\n") ; - fprintf (stderr, " colours are: red, yellow, orange, green, blue and white\n") ; - fprintf (stderr, " piglow all 75 # Light all to 75%%\n") ; - fprintf (stderr, " piglow leg 0 25 # Light leg 0 to 25%%\n") ; - fprintf (stderr, " piglow ring 3 100 # Light ring 3 to 100%%\n") ; - fprintf (stderr, " piglow led 2 5 100 # Light the single LED on Leg 2, ring 5 to 100%%\n") ; - - exit (EXIT_FAILURE) ; -} - -static int getPercent (char *typed) -{ - int percent ; - - percent = atoi (typed) ; - if ((percent < 0) || (percent > 100)) - { - fprintf (stderr, "piglow: percent value out of range\n") ; - exit (EXIT_FAILURE) ; - } - return (percent * 255) / 100 ; -} - - -/* - * main: - * Our little demo prgoram - ********************************************************************************* - */ - -int main (int argc, char *argv []) -{ - int percent ; - int ring, leg ; - -// Always initialise wiringPi: -// Use the Sys method if you don't need to run as root - - wiringPiSetupSys () ; - -// Initialise the piGlow devLib - - piGlowSetup (FALSE) ; - - if (argc == 1) - failUsage () ; - - if ((argc == 2) && (strcasecmp (argv [1], "off") == 0)) - { - for (leg = 0 ; leg < 3 ; ++leg) - piGlowLeg (leg, 0) ; - return 0 ; - } - - if (argc == 3) - { - percent = getPercent (argv [2]) ; - - /**/ if (strcasecmp (argv [1], "red") == 0) - piGlowRing (PIGLOW_RED, percent) ; - else if (strcasecmp (argv [1], "yellow") == 0) - piGlowRing (PIGLOW_YELLOW, percent) ; - else if (strcasecmp (argv [1], "orange") == 0) - piGlowRing (PIGLOW_ORANGE, percent) ; - else if (strcasecmp (argv [1], "green") == 0) - piGlowRing (PIGLOW_GREEN, percent) ; - else if (strcasecmp (argv [1], "blue") == 0) - piGlowRing (PIGLOW_BLUE, percent) ; - else if (strcasecmp (argv [1], "white") == 0) - piGlowRing (PIGLOW_WHITE, percent) ; - else if (strcasecmp (argv [1], "all") == 0) - for (ring = 0 ; ring < 6 ; ++ring) - piGlowRing (ring, percent) ; - else - { - fprintf (stderr, "piglow: invalid colour\n") ; - exit (EXIT_FAILURE) ; - } - return 0 ; - } - - if (argc == 4) - { - /**/ if (strcasecmp (argv [1], "leg") == 0) - { - leg = atoi (argv [2]) ; - if ((leg < 0) || (leg > 2)) - { - fprintf (stderr, "piglow: leg value out of range\n") ; - exit (EXIT_FAILURE) ; - } - percent = getPercent (argv [3]) ; - piGlowLeg (leg, percent) ; - } - else if (strcasecmp (argv [1], "ring") == 0) - { - ring = atoi (argv [2]) ; - if ((ring < 0) || (ring > 5)) - { - fprintf (stderr, "piglow: ring value out of range\n") ; - exit (EXIT_FAILURE) ; - } - percent = getPercent (argv [3]) ; - piGlowRing (ring, percent) ; - } - return 0 ; - } - - if (argc == 5) - { - if (strcasecmp (argv [1], "led") != 0) - failUsage () ; - - leg = atoi (argv [2]) ; - if ((leg < 0) || (leg > 2)) - { - fprintf (stderr, "piglow: leg value out of range\n") ; - exit (EXIT_FAILURE) ; - } - ring = atoi (argv [3]) ; - if ((ring < 0) || (ring > 5)) - { - fprintf (stderr, "piglow: ring value out of range\n") ; - exit (EXIT_FAILURE) ; - } - percent = getPercent (argv [4]) ; - piGlow1 (leg, ring, percent) ; - return 0 ; - } - - failUsage () ; - return 0 ; -} - - diff --git a/other/wiringpi/wiringPi-96344ff/examples/README.TXT b/other/wiringpi/wiringPi-96344ff/examples/README.TXT deleted file mode 100644 index 33263b1c5..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/README.TXT +++ /dev/null @@ -1,18 +0,0 @@ - -wiringPi Examples -================= - -There are now too many examples to compile them all in a sensible time, -and you probably don't want to compile or run them all anyway, so they -have been separated out. - -To compile an individual example, just type - - make exampleName - -To really compile everything: - - make really-all - -The individual tests are: - diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink.c b/other/wiringpi/wiringPi-96344ff/examples/blink.c deleted file mode 100644 index c27a20e30..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * blink.c: - * Standard "blink" program in wiringPi. Blinks an LED connected - * to the first GPIO pin. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -// LED Pin - wiringPi pin 0 is BCM_GPIO 17. - -#define LED 0 - -int main (void) -{ - printf ("Raspberry Pi blink\n") ; - - wiringPiSetup () ; - pinMode (LED, OUTPUT) ; - - for (;;) - { - digitalWrite (LED, HIGH) ; // On - delay (500) ; // mS - digitalWrite (LED, LOW) ; // Off - delay (500) ; - } - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink.rtb b/other/wiringpi/wiringPi-96344ff/examples/blink.rtb deleted file mode 100644 index eb7d26c77..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink.rtb +++ /dev/null @@ -1,30 +0,0 @@ -// blink.rtb: -// Blink program in Return to Basic -// -// Copyright (c) 2012-2013 Gordon Henderson. -//********************************************************************** -// This file is part of wiringPi: -// https://projects.drogon.net/raspberry-pi/wiringpi/ -// -// wiringPi is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// wiringPi 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 Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with wiringPi. If not, see . - *********************************************************************** -// -PinMode (0, 1) // Output -CYCLE - DigitalWrite (0, 1) // Pin 0 ON - WAIT (0.5) // 0.5 seconds - DigitalWrite (0, 0) - WAIT (0.5) -REPEAT -END diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink.sh b/other/wiringpi/wiringPi-96344ff/examples/blink.sh deleted file mode 100755 index 3975bb78d..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -e -# -# blink.sh: -# Standard "blink" program in wiringPi. Blinks an LED connected -# to the first GPIO pin. -# -# Copyright (c) 2012-2013 Gordon Henderson. -####################################################################### -# This file is part of wiringPi: -# https://projects.drogon.net/raspberry-pi/wiringpi/ -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -####################################################################### - -# LED Pin - wiringPi pin 0 is BCM_GPIO 17. - -PIN=0 - -gpio mode $PIN out - -while true; do - gpio write $PIN 1 - sleep 0.5 - gpio write $PIN 0 - sleep 0.5 -done diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink12.c b/other/wiringpi/wiringPi-96344ff/examples/blink12.c deleted file mode 100644 index c9b3d506e..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink12.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * blink12.c: - * Simple sequence over the first 12 GPIO pins - LEDs - * Aimed at the Gertboard, but it's fairly generic. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -// Simple sequencer data -// Triplets of LED, On/Off and delay - -int data [] = -{ - 0, 1, 1, - 1, 1, 1, - 0, 0, 0, 2, 1, 1, - 1, 0, 0, 3, 1, 1, - 2, 0, 0, 4, 1, 1, - 3, 0, 0, 5, 1, 1, - 4, 0, 0, 6, 1, 1, - 5, 0, 0, 7, 1, 1, - 6, 0, 0, 11, 1, 1, - 7, 0, 0, 10, 1, 1, - 11, 0, 0, 13, 1, 1, - 10, 0, 0, 12, 1, 1, - 13, 0, 1, - 12, 0, 1, - - 0, 0, 1, // Extra delay - -// Back again - - 12, 1, 1, - 13, 1, 1, - 12, 0, 0, 10, 1, 1, - 13, 0, 0, 11, 1, 1, - 10, 0, 0, 7, 1, 1, - 11, 0, 0, 6, 1, 1, - 7, 0, 0, 5, 1, 1, - 6, 0, 0, 4, 1, 1, - 5, 0, 0, 3, 1, 1, - 4, 0, 0, 2, 1, 1, - 3, 0, 0, 1, 1, 1, - 2, 0, 0, 0, 1, 1, - 1, 0, 1, - 0, 0, 1, - - 0, 0, 1, // Extra delay - - 0, 9, 0, // End marker - -} ; - - -int main (void) -{ - int pin ; - int dataPtr ; - int l, s, d ; - - printf ("Raspberry Pi - 12-LED Sequence\n") ; - printf ("==============================\n") ; - printf ("\n") ; - printf ("Connect LEDs up to the first 8 GPIO pins, then pins 11, 10, 13, 12 in\n") ; - printf (" that order, then sit back and watch the show!\n") ; - - wiringPiSetup () ; - - for (pin = 0 ; pin < 14 ; ++pin) - pinMode (pin, OUTPUT) ; - - dataPtr = 0 ; - - for (;;) - { - l = data [dataPtr++] ; // LED - s = data [dataPtr++] ; // State - d = data [dataPtr++] ; // Duration (10ths) - - if (s == 9) // 9 -> End Marker - { - dataPtr = 0 ; - continue ; - } - - digitalWrite (l, s) ; - delay (d * 100) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink12drcs.c b/other/wiringpi/wiringPi-96344ff/examples/blink12drcs.c deleted file mode 100644 index 6ee11fd1b..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink12drcs.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * blink12drcs.c: - * Simple sequence over the first 12 GPIO pins - LEDs - * Aimed at the Gertboard, but it's fairly generic. - * This version uses DRC totalk to the ATmega on the Gertboard - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#define GERT_BASE 100 - -static int pinMap [] = -{ - 0, 1, 2, 3, // Pi Native - GERT_BASE + 2, GERT_BASE + 3, GERT_BASE + 4, GERT_BASE + 5, - GERT_BASE + 6, GERT_BASE + 7, GERT_BASE + 8, GERT_BASE + 9, -} ; - -// Simple sequencer data -// Triplets of LED, On/Off and delay - - -int data [] = -{ - 0, 1, 1, - 1, 1, 1, - 0, 0, 0, 2, 1, 1, - 1, 0, 0, 3, 1, 1, - 2, 0, 0, 4, 1, 1, - 3, 0, 0, 5, 1, 1, - 4, 0, 0, 6, 1, 1, - 5, 0, 0, 7, 1, 1, - 6, 0, 0, 8, 1, 1, - 7, 0, 0, 9, 1, 1, - 8, 0, 0, 10, 1, 1, - 9, 0, 0, 11, 1, 1, - 10, 0, 1, - 11, 0, 1, - - 0, 0, 1, // Extra delay - -// Back again - - 11, 1, 1, - 10, 1, 1, - 11, 0, 0, 9, 1, 1, - 10, 0, 0, 8, 1, 1, - 9, 0, 0, 7, 1, 1, - 8, 0, 0, 6, 1, 1, - 7, 0, 0, 5, 1, 1, - 6, 0, 0, 4, 1, 1, - 5, 0, 0, 3, 1, 1, - 4, 0, 0, 2, 1, 1, - 3, 0, 0, 1, 1, 1, - 2, 0, 0, 0, 1, 1, - 1, 0, 1, - 0, 0, 1, - - 0, 0, 1, // Extra delay - - 0, 9, 0, // End marker - -} ; - - -int main (void) -{ - int pin ; - int dataPtr ; - int l, s, d ; - - printf ("Raspberry Pi - 12-LED Sequence\n") ; - printf ("==============================\n") ; - printf ("\n") ; - printf ("Connect LEDs up to the first 4 Pi pins and 8 pins on the ATmega\n") ; - printf (" from PD2 through PB1 in that order,\n") ; - printf (" then sit back and watch the show!\n") ; - - wiringPiSetup () ; - drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ; - - for (pin = 0 ; pin < 12 ; ++pin) - pinMode (pinMap [pin], OUTPUT) ; - - dataPtr = 0 ; - - for (;;) - { - l = data [dataPtr++] ; // LED - s = data [dataPtr++] ; // State - d = data [dataPtr++] ; // Duration (10ths) - - if (s == 9) // 9 -> End Marker - { - dataPtr = 0 ; - continue ; - } - - digitalWrite (pinMap [l], s) ; - delay (d * analogRead (GERT_BASE) / 4) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink6drcs.c b/other/wiringpi/wiringPi-96344ff/examples/blink6drcs.c deleted file mode 100644 index 32f4921e1..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink6drcs.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * blink6drcs.c: - * Simple sequence over 6 pins on a remote DRC board. - * Aimed at the Gertduino, but it's fairly generic. - * This version uses DRC to talk to the ATmega on the Gertduino - * - * Copyright (c) 2012-2014 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#define GERT_BASE 100 - -static int pinMap [] = -{ - GERT_BASE + 6, GERT_BASE + 5, GERT_BASE + 3, GERT_BASE + 10, GERT_BASE + 9, GERT_BASE + 13, -} ; - -// Simple sequencer data -// Triplets of LED, On/Off and delay - - -int data [] = -{ - 0, 1, 1, - 1, 1, 1, - 0, 0, 0, 2, 1, 1, - 1, 0, 0, 3, 1, 1, - 2, 0, 0, 4, 1, 1, - 3, 0, 0, 5, 1, 1, - 4, 0, 1, - 5, 0, 1, - - 0, 0, 1, // Extra delay - -// Back again - - 5, 1, 1, - 4, 1, 1, - 5, 0, 0, 3, 1, 1, - 4, 0, 0, 2, 1, 1, - 3, 0, 0, 1, 1, 1, - 2, 0, 0, 0, 1, 1, - 1, 0, 1, - 0, 0, 1, - - 0, 0, 1, // Extra delay - - 0, 9, 0, // End marker - -} ; - - -int main (void) -{ - int pin ; - int dataPtr ; - int l, s, d ; - - printf ("Raspberry Pi - 6-LED Sequence\n") ; - printf ("=============================\n") ; - printf ("\n") ; - printf (" Use the 2 buttons to temporarily speed up the sequence\n") ; - - wiringPiSetupSys () ; // Not using the Pi's GPIO here - drcSetupSerial (GERT_BASE, 20, "/dev/ttyAMA0", 115200) ; - - for (pin = 0 ; pin < 6 ; ++pin) - pinMode (pinMap [pin], OUTPUT) ; - - pinMode (GERT_BASE + 16, INPUT) ; // Buttons - pinMode (GERT_BASE + 17, INPUT) ; - - pullUpDnControl (GERT_BASE + 16, PUD_UP) ; - pullUpDnControl (GERT_BASE + 17, PUD_UP) ; - - dataPtr = 0 ; - - for (;;) - { - l = data [dataPtr++] ; // LED - s = data [dataPtr++] ; // State - d = data [dataPtr++] ; // Duration (10ths) - - if (s == 9) // 9 -> End Marker - { - dataPtr = 0 ; - continue ; - } - - digitalWrite (pinMap [l], s) ; - delay (d * digitalRead (GERT_BASE + 16) * 15 + digitalRead (GERT_BASE + 17) * 20) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink8-drcn.c b/other/wiringpi/wiringPi-96344ff/examples/blink8-drcn.c deleted file mode 100644 index 96c775b79..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink8-drcn.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * blink8-drcn.c: - * Simple sequence over the first 8 GPIO pins - LEDs - * Aimed at the Ladder board, but it's fairly generic. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -int main (void) -{ - int i, led ; - - printf ("Raspberry Pi - 8-LED Sequencer\n") ; - printf ("==============================\n") ; - printf ("\n") ; - printf ("Connect LEDs to the first 8 GPIO pins and watch ...\n") ; - - int pinBase = 100 ; - -// wiringPiSetup () ; - drcSetupNet (pinBase, 100, "192.168.254.21", "6124", "123456") ; - - for (i = 0 ; i < 8 ; ++i) - pinMode (i + pinBase, OUTPUT) ; - - for (;;) - { - for (led = 0 ; led < 8 ; ++led) - { - digitalWrite (led + pinBase, 1) ; - delay (10) ; - } - - for (led = 0 ; led < 8 ; ++led) - { - digitalWrite (led + pinBase, 0) ; - delay (10) ; - } - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/blink8.c b/other/wiringpi/wiringPi-96344ff/examples/blink8.c deleted file mode 100644 index 602d3c059..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/blink8.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * blink8.c: - * Simple sequence over the first 8 GPIO pins - LEDs - * Aimed at the Gertboard, but it's fairly generic. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -int main (void) -{ - int i, led ; - - printf ("Raspberry Pi - 8-LED Sequencer\n") ; - printf ("==============================\n") ; - printf ("\n") ; - printf ("Connect LEDs to the first 8 GPIO pins and watch ...\n") ; - - wiringPiSetup () ; - - for (i = 0 ; i < 8 ; ++i) - pinMode (i, OUTPUT) ; - - for (;;) - { - for (led = 0 ; led < 8 ; ++led) - { - digitalWrite (led, 1) ; - delay (100) ; - } - - for (led = 0 ; led < 8 ; ++led) - { - digitalWrite (led, 0) ; - delay (100) ; - } - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/clock.c b/other/wiringpi/wiringPi-96344ff/examples/clock.c deleted file mode 100644 index 9a53210a5..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/clock.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * clock.c: - * Demo of the 128x64 graphics based LCD driver. - * This is designed to drive the parallel interface LCD drivers - * based on the popular 12864H controller chip. - * - * This test program assumes the following: - * (Which is currently hard-wired into the driver) - * - * GPIO 0-7 is connected to display data pins 0-7. - * GPIO 10 is CS1 - * GPIO 11 is CS2 - * GPIO 12 is STROBE - * GPIO 10 is RS - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -double clockRadius ; -double thickness, barLen ; -int maxX, maxY ; - -double rads (double degs) -{ - return degs * M_PI / 180.0 ; -} - -void drawClockHands (void) -{ - time_t t ; - struct tm *now ; - double angle, p, x0, y0, x1, y1 ; - int h24, h, m, s ; - char text [20] ; - - time (&t) ; - now = localtime (&t) ; - - h24 = now->tm_hour ; - m = now->tm_min ; - s = now->tm_sec ; - - h = h24 ; - if (h > 12) - h -= 12 ; - -// Hour hand - - angle = h * 30 + m * 0.5 ; - x0 = sin (rads (angle)) * (clockRadius * 0.75) ; - y0 = cos (rads (angle)) * (clockRadius * 0.75) ; - for (p = -3.0 ; p <= 3.0 ; p += 0.2) - { - x1 = sin (rads (angle + p)) * (clockRadius * 0.7) ; - y1 = cos (rads (angle + p)) * (clockRadius * 0.7) ; - lcd128x64line (0, 0, x1, y1, 1) ; - lcd128x64lineTo (x0, y0, 1) ; - } - -// Minute hand - - angle = m * 6 ; - x0 = sin (rads (angle)) * (clockRadius * 0.9) ; - y0 = cos (rads (angle)) * (clockRadius * 0.9) ; - for (p = -1.0 ; p <= 1.0 ; p += 0.2) - { - x1 = sin (rads (angle + p)) * (clockRadius * 0.85) ; - y1 = cos (rads (angle + p)) * (clockRadius * 0.85) ; - lcd128x64line (0, 0, x1, y1, 1) ; - lcd128x64lineTo (x0, y0, 1) ; - } - -// Second hand - - angle = s * 6 ; - x0 = sin (rads (angle)) * (clockRadius * 0.2) ; - y0 = cos (rads (angle)) * (clockRadius * 0.2) ; - x1 = sin (rads (angle)) * (clockRadius * 0.95) ; - y1 = cos (rads (angle)) * (clockRadius * 0.95) ; - lcd128x64line (0 - x0, 0 - y0, x1, y1, 1) ; - lcd128x64circle (0, 0, clockRadius * 0.1, 0, 1) ; - lcd128x64circle (0, 0, clockRadius * 0.05, 1, 1) ; - -// Text: - - sprintf (text, "%02d:%02d:%02d", h24, m, s) ; - lcd128x64puts (32, 24, text, 0, 1) ; - - sprintf (text, "%2d/%2d/%2d", now->tm_mday, now->tm_mon + 1, now->tm_year - 100) ; - lcd128x64puts (32, -23, text, 0, 1) ; -} - -void drawClockFace (void) -{ - int m ; - double d, px1, py1, px2, py2 ; - - lcd128x64clear (0) ; - lcd128x64circle (0,0, clockRadius, 1, TRUE) ; - lcd128x64circle (0,0, clockRadius - thickness, 0, TRUE) ; - -// The four big indicators for 12,15,30 and 45 - - lcd128x64rectangle (- 3, clockRadius - barLen, 3, clockRadius, 1, TRUE) ; // 12 - lcd128x64rectangle (clockRadius - barLen, 3, clockRadius, -3, 1, TRUE) ; // 3 - lcd128x64rectangle (- 3, -clockRadius + barLen, 3, -clockRadius, 1, TRUE) ; // 6 - lcd128x64rectangle (-clockRadius + barLen, 3, -clockRadius, -3, 1, TRUE) ; // 9 - - -// Smaller 5 and 1 minute ticks - - for (m = 0 ; m < 60 ; ++m) - { - px1 = sin (rads (m * 6)) * clockRadius ; - py1 = cos (rads (m * 6)) * clockRadius ; - if ((m % 5) == 0) - d = barLen ; - else - d = barLen / 2.0 ; - - px2 = sin (rads (m * 6)) * (clockRadius - d) ; - py2 = cos (rads (m * 6)) * (clockRadius - d) ; - lcd128x64line (px1, py1, px2, py2, 1) ; - } -} - -void setup (void) -{ - lcd128x64getScreenSize (&maxX, &maxY) ; - clockRadius = maxY / 2 - 1 ; - thickness = maxX / 48 ; - barLen = thickness * 4 ; - lcd128x64setOrigin (32, 32) ; -} - - - - -/* - *********************************************************************** - * The main program - *********************************************************************** - */ - -int main (int argc, char *argv []) -{ - time_t now ; - - wiringPiSetup () ; - - lcd128x64setup () ; - - setup () ; - for (;;) - { - drawClockFace () ; - drawClockHands () ; - lcd128x64update () ; - - now = time (NULL) ; - while (time (NULL) == now) - delay (10) ; - } - - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/delayTest.c b/other/wiringpi/wiringPi-96344ff/examples/delayTest.c deleted file mode 100644 index 4c8b6ca40..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/delayTest.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * delayTest.c: - * Just a little test program I'm using to experiment with - * various timings and latency, etc. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include - -#define CYCLES 1000 - -int main() -{ - int x ; - struct timeval t1, t2 ; - int t ; - int max, min ; - int del ; - int underRuns, overRuns, exactRuns, total ; - int descheds ; - - if (wiringPiSetup () == -1) - return 1 ; - - piHiPri (10) ; sleep (1) ; - -// Baseline test - - gettimeofday (&t1, NULL) ; - gettimeofday (&t2, NULL) ; - - t = t2.tv_usec - t1.tv_usec ; - printf ("Baseline test: %d\n", t); - - for (del = 1 ; del < 200 ; ++del) - { - underRuns = overRuns = exactRuns = total = 0 ; - descheds = 0 ; - max = del ; - min = del ; - - for (x = 0 ; x < CYCLES ; ++x) - { - for (;;) // Repeat this if we get a delay over 999uS - { // -> High probability Linux has deschedulled us - gettimeofday (&t1, NULL) ; - delayMicroseconds (del) ; - gettimeofday (&t2, NULL) ; - - if (t2.tv_usec < t1.tv_usec) // Counter wrapped - t = (1000000 + t2.tv_usec) - t1.tv_usec; - else - t = t2.tv_usec - t1.tv_usec ; - if (t > 999) - { - ++descheds ; - continue ; - } - else - break ; - } - - if (t > max) - { - max = t ; - ++overRuns ; - } - else if (t < min) - { - min = t ; - ++underRuns ; - } - else - ++exactRuns ; - - total += t ; - } - printf ("Delay: %3d. Min: %3d, Max: %3d, Unders: %3d, Overs: %3d, Exacts: %3d, Average: %3d, Descheds: %2d\n", - del, min, max, underRuns, overRuns, exactRuns, total / CYCLES, descheds) ; - fflush (stdout) ; - delay (1) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/ds1302.c b/other/wiringpi/wiringPi-96344ff/examples/ds1302.c deleted file mode 100644 index f1e9e2057..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/ds1302.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * ds1302.c: - * Real Time clock - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include - -#include -#include - -// Register defines - -#define RTC_SECS 0 -#define RTC_MINS 1 -#define RTC_HOURS 2 -#define RTC_DATE 3 -#define RTC_MONTH 4 -#define RTC_DAY 5 -#define RTC_YEAR 6 -#define RTC_WP 7 -#define RTC_TC 8 -#define RTC_BM 31 - - -static unsigned int masks [] = { 0x7F, 0x7F, 0x3F, 0x3F, 0x1F, 0x07, 0xFF } ; - - -/* - * bcdToD: dToBCD: - * BCD decode/encode - ********************************************************************************* - */ - -static int bcdToD (unsigned int byte, unsigned int mask) -{ - unsigned int b1, b2 ; - byte &= mask ; - b1 = byte & 0x0F ; - b2 = ((byte >> 4) & 0x0F) * 10 ; - return b1 + b2 ; -} - -static unsigned int dToBcd (unsigned int byte) -{ - return ((byte / 10) << 4) + (byte % 10) ; -} - - -/* - * ramTest: - * Simple test of the 31 bytes of RAM inside the DS1302 chip - ********************************************************************************* - */ - -static int ramTestValues [] = - { 0x00, 0xFF, 0xAA, 0x55, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0xF0, 0x0F, -1 } ; - -static int ramTest (void) -{ - int addr ; - int got ; - int i = 0 ; - int errors = 0 ; - int testVal ; - - printf ("DS1302 RAM TEST\n") ; - - testVal = ramTestValues [i] ; - - while (testVal != -1) - { - for (addr = 0 ; addr < 31 ; ++addr) - ds1302ramWrite (addr, testVal) ; - - for (addr = 0 ; addr < 31 ; ++addr) - if ((got = ds1302ramRead (addr)) != testVal) - { - printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n", - addr, testVal, got) ; - ++errors ; - } - testVal = ramTestValues [++i] ; - } - - for (addr = 0 ; addr < 31 ; ++addr) - ds1302ramWrite (addr, addr) ; - - for (addr = 0 ; addr < 31 ; ++addr) - if ((got = ds1302ramRead (addr)) != addr) - { - printf ("DS1302 RAM Failure: Address: %2d, Expected: 0x%02X, Got: 0x%02X\n", - addr, addr, got) ; - ++errors ; - } - - if (errors == 0) - printf ("-- DS1302 RAM TEST: OK\n") ; - else - printf ("-- DS1302 RAM TEST FAILURE. %d errors.\n", errors) ; - - return 0 ; -} - -/* - * setLinuxClock: - * Set the Linux clock from the hardware - ********************************************************************************* - */ - -static int setLinuxClock (void) -{ - char dateTime [20] ; - char command [64] ; - int clock [8] ; - - - printf ("Setting the Linux Clock from the DS1302... ") ; fflush (stdout) ; - - ds1302clockRead (clock) ; - -// [MMDDhhmm[[CC]YY][.ss]] - - sprintf (dateTime, "%02d%02d%02d%02d%02d%02d.%02d", - bcdToD (clock [RTC_MONTH], masks [RTC_MONTH]), - bcdToD (clock [RTC_DATE], masks [RTC_DATE]), - bcdToD (clock [RTC_HOURS], masks [RTC_HOURS]), - bcdToD (clock [RTC_MINS], masks [RTC_MINS]), - 20, - bcdToD (clock [RTC_YEAR], masks [RTC_YEAR]), - bcdToD (clock [RTC_SECS], masks [RTC_SECS])) ; - - sprintf (command, "/bin/date %s", dateTime) ; - system (command) ; - - return 0 ; -} - - -/* - * setDSclock: - * Set the DS1302 block from Linux time - ********************************************************************************* - */ - -static int setDSclock (void) -{ - struct tm t ; - time_t now ; - int clock [8] ; - - printf ("Setting the clock in the DS1302 from Linux time... ") ; - - now = time (NULL) ; - gmtime_r (&now, &t) ; - - clock [ 0] = dToBcd (t.tm_sec) ; // seconds - clock [ 1] = dToBcd (t.tm_min) ; // mins - clock [ 2] = dToBcd (t.tm_hour) ; // hours - clock [ 3] = dToBcd (t.tm_mday) ; // date - clock [ 4] = dToBcd (t.tm_mon + 1) ; // months 0-11 --> 1-12 - clock [ 5] = dToBcd (t.tm_wday + 1) ; // weekdays (sun 0) - clock [ 6] = dToBcd (t.tm_year - 100) ; // years - clock [ 7] = 0 ; // W-Protect off - - ds1302clockWrite (clock) ; - - printf ("OK\n") ; - - return 0 ; -} - - - - -int main (int argc, char *argv []) -{ - int i ; - int clock [8] ; - - wiringPiSetup () ; - ds1302setup (0, 1, 2) ; - - if (argc == 2) - { - /**/ if (strcmp (argv [1], "-slc") == 0) - return setLinuxClock () ; - else if (strcmp (argv [1], "-sdsc") == 0) - return setDSclock () ; - else if (strcmp (argv [1], "-rtest") == 0) - return ramTest () ; - else - { - printf ("Usage: ds1302 [-slc | -sdsc | -rtest]\n") ; - return EXIT_FAILURE ; - } - } - - for (i = 0 ;; ++i) - { - printf ("%5d: ", i) ; - - ds1302clockRead (clock) ; - printf (" %2d:%02d:%02d", - bcdToD (clock [2], masks [2]), bcdToD (clock [1], masks [1]), bcdToD (clock [0], masks [0])) ; - - printf (" %2d/%02d/%04d", - bcdToD (clock [3], masks [3]), bcdToD (clock [4], masks [4]), bcdToD (clock [6], masks [6]) + 2000) ; - - printf ("\n") ; - - delay (200) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/header.h b/other/wiringpi/wiringPi-96344ff/examples/header.h deleted file mode 100644 index 82f723d3c..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/header.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * file.c: - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - diff --git a/other/wiringpi/wiringPi-96344ff/examples/isr-osc.c b/other/wiringpi/wiringPi-96344ff/examples/isr-osc.c deleted file mode 100644 index a872ee3ab..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/isr-osc.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * isr-osc.c: - * Wait for Interrupt test program - ISR method - interrupt oscillator - * - * How to test: - * - * IMPORTANT: To run this test we connect 2 GPIO pins together, but - * before we do that YOU must make sure that they are both setup - * the right way. If they are set to outputs and one is high and one low, - * then you connect the wire, you'll create a short and that won't be good. - * - * Before making the connection, type: - * gpio mode 0 output - * gpio write 0 0 - * gpio mode 1 input - * then you can connect them together. - * - * Run the program, then: - * gpio write 0 1 - * gpio write 0 0 - * - * at which point it will trigger an interrupt and the program will - * then do the up/down toggling for itself and run at full speed, and - * it will report the number of interrupts recieved every second. - * - * Copyright (c) 2013 Gordon Henderson. projects@drogon.net - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include - - -// What GPIO input are we using? -// This is a wiringPi pin number - -#define OUT_PIN 0 -#define IN_PIN 1 - -// globalCounter: -// Global variable to count interrupts -// Should be declared volatile to make sure the compiler doesn't cache it. - -static volatile int globalCounter = 0 ; - -/* - * myInterrupt: - ********************************************************************************* - */ - -void myInterrupt (void) -{ - digitalWrite (OUT_PIN, 1) ; - ++globalCounter ; - digitalWrite (OUT_PIN, 0) ; -} - - -/* - ********************************************************************************* - * main - ********************************************************************************* - */ - -int main (void) -{ - int myCounter = 0 ; - int lastCounter = 0 ; - - if (wiringPiSetup () < 0) - { - fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ; - return 1 ; - } - - pinMode (OUT_PIN, OUTPUT) ; - pinMode (IN_PIN, INPUT) ; - - if (wiringPiISR (IN_PIN, INT_EDGE_FALLING, &myInterrupt) < 0) - { - fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ; - return 1 ; - } - - for (;;) - { - printf ("Waiting ... ") ; fflush (stdout) ; - - while (myCounter == globalCounter) - delay (1000) ; - - printf (" Done. counter: %6d: %6d\n", - globalCounter, myCounter - lastCounter) ; - lastCounter = myCounter ; - myCounter = globalCounter ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/isr.c b/other/wiringpi/wiringPi-96344ff/examples/isr.c deleted file mode 100644 index abc6aec99..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/isr.c +++ /dev/null @@ -1,110 +0,0 @@ -/* - * isr.c: - * Wait for Interrupt test program - ISR method - * - * How to test: - * Use the SoC's pull-up and pull down resistors that are avalable - * on input pins. So compile & run this program (via sudo), then - * in another terminal: - * gpio mode 0 up - * gpio mode 0 down - * at which point it should trigger an interrupt. Toggle the pin - * up/down to generate more interrupts to test. - * - * Copyright (c) 2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include - - -// globalCounter: -// Global variable to count interrupts -// Should be declared volatile to make sure the compiler doesn't cache it. - -static volatile int globalCounter [8] ; - - -/* - * myInterrupt: - ********************************************************************************* - */ - -void myInterrupt0 (void) { ++globalCounter [0] ; } -void myInterrupt1 (void) { ++globalCounter [1] ; } -void myInterrupt2 (void) { ++globalCounter [2] ; } -void myInterrupt3 (void) { ++globalCounter [3] ; } -void myInterrupt4 (void) { ++globalCounter [4] ; } -void myInterrupt5 (void) { ++globalCounter [5] ; } -void myInterrupt6 (void) { ++globalCounter [6] ; } -void myInterrupt7 (void) { ++globalCounter [7] ; } - - -/* - ********************************************************************************* - * main - ********************************************************************************* - */ - -int main (void) -{ - int gotOne, pin ; - int myCounter [8] ; - - for (pin = 0 ; pin < 8 ; ++pin) - globalCounter [pin] = myCounter [pin] = 0 ; - - wiringPiSetup () ; - - wiringPiISR (0, INT_EDGE_FALLING, &myInterrupt0) ; - wiringPiISR (1, INT_EDGE_FALLING, &myInterrupt1) ; - wiringPiISR (2, INT_EDGE_FALLING, &myInterrupt2) ; - wiringPiISR (3, INT_EDGE_FALLING, &myInterrupt3) ; - wiringPiISR (4, INT_EDGE_FALLING, &myInterrupt4) ; - wiringPiISR (5, INT_EDGE_FALLING, &myInterrupt5) ; - wiringPiISR (6, INT_EDGE_FALLING, &myInterrupt6) ; - wiringPiISR (7, INT_EDGE_FALLING, &myInterrupt7) ; - - for (;;) - { - gotOne = 0 ; - printf ("Waiting ... ") ; fflush (stdout) ; - - for (;;) - { - for (pin = 0 ; pin < 8 ; ++pin) - { - if (globalCounter [pin] != myCounter [pin]) - { - printf (" Int on pin %d: Counter: %5d\n", pin, globalCounter [pin]) ; - myCounter [pin] = globalCounter [pin] ; - ++gotOne ; - } - } - if (gotOne != 0) - break ; - } - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/lcd-adafruit.c b/other/wiringpi/wiringPi-96344ff/examples/lcd-adafruit.c deleted file mode 100644 index 47c9b9b25..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/lcd-adafruit.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * lcd-adafruit.c: - * Text-based LCD driver test code - * This is designed to drive the Adafruit RGB LCD Plate - * with the additional 5 buttons for the Raspberry Pi - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include - -#include -#include -#include - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - - -// Defines for the Adafruit Pi LCD interface board - -#define AF_BASE 100 -#define AF_RED (AF_BASE + 6) -#define AF_GREEN (AF_BASE + 7) -#define AF_BLUE (AF_BASE + 8) - -#define AF_E (AF_BASE + 13) -#define AF_RW (AF_BASE + 14) -#define AF_RS (AF_BASE + 15) - -#define AF_DB4 (AF_BASE + 12) -#define AF_DB5 (AF_BASE + 11) -#define AF_DB6 (AF_BASE + 10) -#define AF_DB7 (AF_BASE + 9) - -#define AF_SELECT (AF_BASE + 0) -#define AF_RIGHT (AF_BASE + 1) -#define AF_DOWN (AF_BASE + 2) -#define AF_UP (AF_BASE + 3) -#define AF_LEFT (AF_BASE + 4) - - -// User-Defined character test - -static unsigned char newChar [8] = -{ - 0b00100, - 0b00100, - 0b00000, - 0b00100, - 0b01110, - 0b11011, - 0b11011, - 0b10001, -} ; - -// Global lcd handle: - -static int lcdHandle ; - -/* - * usage: - ********************************************************************************* - */ - -int usage (const char *progName) -{ - fprintf (stderr, "Usage: %s colour\n", progName) ; - return EXIT_FAILURE ; -} - - -/* - * scrollMessage: - ********************************************************************************* - */ - -static const char *message = - " " - "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/" - " " ; - -void scrollMessage (int line, int width) -{ - char buf [32] ; - static int position = 0 ; - static int timer = 0 ; - - if (millis () < timer) - return ; - - timer = millis () + 200 ; - - strncpy (buf, &message [position], width) ; - buf [width] = 0 ; - lcdPosition (lcdHandle, 0, line) ; - lcdPuts (lcdHandle, buf) ; - - if (++position == (strlen (message) - width)) - position = 0 ; -} - - -/* - * setBacklightColour: - * The colour outputs are inverted. - ********************************************************************************* - */ - -static void setBacklightColour (int colour) -{ - colour &= 7 ; - - digitalWrite (AF_RED, !(colour & 1)) ; - digitalWrite (AF_GREEN, !(colour & 2)) ; - digitalWrite (AF_BLUE, !(colour & 4)) ; -} - - -/* - * adafruitLCDSetup: - * Setup the Adafruit board by making sure the additional pins are - * set to the correct modes, etc. - ********************************************************************************* - */ - -static void adafruitLCDSetup (int colour) -{ - int i ; - -// Backlight LEDs - - pinMode (AF_RED, OUTPUT) ; - pinMode (AF_GREEN, OUTPUT) ; - pinMode (AF_BLUE, OUTPUT) ; - setBacklightColour (colour) ; - -// Input buttons - - for (i = 0 ; i <= 4 ; ++i) - { - pinMode (AF_BASE + i, INPUT) ; - pullUpDnControl (AF_BASE + i, PUD_UP) ; // Enable pull-ups, switches close to 0v - } - -// Control signals - - pinMode (AF_RW, OUTPUT) ; digitalWrite (AF_RW, LOW) ; // Not used with wiringPi - always in write mode - -// The other control pins are initialised with lcdInit () - - lcdHandle = lcdInit (2, 16, 4, AF_RS, AF_E, AF_DB4,AF_DB5,AF_DB6,AF_DB7, 0,0,0,0) ; - - if (lcdHandle < 0) - { - fprintf (stderr, "lcdInit failed\n") ; - exit (EXIT_FAILURE) ; - } -} - - -/* - * waitForEnter: - * On the Adafruit display, wait for the select button - ********************************************************************************* - */ - -static void waitForEnter (void) -{ - printf ("Press SELECT to continue: ") ; fflush (stdout) ; - - while (digitalRead (AF_SELECT) == HIGH) // Wait for push - delay (1) ; - - while (digitalRead (AF_SELECT) == LOW) // Wait for release - delay (1) ; - - printf ("OK\n") ; -} - - -/* - * speedTest: - * Test the update speed of the display - ********************************************************************************* - */ - -static void speedTest (void) -{ - unsigned int start, end, taken ; - int times ; - - lcdClear (lcdHandle) ; - start = millis () ; - for (times = 0 ; times < 10 ; ++times) - { - lcdPuts (lcdHandle, "0123456789ABCDEF") ; - lcdPuts (lcdHandle, "0123456789ABCDEF") ; - } - end = millis () ; - taken = (end - start) / 10; - - lcdClear (lcdHandle) ; - lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Speed: %dmS", taken) ; - lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "For full update") ; - - waitForEnter () ; - - lcdClear (lcdHandle) ; - lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "Time: %dmS", taken / 32) ; - lcdPosition (lcdHandle, 0, 1) ; lcdPrintf (lcdHandle, "Per character") ; - - waitForEnter () ; - - lcdClear (lcdHandle) ; - lcdPosition (lcdHandle, 0, 0) ; lcdPrintf (lcdHandle, "%d cps...", 32000 / taken) ; - - waitForEnter () ; -} - - -/* - * The works - ********************************************************************************* - */ - -int main (int argc, char *argv[]) -{ - int colour ; - int cols = 16 ; - int waitForRelease = FALSE ; - - struct tm *t ; - time_t tim ; - - char buf [32] ; - - if (argc != 2) - return usage (argv [0]) ; - - printf ("Raspberry Pi Adafruit LCD test\n") ; - printf ("==============================\n") ; - - colour = atoi (argv [1]) ; - - wiringPiSetupSys () ; - mcp23017Setup (AF_BASE, 0x20) ; - - adafruitLCDSetup (colour) ; - - lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ; - lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; - - waitForEnter () ; - - lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, "Adafruit RGB LCD") ; - - waitForEnter () ; - - lcdCharDef (lcdHandle, 2, newChar) ; - - lcdClear (lcdHandle) ; - lcdPosition (lcdHandle, 0, 0) ; - lcdPuts (lcdHandle, "User Char: ") ; - lcdPutchar (lcdHandle, 2) ; - - lcdCursor (lcdHandle, TRUE) ; - lcdCursorBlink (lcdHandle, TRUE) ; - - waitForEnter () ; - - lcdCursor (lcdHandle, FALSE) ; - lcdCursorBlink (lcdHandle, FALSE) ; - - speedTest () ; - - lcdClear (lcdHandle) ; - - for (;;) - { - scrollMessage (0, cols) ; - - tim = time (NULL) ; - t = localtime (&tim) ; - - sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ; - - lcdPosition (lcdHandle, (cols - 8) / 2, 1) ; - lcdPuts (lcdHandle, buf) ; - -// Check buttons to cycle colour - -// If Up or Down are still pushed, then skip - - if (waitForRelease) - { - if ((digitalRead (AF_UP) == LOW) || (digitalRead (AF_DOWN) == LOW)) - continue ; - else - waitForRelease = FALSE ; - } - - if (digitalRead (AF_UP) == LOW) // Pushed - { - colour = colour + 1 ; - if (colour == 8) - colour = 0 ; - setBacklightColour (colour) ; - waitForRelease = TRUE ; - } - - if (digitalRead (AF_DOWN) == LOW) // Pushed - { - colour = colour - 1 ; - if (colour == -1) - colour = 7 ; - setBacklightColour (colour) ; - waitForRelease = TRUE ; - } - - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/lcd.c b/other/wiringpi/wiringPi-96344ff/examples/lcd.c deleted file mode 100644 index 510f56204..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/lcd.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - * lcd.c: - * Text-based LCD driver. - * This is designed to drive the parallel interface LCD drivers - * based in the Hitachi HD44780U controller and compatables. - * - * This test program assumes the following: - * - * 8-bit displays: - * GPIO 0-7 is connected to display data pins 0-7. - * GPIO 11 is the RS pin. - * GPIO 10 is the Strobe/E pin. - * - * For 4-bit interface: - * GPIO 4-7 is connected to display data pins 4-7. - * GPIO 11 is the RS pin. - * GPIO 10 is the Strobe/E pin. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -static unsigned char newChar [8] = -{ - 0b11111, - 0b10001, - 0b10001, - 0b10101, - 0b11111, - 0b10001, - 0b10001, - 0b11111, -} ; - - -// Global lcd handle: - -static int lcdHandle ; - -/* - * usage: - ********************************************************************************* - */ - -int usage (const char *progName) -{ - fprintf (stderr, "Usage: %s bits cols rows\n", progName) ; - return EXIT_FAILURE ; -} - - -/* - * scrollMessage: - ********************************************************************************* - */ - -static const char *message = - " " - "Wiring Pi by Gordon Henderson. HTTP://WIRINGPI.COM/" - " " ; - -void scrollMessage (int line, int width) -{ - char buf [32] ; - static int position = 0 ; - static int timer = 0 ; - - if (millis () < timer) - return ; - - timer = millis () + 200 ; - - strncpy (buf, &message [position], width) ; - buf [width] = 0 ; - lcdPosition (lcdHandle, 0, line) ; - lcdPuts (lcdHandle, buf) ; - - if (++position == (strlen (message) - width)) - position = 0 ; -} - - -/* - * pingPong: - * Bounce a character - only on 4-line displays - ********************************************************************************* - */ - -static void pingPong (int lcd, int cols) -{ - static int position = 0 ; - static int dir = 0 ; - - if (dir == 0) // Setup - { - dir = 1 ; - lcdPosition (lcdHandle, 0, 3) ; - lcdPutchar (lcdHandle, '*') ; - return ; - } - - lcdPosition (lcdHandle, position, 3) ; - lcdPutchar (lcdHandle, ' ') ; - position += dir ; - - if (position == cols) - { - dir = -1 ; - --position ; - } - - if (position < 0) - { - dir = 1 ; - ++position ; - } - - lcdPosition (lcdHandle, position, 3) ; - lcdPutchar (lcdHandle, '#') ; -} - - -/* - * waitForEnter: - ********************************************************************************* - */ - -static void waitForEnter (void) -{ - printf ("Press ENTER to continue: ") ; - (void)fgetc (stdin) ; -} - - -/* - * The works - ********************************************************************************* - */ - -int main (int argc, char *argv[]) -{ - int i ; - int lcd ; - int bits, rows, cols ; - - struct tm *t ; - time_t tim ; - - char buf [32] ; - - if (argc != 4) - return usage (argv [0]) ; - - printf ("Raspberry Pi LCD test\n") ; - printf ("=====================\n") ; - - bits = atoi (argv [1]) ; - cols = atoi (argv [2]) ; - rows = atoi (argv [3]) ; - - if (!((rows == 1) || (rows == 2) || (rows == 4))) - { - fprintf (stderr, "%s: rows must be 1, 2 or 4\n", argv [0]) ; - return EXIT_FAILURE ; - } - - if (!((cols == 16) || (cols == 20))) - { - fprintf (stderr, "%s: cols must be 16 or 20\n", argv [0]) ; - return EXIT_FAILURE ; - } - - wiringPiSetup () ; - - if (bits == 4) - lcdHandle = lcdInit (rows, cols, 4, 11,10, 4,5,6,7,0,0,0,0) ; - else - lcdHandle = lcdInit (rows, cols, 8, 11,10, 0,1,2,3,4,5,6,7) ; - - if (lcdHandle < 0) - { - fprintf (stderr, "%s: lcdInit failed\n", argv [0]) ; - return -1 ; - } - - lcdPosition (lcdHandle, 0, 0) ; lcdPuts (lcdHandle, "Gordon Henderson") ; - lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; - - waitForEnter () ; - - if (rows > 1) - { - lcdPosition (lcdHandle, 0, 1) ; lcdPuts (lcdHandle, " wiringpi.com ") ; - - if (rows == 4) - { - lcdPosition (lcdHandle, 0, 2) ; - for (i = 0 ; i < ((cols - 1) / 2) ; ++i) - lcdPuts (lcdHandle, "=-") ; - lcdPuts (lcdHandle, "=3") ; - - lcdPosition (lcdHandle, 0, 3) ; - for (i = 0 ; i < ((cols - 1) / 2) ; ++i) - lcdPuts (lcdHandle, "-=") ; - lcdPuts (lcdHandle, "-4") ; - } - } - - waitForEnter () ; - - lcdCharDef (lcdHandle, 2, newChar) ; - - lcdClear (lcdHandle) ; - lcdPosition (lcdHandle, 0, 0) ; - lcdPuts (lcdHandle, "User Char: ") ; - lcdPutchar (lcdHandle, 2) ; - - lcdCursor (lcdHandle, TRUE) ; - lcdCursorBlink (lcdHandle, TRUE) ; - - waitForEnter () ; - - lcdCursor (lcdHandle, FALSE) ; - lcdCursorBlink (lcdHandle, FALSE) ; - lcdClear (lcdHandle) ; - - for (;;) - { - scrollMessage (0, cols) ; - - if (rows == 1) - continue ; - - tim = time (NULL) ; - t = localtime (&tim) ; - - sprintf (buf, "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec) ; - - lcdPosition (lcdHandle, (cols - 8) / 2, 1) ; - lcdPuts (lcdHandle, buf) ; - - if (rows == 2) - continue ; - - sprintf (buf, "%02d/%02d/%04d", t->tm_mday, t->tm_mon + 1, t->tm_year+1900) ; - - lcdPosition (lcdHandle, (cols - 10) / 2, 2) ; - lcdPuts (lcdHandle, buf) ; - - pingPong (lcd, cols) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/lowPower.c b/other/wiringpi/wiringPi-96344ff/examples/lowPower.c deleted file mode 100644 index e901e7faa..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/lowPower.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * lowPower.c: - * Check the Pi's LOW-Power signal. - * - * This is a demonstration program that could be turned into some sort - * of logger via e.g. syslog - however it's also probably something - * that might be better handled by a future kernel - who knows. - * - * Copyright (c) 2014 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - - -#define LOW_POWER 35 - -/* - * lowPower: - * This is an ISR that waits for the low-power signal going low and - * prints the result. - ********************************************************************************* - */ - -void lowPower (void) -{ - time_t t ; - - time (&t) ; - printf ("%s: LOW POWER DETECTED\n", ctime (&t)) ; -} - - -/* - ********************************************************************************* - * main - ********************************************************************************* - */ - -int main (void) -{ - wiringPiSetupGpio () ; // GPIO mode as it's an internal pin - - wiringPiISR (LOW_POWER, INT_EDGE_FALLING, &lowPower) ; - - for (;;) - delay (1000) ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/max31855.c b/other/wiringpi/wiringPi-96344ff/examples/max31855.c deleted file mode 100644 index 36b3cf60d..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/max31855.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * max31855.c: - * SPI Thermocouple interface chip - * - * Copyright (c) 2015 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include - -#include -#include - -int main (int argc, char *argv []) -{ - int i = 0 ; - - wiringPiSetup () ; - max31855Setup (200, 0) ; - max31855Setup (400, 1) ; - - for (;;) - { - if (i == 0) - { - printf ("+------+------+------+------++------+------+------+------+\n") ; - printf ("| Raw | Err | C | F || Raw | Err | C | F |\n") ; - printf ("+------+------+------+------++------+------+------+------+\n") ; - } - - printf ("| %4d | %4d | %4d | %4d |", analogRead (200), analogRead (201), analogRead (202), analogRead (203)) ; - printf ("| %4d | %4d | %4d | %4d |\n", analogRead (400), analogRead (401), analogRead (402), analogRead (403)) ; - delay (500) ; - - if (++i == 10) - i = 0 ; - - } - -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/nes.c b/other/wiringpi/wiringPi-96344ff/examples/nes.c deleted file mode 100644 index 31908e8a0..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/nes.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * nes.c: - * Test program for an old NES controller connected to the Pi. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -#define BLANK "| " - -int main () -{ - int joystick ; - unsigned int buttons ; - - if (wiringPiSetup () == -1) - { - fprintf (stdout, "oops: %s\n", strerror (errno)) ; - return 1 ; - } - - if ((joystick = setupNesJoystick (2, 1, 0)) == -1) - { - fprintf (stdout, "Unable to setup joystick\n") ; - return 1 ; - } - - for (;;) - { - buttons = readNesJoystick (joystick) ; - - if ((buttons & NES_UP) != 0) printf ("| UP " ) ; else printf (BLANK) ; - if ((buttons & NES_DOWN) != 0) printf ("| DOWN " ) ; else printf (BLANK) ; - if ((buttons & NES_LEFT) != 0) printf ("| LEFT " ) ; else printf (BLANK) ; - if ((buttons & NES_RIGHT) != 0) printf ("|RIGHT " ) ; else printf (BLANK) ; - if ((buttons & NES_SELECT) != 0) printf ("|SELECT" ) ; else printf (BLANK) ; - if ((buttons & NES_START) != 0) printf ("|START " ) ; else printf (BLANK) ; - if ((buttons & NES_A) != 0) printf ("| A " ) ; else printf (BLANK) ; - if ((buttons & NES_B) != 0) printf ("| B " ) ; else printf (BLANK) ; - printf ("|\n") ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/okLed.c b/other/wiringpi/wiringPi-96344ff/examples/okLed.c deleted file mode 100644 index 930f266b5..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/okLed.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * okLed.c: - * Make the OK LED on the Pi Pulsate... - * - * Originally posted to the Raspberry Pi forums: - * http://www.raspberrypi.org/phpBB3/viewtopic.php?p=162581#p162581 - * - * Compile this and store it somewhere, then kick it off at boot time - * e.g. by putting it in /etc/rc.local and running it in the - * background & - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include - -#include -#include - -// The OK/Act LED is connected to BCM_GPIO pin 16 - -#define OK_LED 16 - -int main () -{ - int fd, i ; - - wiringPiSetupGpio () ; - -// Change the trigger on the OK/Act LED to "none" - - if ((fd = open ("/sys/class/leds/led0/trigger", O_RDWR)) < 0) - { - fprintf (stderr, "Unable to change LED trigger: %s\n", strerror (errno)) ; - return 1 ; - } - write (fd, "none\n", 5) ; - close (fd) ; - - softPwmCreate (OK_LED, 0, 100) ; - - for (;;) - { - for (i = 0 ; i <= 100 ; ++i) - { - softPwmWrite (OK_LED, i) ; - delay (10) ; - } - delay (50) ; - - for (i = 100 ; i >= 0 ; --i) - { - softPwmWrite (OK_LED, i) ; - delay (10) ; - } - delay (10) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/pwm.c b/other/wiringpi/wiringPi-96344ff/examples/pwm.c deleted file mode 100644 index 816c8322e..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/pwm.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * pwm.c: - * This tests the hardware PWM channel. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include -#include - -int main (void) -{ - int bright ; - - printf ("Raspberry Pi wiringPi PWM test program\n") ; - - if (wiringPiSetup () == -1) - exit (1) ; - - pinMode (1, PWM_OUTPUT) ; - - for (;;) - { - for (bright = 0 ; bright < 1024 ; ++bright) - { - pwmWrite (1, bright) ; - delay (1) ; - } - - for (bright = 1023 ; bright >= 0 ; --bright) - { - pwmWrite (1, bright) ; - delay (1) ; - } - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/Makefile b/other/wiringpi/wiringPi-96344ff/examples/q2w/Makefile deleted file mode 100644 index 8f773bffc..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/Makefile +++ /dev/null @@ -1,84 +0,0 @@ -# -# Makefile: -# wiringPi - A "wiring" library for the Raspberry Pi -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012-2013 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O3 -CC = gcc -INCLUDE = -I/usr/local/include -CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe - -LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm - -############################################################################### - -SRC = blink.c button.c blink-io.c volts.c bright.c - -OBJ = $(SRC:.c=.o) - -BINS = $(SRC:.c=) - -all: $(BINS) - -blink: blink.o - $Q echo [link] - $Q $(CC) -o $@ blink.o $(LDFLAGS) $(LDLIBS) - -blink-io: blink-io.o - $Q echo [link] - $Q $(CC) -o $@ blink-io.o $(LDFLAGS) $(LDLIBS) - -button: button.o - $Q echo [link] - $Q $(CC) -o $@ button.o $(LDFLAGS) $(LDLIBS) - -volts: volts.o - $Q echo [link] - $Q $(CC) -o $@ volts.o $(LDFLAGS) $(LDLIBS) - -bright: bright.o - $Q echo [link] - $Q $(CC) -o $@ bright.o $(LDFLAGS) $(LDLIBS) - - -.c.o: - $Q echo [CC] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) *~ core tags $(BINS) - -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/binary.c b/other/wiringpi/wiringPi-96344ff/examples/q2w/binary.c deleted file mode 100644 index 3c987c6ac..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/binary.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * binary.c: - * Using the Quick 2 wire 16-bit GPIO expansion board to output - * a binary counter. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#define Q2W_BASE 100 - -int main (void) -{ - int i, bit ; - -// Enable the on-goard GPIO - - wiringPiSetup () ; - -// Add in the mcp23017 on the q2w board - - mcp23017Setup (Q2W_BASE, 0x20) ; - - printf ("Raspberry Pi - quite2Wire MCP23017 Test\n") ; - -// On-board button Input: - - pinMode (0, INPUT) ; - -// First 10 pins on q2w board as outputs: - - for (i = 0 ; i < 10 ; ++i) - pinMode (Q2W_BASE + i, OUTPUT) ; - -// Last pin as an input with the internal pull-up enabled - - pinMode (Q2W_BASE + 15, INPUT) ; - pullUpDnControl (Q2W_BASE + 15, PUD_UP) ; - -// Loop, outputting a binary number, -// Go faster with the button, or stop if the -// on-board button is pushed - - for (;;) - { - for (i = 0 ; i < 1024 ; ++i) - { - for (bit = 0 ; bit < 10 ; ++bit) - digitalWrite (Q2W_BASE + bit, i & (1 << bit)) ; - - while (digitalRead (0) == HIGH) // While pushed - delay (1) ; - - if (digitalRead (Q2W_BASE + 15) == HIGH) // Not Pushed - delay (100) ; - } - } - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/blink-io.c b/other/wiringpi/wiringPi-96344ff/examples/q2w/blink-io.c deleted file mode 100644 index 4dd427657..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/blink-io.c +++ /dev/null @@ -1,61 +0,0 @@ -/* - * blink-io.c: - * Simple "blink" test for the Quick2Wire 16-pin IO board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#define LED 1 -#define Q2W_BASE 100 - -int main (void) -{ - -// Enable the on-goard GPIO - - wiringPiSetup () ; - -// Add in the mcp23017 on the q2w board - - mcp23017Setup (Q2W_BASE, 0x20) ; - - printf ("Raspberry Pi - Quick2Wire MCP23017 Blink Test\n") ; - -// Blink the on-board LED as well as one on the mcp23017 - - pinMode (LED, OUTPUT) ; - pinMode (Q2W_BASE + 0, OUTPUT) ; - - for (;;) - { - digitalWrite (LED, HIGH) ; - digitalWrite (Q2W_BASE + 0, HIGH) ; - delay (500) ; - digitalWrite (LED, LOW) ; - digitalWrite (Q2W_BASE + 0, LOW) ; - delay (500) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/blink.c b/other/wiringpi/wiringPi-96344ff/examples/q2w/blink.c deleted file mode 100644 index 62b694a7c..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/blink.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - * blink.c: - * Simple "blink" test for the Quick2Wire interface board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -#define LED 1 - -int main (void) -{ - -// Enable the on-goard GPIO - - wiringPiSetup () ; - - printf ("Raspberry Pi - Quick2Wire Mainboard LED Blink Test\n") ; - - pinMode (LED, OUTPUT) ; - - for (;;) - { - digitalWrite (LED, HIGH) ; - delay (500) ; - digitalWrite (LED, LOW) ; - delay (500) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/blink.sh b/other/wiringpi/wiringPi-96344ff/examples/q2w/blink.sh deleted file mode 100755 index bb6107a27..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/blink.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/sh -e -# -# blink.sh: -# Standard "blink" program in wiringPi. Blinks an LED connected -# to the LED on the Quick2Wire board -# -# Copyright (c) 2012-2013 Gordon Henderson. -####################################################################### -# This file is part of wiringPi: -# https://projects.drogon.net/raspberry-pi/wiringpi/ -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -####################################################################### - -# LED Pin - wiringPi pin 1 is BCM_GPIO 18. - -LED=1 - -gpio mode $LED out - -while true; do - gpio write $LED 1 - sleep 0.5 - gpio write $LED 0 - sleep 0.5 -done diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/bright.c b/other/wiringpi/wiringPi-96344ff/examples/q2w/bright.c deleted file mode 100644 index 231883416..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/bright.c +++ /dev/null @@ -1,59 +0,0 @@ -/* - * bright.c: - * Vary the Q2W LED brightness with the analog card - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#define LED 1 -#define Q2W_ABASE 120 - -int main (void) -{ - int value ; - -// Enable the on-goard GPIO - - wiringPiSetup () ; - -// Add in the pcf8591 on the q2w board - - pcf8591Setup (Q2W_ABASE, 0x48) ; - - printf ("Raspberry Pi - Quick2Wire Analog Test\n") ; - -// Setup the LED - - pinMode (LED, PWM_OUTPUT) ; - pwmWrite (LED, 0) ; - - for (;;) - { - value = analogRead (Q2W_ABASE + 0) ; - pwmWrite (LED, value * 4) ; - delay (10) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/button.c b/other/wiringpi/wiringPi-96344ff/examples/q2w/button.c deleted file mode 100644 index 1781f02fd..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/button.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * button.c: - * Simple button test for the Quick2Wire interface board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include - -#define BUTTON 0 -#define LED1 1 -#define LED2 7 - -int main (void) -{ - -// Enable the on-goard GPIO - - wiringPiSetup () ; - - printf ("Raspberry Pi - Quick2Wire Mainboard Button & LED Test\n") ; - - pinMode (BUTTON, INPUT) ; - pinMode (LED1, OUTPUT) ; - pinMode (LED2, OUTPUT) ; - - digitalWrite (LED1, HIGH) ; // On-board LED on - digitalWrite (LED2, LOW) ; // 2nd LED off - - for (;;) - { - if (digitalRead (BUTTON) == HIGH) // Swap LED states - { - digitalWrite (LED1, LOW) ; - digitalWrite (LED2, HIGH) ; - while (digitalRead (BUTTON) == HIGH) - delay (1) ; - digitalWrite (LED1, HIGH) ; - digitalWrite (LED2, LOW) ; - } - delay (1) ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/q2w/volts.c b/other/wiringpi/wiringPi-96344ff/examples/q2w/volts.c deleted file mode 100644 index e0910933f..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/q2w/volts.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * volts.c: - * Read in all 4 analogs on the Q2W analog board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#define LED 1 -#define Q2W_ABASE 120 - -int main (void) -{ - int value, pin ; - -// Enable the on-goard GPIO - - wiringPiSetup () ; - - pinMode (LED, OUTPUT) ; // On-board LED - -// Add in the pcf8591 on the q2w board - - pcf8591Setup (Q2W_ABASE, 0x48) ; - - printf ("Raspberry Pi - Quick2Wire Voltmeter\n") ; - - for (;;) - { - for (pin = 0 ; pin < 4 ; ++pin) - { - value = analogRead (Q2W_ABASE + pin) ; - printf (" %5.2f", (double)value * 3.3 / 255.0) ; - } - printf ("\r") ; fflush (stdout) ; - - delay (100) ; - digitalWrite (LED, !digitalRead (LED)) ; // Flicker the LED - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/rht03.c b/other/wiringpi/wiringPi-96344ff/examples/rht03.c deleted file mode 100644 index 854f837fa..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/rht03.c +++ /dev/null @@ -1,86 +0,0 @@ -/* - * rht03.c: - * Driver for the MaxDetect series sensors - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include - -#define RHT03_PIN 7 - -/* - *********************************************************************** - * The main program - *********************************************************************** - */ - -int main (void) -{ - int result, temp, rh ; - int minT, maxT, minRH, maxRH ; - - int numGood, numBad ; - - wiringPiSetup () ; - piHiPri (55) ; - - minT = 1000 ; - maxT = -1000 ; - - minRH = 1000 ; - maxRH = -1000 ; - - numGood = numBad = 0 ; - - for (;;) - { - delay (100) ; - - result = readRHT03 (RHT03_PIN, &temp, &rh) ; - - if (!result) - { - printf (".") ; - fflush (stdout) ; - ++numBad ; - continue ; - } - - ++numGood ; - - if (temp < minT) minT = temp ; - if (temp > maxT) maxT = temp ; - if (rh < minRH) minRH = rh ; - if (rh > maxRH) maxRH = rh ; - - printf ("\r%6d, %6d: ", numGood, numBad) ; - printf ("Temp: %5.1f, RH: %5.1f%%", temp / 10.0, rh / 10.0) ; - printf (" Max/Min Temp: %5.1f:%5.1f", maxT / 10.0, minT / 10.0) ; - printf (" Max/Min RH: %5.1f:%5.1f", maxRH / 10.0, minRH / 10.0) ; - - printf ("\n") ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/Makefile b/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/Makefile deleted file mode 100644 index 2471f6990..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/Makefile +++ /dev/null @@ -1,79 +0,0 @@ -# -# Makefile: -# wiringPi - A "wiring" library for the Raspberry Pi -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O3 -CC = gcc -INCLUDE = -I/usr/local/include -CFLAGS = $(DEBUG) -Wall $(INCLUDE) -Winline -pipe - -LDFLAGS = -L/usr/local/lib -LDLIBS = -lwiringPi -lwiringPiDev -lpthread -lm - -# Should not alter anything below this line -############################################################################### - -SRC = scphat.c test.c - -OBJ = $(SRC:.c=.o) - -BINS = $(SRC:.c=) - -all: $(BINS) - -test: test.o - $Q echo [link] - $Q $(CC) -o $@ test.o $(LDFLAGS) $(LDLIBS) - -scphat: scphat.o - $Q echo [link] - $Q $(CC) -o $@ scphat.o $(LDFLAGS) $(LDLIBS) - - -.c.o: - $Q echo [CC] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) *~ core tags $(BINS) - -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -install: scphat - $Q echo Installing scphat into /usr/local/bin - $Q cp -a scphat /usr/local/bin/scphat - $Q chmod 755 /usr/local/bin/scphat - $Q echo Done. Remember to load the I2C drivers if needed. - -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE diff --git a/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/scphat.c b/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/scphat.c deleted file mode 100644 index 8f90badeb..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/scphat.c +++ /dev/null @@ -1,230 +0,0 @@ -/* - * scphat.c: - * Little program to allow use of the Pimoroni Sctoll Phat - * from the command-line. - * - * Copyright (c) 2015-2016 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include -#include - -static char *progName ; - - -/* - * checkArgs: - * Count the arguments for each little function - ********************************************************************************* - */ - -static void checkArgs (char *command, int num, int arg, int argc) -{ - if ((arg + num) < argc) - return ; - - fprintf (stderr, "%s: Not enough data for %s command.\n", progName, command) ; - exit (EXIT_FAILURE) ; -} - - -/* - * doClear: - * Clear the display - ********************************************************************************* - */ - -static int doClear (void) -{ - scrollPhatClear () ; - return 1 ; -} - - -/* - * doBright - ********************************************************************************* - */ - -static int doBright (int arg, int argc, char *argv []) -{ - checkArgs ("bright", 1, arg, argc) ; - scrollPhatIntensity (atoi (argv [arg+1])) ; - return 2 ; -} - - - -/* - * doPlot - ********************************************************************************* - */ - -static int doPlot (int arg, int argc, char *argv []) -{ - checkArgs ("plot", 2, arg, argc) ; - scrollPhatPoint (atoi (argv [arg+1]), atoi (argv [arg+2]), 1) ; - scrollPhatUpdate () ; - return 3 ; -} - - -/* - * doLine - ********************************************************************************* - */ - -static int doLine (int arg, int argc, char *argv []) -{ - checkArgs ("line", 4, arg, argc) ; - scrollPhatLine (atoi (argv [arg+1]), atoi (argv [arg+2]), - atoi (argv [arg+3]), atoi (argv [arg+4]), 1) ; - scrollPhatUpdate () ; - return 5 ; -} - - -/* - * doLineTo - ********************************************************************************* - */ - -static int doLineTo (int arg, int argc, char *argv []) -{ - checkArgs ("lineto", 2, arg, argc) ; - scrollPhatLineTo (atoi (argv [arg+1]), atoi (argv [arg+2]), 1) ; - scrollPhatUpdate () ; - return 3 ; -} - - -/* - * doWait - ********************************************************************************* - */ - -static int doWait (int arg, int argc, char *argv []) -{ - checkArgs ("wait", 1, arg, argc) ; - delay (atoi (argv [arg+1]) * 100) ; - scrollPhatUpdate () ; - return 2 ; -} - - -/* - * doSpeed - ********************************************************************************* - */ - -static int doSpeed (int arg, int argc, char *argv []) -{ - checkArgs ("speed", 1, arg, argc) ; - scrollPhatPrintSpeed (atoi (argv [arg+1])) ; - return 2 ; -} - - -/* - * doScroll - ********************************************************************************* - */ - -static int doScroll (int arg, int argc, char *argv []) -{ - checkArgs ("scroll", 1, arg, argc) ; - scrollPhatPuts (argv [arg+1]) ; - return 2 ; -} - - -static void failUsage (void) -{ - fprintf (stderr, "Usage: %s command [paremters] ...\n", progName) ; - fprintf (stderr, " commands:\n") ; - fprintf (stderr, " clear/cls - Clear the display\n") ; - fprintf (stderr, " bright N - Set display brightness; 1-100\n") ; - fprintf (stderr, " plot X Y - Set a single pixel at location X Y; 0-10, 0-4\n") ; - fprintf (stderr, " line X1 Y1 X2 Y2 - Draw a line from the 2 points\n") ; - fprintf (stderr, " lineto X2 Y2 - Draw a line from the last point to the new one\n") ; - fprintf (stderr, " wait/delay N - Wait for N 10ths seconds\n") ; - fprintf (stderr, " speed N - Set scrolling speed (cps)\n") ; - fprintf (stderr, " scroll S - Scroll the given string\n") ; - fprintf (stderr, "\n") ; - fprintf (stderr, " Example: %s plot 0 0 wait 50 scroll \" Hello \"\n", progName) ; - exit (EXIT_FAILURE) ; -} - - -/* - * the works - ********************************************************************************* - */ - -int main (int argc, char *argv []) -{ - int arg = 1 ; - char *command ; - - progName = argv [0] ; - - wiringPiSetupSys () ; - - if (scrollPhatSetup () != 0) - { - fprintf (stderr, "%s: Unable to initialise the scrollPhat: %s\n", progName, strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - - progName = argv [0] ; - - if (argc < 2) - { - fprintf (stderr, "%s: Nothing to do...\n", argv [0]) ; - failUsage () ; - } - - while (arg != argc) - { - command = argv [arg] ; - /**/ if (strcasecmp (command, "clear") == 0) arg += doClear () ; - else if (strcasecmp (command, "cls") == 0) arg += doClear () ; - else if (strcasecmp (command, "bright") == 0) arg += doBright (arg, argc, argv) ; - else if (strcasecmp (command, "plot") == 0) arg += doPlot (arg, argc, argv) ; - else if (strcasecmp (command, "line") == 0) arg += doLine (arg, argc, argv) ; - else if (strcasecmp (command, "lineto") == 0) arg += doLineTo (arg, argc, argv) ; - else if (strcasecmp (command, "wait") == 0) arg += doWait (arg, argc, argv) ; - else if (strcasecmp (command, "delay") == 0) arg += doWait (arg, argc, argv) ; - else if (strcasecmp (command, "speed") == 0) arg += doSpeed (arg, argc, argv) ; - else if (strcasecmp (command, "scroll") == 0) arg += doScroll (arg, argc, argv) ; - else - { - fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [arg]) ; - failUsage () ; - } - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/test.c b/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/test.c deleted file mode 100644 index e4d802186..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/scrollPhat/test.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * test.c: - * Little test program forthe Pimoroni Scroll Phat. - * - * Copyright (c) 2015-2016 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include - - -/* - * prompt: - * Simple prompt & wait - ********************************************************************************* - */ - -static void prompt (const char *p) -{ - printf (" %s. Press ENTER: ", p) ; - (void)getchar () ; -} - - -/* - * the works - ********************************************************************************* - */ - -int main (void) -{ - int x, y ; - - printf ("\n") ; - printf ("Scroll Phat Test program\n") ; - printf ("========================\n") ; - - if (scrollPhatSetup () != 0) - { - printf ("Unable to initialise the scrollPhat: %s\n", strerror (errno)) ; - exit (1) ; - } - - printf ("-> Scroll Phat initialised OK\n") ; - printf ("... Basic display tests.\n\n") ; - - prompt ("Display ought to be blank") ; - -// Light all pixels using one point at a time - - for (y = 0 ; y < 5 ; ++y) - for (x = 0 ; x < 12 ; ++x) - scrollPhatPoint (x, y, 1) ; - scrollPhatUpdate () ; - - prompt ("Display ought to be all lit-up") ; - -// Big rectangle - - scrollPhatClear () ; - scrollPhatRectangle (0,0, 10, 4, 1, 0) ; - scrollPhatUpdate () ; - - prompt ("There should now be a rectangle round the outside") ; - - scrollPhatLine (0,0, 10,4, 1) ; - scrollPhatLine (0,4, 10,0, 1) ; - scrollPhatUpdate () ; - - prompt ("Diagonal lines") ; - - scrollPhatIntensity (1) ; - - prompt ("Minimum brightness") ; - - scrollPhatIntensity (100) ; - - prompt ("Maximum brightness") ; - - scrollPhatIntensity (10) ; - - prompt ("Default brightness") ; - - scrollPhatClear () ; - - printf (" Message Test...Press Ctrl-C to exit: ") ; - fflush (stdout) ; - - scrollPhatPrintSpeed (75) ; - for (;;) - scrollPhatPuts (" Welcome to the scroll phat from Pimoroni ") ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/serialRead.c b/other/wiringpi/wiringPi-96344ff/examples/serialRead.c deleted file mode 100644 index 9ee11ac29..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/serialRead.c +++ /dev/null @@ -1,48 +0,0 @@ -/* - * serial.c: - * Example program to read bytes from the Serial line - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include - -int main () -{ - int fd ; - - if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) - { - fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; - return 1 ; - } - -// Loop, getting and printing characters - - for (;;) - { - putchar (serialGetchar (fd)) ; - fflush (stdout) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/serialTest.c b/other/wiringpi/wiringPi-96344ff/examples/serialTest.c deleted file mode 100644 index 0d6da5f08..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/serialTest.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * serialTest.c: - * Very simple program to test the serial port. Expects - * the port to be looped back to itself - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -int main () -{ - int fd ; - int count ; - unsigned int nextTime ; - - if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0) - { - fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; - return 1 ; - } - - if (wiringPiSetup () == -1) - { - fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ; - return 1 ; - } - - nextTime = millis () + 300 ; - - for (count = 0 ; count < 256 ; ) - { - if (millis () > nextTime) - { - printf ("\nOut: %3d: ", count) ; - fflush (stdout) ; - serialPutchar (fd, count) ; - nextTime += 300 ; - ++count ; - } - - delay (3) ; - - while (serialDataAvail (fd)) - { - printf (" -> %3d", serialGetchar (fd)) ; - fflush (stdout) ; - } - } - - printf ("\n") ; - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/servo.c b/other/wiringpi/wiringPi-96344ff/examples/servo.c deleted file mode 100644 index aa1ab0524..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/servo.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * servo.c: - * Test of the softServo code. - * Do not use this code - use the servoBlaster kernel module instead - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -int main () -{ - if (wiringPiSetup () == -1) - { - fprintf (stdout, "oops: %s\n", strerror (errno)) ; - return 1 ; - } - - softServoSetup (0, 1, 2, 3, 4, 5, 6, 7) ; - - softServoWrite (0, 0) ; -/* - softServoWrite (1, 1000) ; - softServoWrite (2, 1100) ; - softServoWrite (3, 1200) ; - softServoWrite (4, 1300) ; - softServoWrite (5, 1400) ; - softServoWrite (6, 1500) ; - softServoWrite (7, 2200) ; -*/ - - for (;;) - delay (10) ; - -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/softPwm.c b/other/wiringpi/wiringPi-96344ff/examples/softPwm.c deleted file mode 100644 index 11f7ad0a8..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/softPwm.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * softPwm.c: - * Test of the software PWM driver. Needs 8 LEDs connected - * to the Pi - e.g. Ladder board. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -#define RANGE 100 -#define NUM_LEDS 8 - -int ledMap [NUM_LEDS] = { 0, 1, 2, 3, 4, 5, 6, 7 } ; - -int values [NUM_LEDS] = { 0, 25, 50, 75, 100, 75, 50, 25 } ; - -int main () -{ - int i, j ; - char buf [80] ; - - wiringPiSetup () ; - - for (i = 0 ; i < NUM_LEDS ; ++i) - { - softPwmCreate (ledMap [i], 0, RANGE) ; - printf ("%3d, %3d, %3d\n", i, ledMap [i], values [i]) ; - } - - fgets (buf, 80, stdin) ; - -// Bring all up one by one: - - for (i = 0 ; i < NUM_LEDS ; ++i) - for (j = 0 ; j <= 100 ; ++j) - { - softPwmWrite (ledMap [i], j) ; - delay (10) ; - } - - fgets (buf, 80, stdin) ; - -// All Down - - for (i = 100 ; i > 0 ; --i) - { - for (j = 0 ; j < NUM_LEDS ; ++j) - softPwmWrite (ledMap [j], i) ; - delay (10) ; - } - - fgets (buf, 80, stdin) ; - - for (;;) - { - for (i = 0 ; i < NUM_LEDS ; ++i) - softPwmWrite (ledMap [i], values [i]) ; - - delay (50) ; - - i = values [0] ; - for (j = 0 ; j < NUM_LEDS - 1 ; ++j) - values [j] = values [j + 1] ; - values [NUM_LEDS - 1] = i ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/softTone.c b/other/wiringpi/wiringPi-96344ff/examples/softTone.c deleted file mode 100644 index 2f46783e9..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/softTone.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * softTone.c: - * Test of the softTone module in wiringPi - * Plays a scale out on pin 3 - connect pizeo disc to pin 3 & 0v - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include - -#define PIN 3 - -int scale [8] = { 262, 294, 330, 349, 392, 440, 494, 525 } ; - -int main () -{ - int i ; - - wiringPiSetup () ; - - softToneCreate (PIN) ; - - for (;;) - { - for (i = 0 ; i < 8 ; ++i) - { - printf ("%3d\n", i) ; - softToneWrite (PIN, scale [i]) ; - delay (500) ; - } - } -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/speed.c b/other/wiringpi/wiringPi-96344ff/examples/speed.c deleted file mode 100644 index 0a42b3629..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/speed.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * speed.c: - * Simple program to measure the speed of the various GPIO - * access mechanisms. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include -#include -#include - -#define FAST_COUNT 10000000 -#define SLOW_COUNT 1000000 -#define PASSES 5 - -void speedTest (int pin, int maxCount) -{ - int count, sum, perSec, i ; - unsigned int start, end ; - - sum = 0 ; - - for (i = 0 ; i < PASSES ; ++i) - { - start = millis () ; - for (count = 0 ; count < maxCount ; ++count) - digitalWrite (pin, 1) ; - end = millis () ; - printf (" %6d", end - start) ; - fflush (stdout) ; - sum += (end - start) ; - } - - digitalWrite (pin, 0) ; - printf (". Av: %6dmS", sum / PASSES) ; - perSec = (int)(double)maxCount / (double)((double)sum / (double)PASSES) * 1000.0 ; - printf (": %7d/sec\n", perSec) ; -} - - -int main (void) -{ - printf ("Raspberry Pi wiringPi GPIO speed test program\n") ; - printf ("=============================================\n") ; - -// Start the standard way - - printf ("\nNative wiringPi method: (%8d iterations)\n", FAST_COUNT) ; - wiringPiSetup () ; - pinMode (0, OUTPUT) ; - speedTest (0, FAST_COUNT) ; - -// GPIO - - printf ("\nNative GPIO method: (%8d iterations)\n", FAST_COUNT) ; - wiringPiSetupGpio () ; - pinMode (17, OUTPUT) ; - speedTest (17, FAST_COUNT) ; - -// Phys - - printf ("\nPhysical pin GPIO method: (%8d iterations)\n", FAST_COUNT) ; - wiringPiSetupPhys () ; - pinMode (11, OUTPUT) ; - speedTest (11, FAST_COUNT) ; - -// Switch to SYS mode: - - system ("/usr/local/bin/gpio export 17 out") ; - printf ("\n/sys/class/gpio method: (%8d iterations)\n", SLOW_COUNT) ; - wiringPiSetupSys () ; - speedTest (17, SLOW_COUNT) ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/spiSpeed.c b/other/wiringpi/wiringPi-96344ff/examples/spiSpeed.c deleted file mode 100644 index 0208f0a2b..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/spiSpeed.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * spiSpeed.c: - * Code to measure the SPI speed/latency. - * Copyright (c) 2014 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -#include -#include -#include -#include -#include -#include -//#include -//#include -//#include - -#include -#include - -#define TRUE (1==1) -#define FALSE (!TRUE) - -#define SPI_CHAN 0 -#define NUM_TIMES 100 -#define MAX_SIZE (1024*1024) - -static int myFd ; - - -void spiSetup (int speed) -{ - if ((myFd = wiringPiSPISetup (SPI_CHAN, speed)) < 0) - { - fprintf (stderr, "Can't open the SPI bus: %s\n", strerror (errno)) ; - exit (EXIT_FAILURE) ; - } -} - - -int main (void) -{ - int speed, times, size ; - unsigned int start, end ; - int spiFail ; - unsigned char *myData ; - double timePerTransaction, perfectTimePerTransaction, dataSpeed ; - - if ((myData = malloc (MAX_SIZE)) == NULL) - { - fprintf (stderr, "Unable to allocate buffer: %s\n", strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - - wiringPiSetup () ; - - for (speed = 1 ; speed <= 32 ; speed *= 2) - { - printf ("+-------+--------+----------+----------+-----------+------------+\n") ; - printf ("| MHz | Size | mS/Trans | TpS | Mb/Sec | Latency mS |\n") ; - printf ("+-------+--------+----------+----------+-----------+------------+\n") ; - - spiFail = FALSE ; - spiSetup (speed * 1000000) ; - for (size = 1 ; size <= MAX_SIZE ; size *= 2) - { - printf ("| %5d | %6d ", speed, size) ; - - start = millis () ; - for (times = 0 ; times < NUM_TIMES ; ++times) - if (wiringPiSPIDataRW (SPI_CHAN, myData, size) == -1) - { - printf ("SPI failure: %s\n", strerror (errno)) ; - spiFail = TRUE ; - break ; - } - end = millis () ; - - if (spiFail) - break ; - - timePerTransaction = ((double)(end - start) / (double)NUM_TIMES) / 1000.0 ; - dataSpeed = (double)(size * 8) / (1024.0 * 1024.0) / timePerTransaction ; - perfectTimePerTransaction = ((double)(size * 8)) / ((double)(speed * 1000000)) ; - - printf ("| %8.3f ", timePerTransaction * 1000.0) ; - printf ("| %8.1f ", 1.0 / timePerTransaction) ; - printf ("| %9.5f ", dataSpeed) ; - printf ("| %8.5f ", (timePerTransaction - perfectTimePerTransaction) * 1000.0) ; - printf ("|\n") ; - - } - - close (myFd) ; - printf ("+-------+--------+----------+----------+-----------+------------+\n") ; - printf ("\n") ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/examples/wfi.c b/other/wiringpi/wiringPi-96344ff/examples/wfi.c deleted file mode 100644 index 6bb68927e..000000000 --- a/other/wiringpi/wiringPi-96344ff/examples/wfi.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * wfi.c: - * Wait for Interrupt test program - * - * This program demonstrates the use of the waitForInterrupt() - * function in wiringPi. It listens to a button input on - * BCM_GPIO pin 17 (wiringPi pin 0) - * - * The biggest issue with this method is that it really only works - * well in Sys mode. - * - * Jan 2013: This way of doing things is sort of deprecated now, see - * the wiringPiISR() function instead and the isr.c test program here. - * - * Copyright (c) 2012-2013 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include - -// A 'key' which we can lock and unlock - values are 0 through 3 -// This is interpreted internally as a pthread_mutex by wiringPi -// which is hiding some of that to make life simple. - -#define COUNT_KEY 0 - -// What BCM_GPIO input are we using? - -#define BUTTON_PIN 17 - -// Debounce time in mS - -#define DEBOUNCE_TIME 100 - - -// globalCounter: -// Global variable to count interrupts -// Should be declared volatile to make sure the compiler doesn't cache it. - -static volatile int globalCounter = 0 ; - - -/* - * waitForIt: - * This is a thread created using the wiringPi simplified threading - * mechanism. It will wait on an interrupt on the button and increment - * a counter. - ********************************************************************************* - */ - -PI_THREAD (waitForIt) -{ - int state = 0 ; - int debounceTime = 0 ; - - (void)piHiPri (10) ; // Set this thread to be high priority - - for (;;) - { - if (waitForInterrupt (BUTTON_PIN, -1) > 0) // Got it - { -// Bouncing? - - if (millis () < debounceTime) - { - debounceTime = millis () + DEBOUNCE_TIME ; - continue ; - } - -// We have a valid one - - state ^= 1 ; - - piLock (COUNT_KEY) ; - ++globalCounter ; - piUnlock (COUNT_KEY) ; - -// Wait for key to be released - - while (digitalRead (BUTTON_PIN) == LOW) - delay (1) ; - - debounceTime = millis () + DEBOUNCE_TIME ; - } - } -} - - -/* - * setup: - * Demo a crude but effective way to initialise the hardware - ********************************************************************************* - */ - -void setup (void) -{ - -// Use the gpio program to initialise the hardware -// (This is the crude, but effective) - - system ("gpio edge 17 falling") ; - -// Setup wiringPi - - wiringPiSetupSys () ; - -// Fire off our interrupt handler - - piThreadCreate (waitForIt) ; - -} - - -/* - * main - ********************************************************************************* - */ - -int main (void) -{ - int lastCounter = 0 ; - int myCounter = 0 ; - - setup () ; - - for (;;) - { - printf ("Waiting ... ") ; fflush (stdout) ; - - while (myCounter == lastCounter) - { - piLock (COUNT_KEY) ; - myCounter = globalCounter ; - piUnlock (COUNT_KEY) ; - delay (500) ; - } - - printf (" Done. myCounter: %5d\n", myCounter) ; - lastCounter = myCounter ; - } - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/gpio/COPYING.LESSER b/other/wiringpi/wiringPi-96344ff/gpio/COPYING.LESSER deleted file mode 100644 index 65c5ca88a..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/COPYING.LESSER +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser 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 -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/other/wiringpi/wiringPi-96344ff/gpio/Makefile b/other/wiringpi/wiringPi-96344ff/gpio/Makefile deleted file mode 100644 index f41a005e1..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -# -# Makefile: -# The gpio command: -# A swiss-army knige of GPIO shenanigans. -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012-2016 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -DESTDIR?=/usr -PREFIX?=/local - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O2 -CC = gcc -INCLUDE = -I$(DESTDIR)$(PREFIX)/include -CFLAGS = $(DEBUG) -Wall -Wextra $(INCLUDE) -Winline -pipe - -LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib -LIBS = -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt - -# May not need to alter anything below this line -############################################################################### - -SRC = gpio.c readall.c pins.c - -OBJ = $(SRC:.c=.o) - -all: gpio - -version.h: ../VERSION - $Q echo Need to run newVersion above. - -gpio: $(OBJ) - $Q echo [Link] - $Q $(CC) -o $@ $(OBJ) $(LDFLAGS) $(LIBS) - -.c.o: - $Q echo [Compile] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -.PHONY: clean -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) gpio *~ core tags *.bak - -.PHONY: tags -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -.PHONY: install -install: gpio - $Q echo "[Install]" - $Q cp gpio $(DESTDIR)$(PREFIX)/bin -ifneq ($(WIRINGPI_SUID),0) - $Q chown root.root $(DESTDIR)$(PREFIX)/bin/gpio - $Q chmod 4755 $(DESTDIR)$(PREFIX)/bin/gpio -endif - $Q mkdir -p $(DESTDIR)$(PREFIX)/man/man1 - $Q cp gpio.1 $(DESTDIR)$(PREFIX)/man/man1 - -.PHONY: install-deb -install-deb: gpio - $Q echo "[Install: deb]" - $Q install -m 0755 -d ~/wiringPi/debian-template/wiringPi/usr/bin - $Q install -m 0755 gpio ~/wiringPi/debian-template/wiringPi/usr/bin - $Q install -m 0755 -d ~/wiringPi/debian-template/wiringPi/man/man1 - $Q install -m 0644 gpio.1 ~/wiringPi/debian-template/wiringPi/man/man1 - -.PHONY: uninstall -uninstall: - $Q echo "[UnInstall]" - $Q rm -f $(DESTDIR)$(PREFIX)/bin/gpio - $Q rm -f $(DESTDIR)$(PREFIX)/man/man1/gpio.1 - -.PHONY: depend -depend: - makedepend -Y $(SRC) - -# DO NOT DELETE - -gpio.o: ../version.h diff --git a/other/wiringpi/wiringPi-96344ff/gpio/gpio.1 b/other/wiringpi/wiringPi-96344ff/gpio/gpio.1 deleted file mode 100644 index e5490d6cb..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/gpio.1 +++ /dev/null @@ -1,370 +0,0 @@ -.TH GPIO 1 "September 2015" wiringPi "Command-Line access to Raspberry Pi's GPIO" - -.SH NAME -gpio \- Command-line access to Raspberry Pi's GPIO - -.SH SYNOPSIS -.B gpio -.B \-v -.PP -.B gpio -.B [ \-g | \-1 ] -.B mode/read/write/aread/awrite/wb/pwm/clock/toggle/blink ... -.PP -.B gpio -.B [ \-x extension:params ] -.B mode/read/write/aread/awrite/pwm/toggle/blink ... -.PP -.B gpio -.B [ \-p ] -.B read/write/toggle/blink -.B ... -.PP -.B gpio -.B readall -.PP -.B gpio -.B unexportall/exports -.PP -.B gpio -.B export/edge/unexport -.B ... -.PP -.B gpio -.B wfi -.B ... -.PP -.B gpio -.B drive -group value -.PP -.B gpio -.B usbp -high | low -.PP -.B gpio -.B pwm-bal/pwm-ms -.PP -.B gpio -.B pwmr -range -.PP -.B gpio -.B load \ i2c/spi ... -.PP -.B gpio -.B gbr -channel -.PP -.B gpio -.B gbw -channel value - -.SH DESCRIPTION - -.B GPIO -is a swiss army knife of a command line tool to allow the user easy -access to the GPIO pins on the Raspberry Pi and the SPI A/D and D/A -converters on the Gertboard. It's designed for simple testing and -diagnostic purposes, but can be used in shell scripts for general if -somewhat slow control of the GPIO pins. - -It can also control the IO's on the PiFace IO board and load the SPI and I2C -kernel modules if required. - -Additionally, it can be used to set the exports in the \fI/sys/class/gpio\fR -system directory to allow subsequent programs to use the \fR/sys/class/gpio\fR -interface without needing to be run as root. - -.SH OPTIONS - -.TP -.B \-v -Output the current version including the board revision of the Raspberry Pi. - -.TP -.B \-g -Use the BCM_GPIO pins numbers rather than wiringPi pin numbers. -\fINote:\fR The BCM_GPIO pin numbers are always used with the -export and edge commands. - -.TP -.B \-1 -Use the physical pin numbers rather than wiringPi pin numbers. -\fINote:\fR that this applies to the P1 connector only. It is not possible to -use pins on the Revision 2 P5 connector this way, and as with \-g the -BCM_GPIO pin numbers are always used with the export and edge commands. - -.TP -.B \-x extension -This causes the named extension to be initialised. Extensions -comprise of a name (e.g. mcp23017) followed by a colon, then the -pin-base, then more optional parameters depending on the extension type. -See the web page on http://wiringpi.com/the-gpio-utility/ - -.TP -.B \-p -Use the PiFace interface board and its corresponding pin numbers. The PiFace -will always appear at pin number 200 in the gpio command. You can assign any -pin numbers you like in your own programs though. - -.TP -.B read -Read the digital value of the given pin and print 0 or 1 to represent the -respective logic levels. - -.TP -.B write -Write the given value (0 or 1) to the pin. You need to set the pin -to output mode first. - -.TP -.B toggle -Changes the state of a GPIO pin; 0 to 1, or 1 to 0. - -Note unlike the blink command, the pin must be in output mode first. - -.TP -.B blink -Blinks the given pin on/off. Press Control-C to exit. - -Note: This command explicitly sets the pin to output mode. - -.TP -.B aread -Read the analog value of the given pin. This needs to be used in -conjunction with a -x flag to add in an extension that handles analog -inputs. - -e.g. gpio -x mcp3002:200:0 aread 200 - -will read the first analog input on an mcp3002 SPI ADC chip. - -.TP -.B awrite -Write the analog value to the given pin. This needs to be used in -conjunction with a -x flag to add in an extension that handles analog -inputs. - -e.g. gpio -x mcp4802:200:0 awrite 200 128 - -will write the value 128 to the first DAC port on an mcp4802 chip on -the Pi's SPI bus 0. - - -.TP -.B wb -Write the given byte to the 8 main GPIO pins. You can prefix it with 0x -to specify a hexadecimal number. You need to set pins to output mode -first. - -.TP -.B readall -Output a table of all GPIO pins values. The values represent the actual values read -if the pin is in input mode, or the last value written if the pin is in output -mode. - -The readall command is usable with an extension module (via the -x parameter), -but it's unable to determine pin modes or states, so will perform both a -digital and analog read on each pin in-turn. - -.TP -.B pwm -Write a PWM value (0-1023) to the given pin. The pin needs to be put -into PWM mode first. - -.TP -.B clock -Set the output frequency on the given pin. The pin needs to be put into -clock mode first. - -.TP -.B mode -Set a pin into \fIinput\fR, \fIoutput\fR or \fIpwm\fR mode. Can also -use the literals \fIup\fR, \fIdown\fR or \fItri\fR to set the internal -pull-up, pull-down or tristate (off) controls. - -The ALT modes can also be set using \fIalt0\fR, \fIalt1\fR, ... \fIalt5\fR. - -.TP -.B unexportall -Un-Export all the GPIO pins in the /sys/class/gpio directory. - -.TP -.B exports -Print a list (if any) of all the exported GPIO pins and their current values. - -.TP -.B export -Export a GPIO pin in the \fI/sys/class/gpio\fR directory. Use like the -mode command above however only \fIin\fR, \fIout\fR, \fIhigh\fR and -\fRlow\fR are supported at this time. Note that the pin number is the -\fBBCM_GPIO\fR number and not the wiringPi number. The \fIhigh\fR and -\fIlow\fR commands pre-set the output value at the same time as the -export to output mode. - -Once a GPIO pin has been exported, the \fBgpio\fR program changes the -ownership of the \fI/sys/class/gpio/gpioX/value\fR and if present in -later kernels, the \fI/sys/class/gpio/gpioX/edge\fR pseudo files to -that of the user running the \fBgpio\fR program. This means that you -can have a small script of gpio exports to setup the gpio pins as your -program requires without the need to run anything as root, or with the -sudo command. - -.TP -.B edge -This exports a GPIO pin in the \fI/sys/class/gpio\fR directory, set -the direction to input and set the edge interrupt method to \fInone\fR, -\fIrising\fR, \fIfalling\fR or \fIboth\fR. Use like the export command -above and note that \fBBCM_GPIO\fR pin number is used not not wiringPi pin -numbering. - -Like the export commands above, ownership is set to that of the -calling user, allowing subsequent access from user programs without -requiring root/sudo. - -.TP -.B unexport -Un-Export a GPIO pin in the /sys/class/gpio directory. - -.TP -.B wfi -This set the given pin to the supplied interrupt mode: rising, falling -or both then waits for the interrupt to happen. It's a non-busy wait, -so does not consume and CPU while it's waiting. - -.TP -.B drive -group value - -Change the pad driver value for the given pad group to the supplied drive -value. Group is 0, 1 or 2 and value is 0-7. Do not use unless you are -absolutely sure you know what you're doing. - -.TP -.B usbp -high | low - -Change the USB current limiter to high (1.2 amps) or low (the default, 600mA) -This is only applicable to the Model B+ and the Model B, v2. - -.TP -.B pwm-bal/pwm-ms -Change the PWM mode to balanced (the default) or mark:space ratio (traditional) - -.TP -.B pwmr -Change the PWM range register. The default is 1024. - -.TP -.B load i2c [baudrate] -This loads the i2c or drivers into the kernel and changes the permissions -on the associated /dev/ entries so that the current user has access to -them. Optionally it will set the I2C baudrate to that supplied in Kb/sec -(or as close as the Pi can manage) The default speed is 100Kb/sec. - -Note: On recent kernels with the device tree enabled you should use the -raspi-config program to load/unload the I2C device at boot time. - -.TP -.B load spi -This loads the spi drivers into the kernel and changes the permissions -on the associated /dev/ entries so that the current user has access to -them. It used to have the ability to change the buffer size from the -default of 4096 bytes to an arbitrary value, however for some time the -Pi Foundation have compiled the SPI device driver into the kernel and -this has fixed the buffer size. The way to change it now is to edit -the /boot/cmdline.txt file and add on spdev.bufsiz=8192 to set it to -e.g. 8192 bytes then reboot. - -Note: On recent kernels with the device tree enabled you should use the -raspi-config program to load/unload the SPI device at boot time. - -.TP -.B gbr -channel - -This reads the analog to digital converter on the Gertboard on the given -channel. The board jumpers need to be in-place to do this operation. - -.TP -.B gbw -channel value - -This writes the supplied value to the output channel on the Gertboards -SPI digital to analogue converter. -The board jumpers need to be in-place to do this operation. - - -.SH "WiringPi vs. BCM_GPIO Pin numbering vs. Physical pin numbering" - -.PP -The quickest way to get a list of the pin differences is to run the command -.TP -gpio readall - -.SH FILES - -.TP 2.2i -.I gpio -executable - -.SH EXAMPLES -.TP 2.2i -gpio mode 4 output # Set pin 4 to output -.PP -gpio -g mode 23 output # Set GPIO pin 23 to output (same as WiringPi pin 4) -.PP -gpio mode 1 pwm # Set pin 1 to PWM mode -.PP -gpio pwm 1 512 # Set pin 1 to PWM value 512 - half brightness -.PP -gpio export 17 out # Set GPIO Pin 17 to output -.PP -gpio export 0 in # Set GPIO Pin 0 (SDA0) to input. -.PP -gpio -g read 0 # Read GPIO Pin 0 (SDA0) - -.SH "NOTES" - -When using the \fIexport\fR, \fIedge\fR or \fIunexport\fR commands, the -pin numbers are \fBalways\fR native BCM_GPIO numbers and never wiringPi -pin numbers. - -As of kernels 4.1.7, a user-level GPIO access mechanism is available, -however wiringPi will not use this by default - because at this time -there appears to be issues when trying to program the PWM or clock output -hardware. If you can live without PWM or GPIO clocks and you want to use -the GPIO from a non-root program, then you need to make sure that the -module \fIbcm2835_gpiomem\fR is loaded at boot time. This should happen -automatically when you enable the device tree in raspi-config. You may -also need some additional information in /etc/udev/rules.d/ to change the -mode and ownership of the /dev/gpiomem file. Finally, you need to set -the environment variable \fIWIRINGPI_GPIOMEM\fR. This will go-away -in future releases once the /dev/gpiomem interface is fully operational. - -.SH "SEE ALSO" - -.LP -WiringPi's home page -.IP -http://wiringpi.com/ - -.SH AUTHOR - -Gordon Henderson - -.SH "REPORTING BUGS" - -Please report bugs to - -.SH COPYRIGHT - -Copyright (c) 2012-2015 Gordon Henderson -This is free software; see the source for copying conditions. There is NO -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -.SH TRADEMARKS AND ACKNOWLEDGEMENTS - -Raspberry Pi is a trademark of the Raspberry Pi Foundation. See -http://raspberrypi.org/ for full details. diff --git a/other/wiringpi/wiringPi-96344ff/gpio/gpio.c b/other/wiringpi/wiringPi-96344ff/gpio/gpio.c deleted file mode 100644 index 6fd71f87a..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/gpio.c +++ /dev/null @@ -1,1535 +0,0 @@ -/* - * gpio.c: - * Swiss-Army-Knife, Set-UID command-line interface to the Raspberry - * Pi's GPIO. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "../version.h" - -extern int wiringPiDebug ; - -// External functions I can't be bothered creating a separate .h file for: - -extern void doReadall (void) ; -extern void doAllReadall (void) ; -extern void doPins (void) ; - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -#define PI_USB_POWER_CONTROL 38 -#define I2CDETECT "/usr/sbin/i2cdetect" -#define MODPROBE "/sbin/modprobe" -#define RMMOD "/sbin/rmmod" - -int wpMode ; - -char *usage = "Usage: gpio -v\n" - " gpio -h\n" - " gpio [-g|-1] ...\n" - " gpio [-d] ...\n" - " [-x extension:params] [[ -x ...]] ...\n" - " gpio [-p] ...\n" - " gpio ...\n" - " gpio \n" - " gpio readall/reset\n" - " gpio unexportall/exports\n" - " gpio export/edge/unexport ...\n" - " gpio wfi \n" - " gpio drive \n" - " gpio pwm-bal/pwm-ms \n" - " gpio pwmr \n" - " gpio pwmc \n" - " gpio load spi/i2c\n" - " gpio unload spi/i2c\n" - " gpio i2cd/i2cdetect\n" - " gpio rbx/rbd\n" - " gpio wb \n" - " gpio usbp high/low\n" - " gpio gbr \n" - " gpio gbw " ; // No trailing newline needed here. - - -#ifdef NOT_FOR_NOW -/* - * decodePin: - * Decode a pin "number" which can actually be a pin name to represent - * one of the Pi's on-board pins. - ********************************************************************************* - */ - -static int decodePin (const char *str) -{ - -// The first case - see if it's a number: - - if (isdigit (str [0])) - return atoi (str) ; - - return 0 ; -} -#endif - - -/* - * findExecutable: - * Code to locate the path to the given executable. We have a fixed list - * of locations to try which completely overrides any $PATH environment. - * This may be detrimental, however it avoids the reliance on $PATH - * which may be a security issue when this program is run a set-uid-root. - ********************************************************************************* - */ - -static const char *searchPath [] = -{ - "/sbin", - "/usr/sbin", - "/bin", - "/usr/bin", - NULL, -} ; - -static char *findExecutable (const char *progName) -{ - static char *path = NULL ; - int len = strlen (progName) ; - int i = 0 ; - struct stat statBuf ; - - for (i = 0 ; searchPath [i] != NULL ; ++i) - { - path = malloc (strlen (searchPath [i]) + len + 2) ; - sprintf (path, "%s/%s", searchPath [i], progName) ; - - if (stat (path, &statBuf) == 0) - return path ; - free (path) ; - } - - return NULL ; -} - - -/* - * changeOwner: - * Change the ownership of the file to the real userId of the calling - * program so we can access it. - ********************************************************************************* - */ - -static void changeOwner (char *cmd, char *file) -{ - uid_t uid = getuid () ; - uid_t gid = getgid () ; - - if (chown (file, uid, gid) != 0) - { - -// Removed (ignoring) the check for not existing as I'm fed-up with morons telling me that -// the warning message is an error. - - if (errno != ENOENT) - fprintf (stderr, "%s: Unable to change ownership of %s: %s\n", cmd, file, strerror (errno)) ; - } -} - - -/* - * moduleLoaded: - * Return true/false if the supplied module is loaded - ********************************************************************************* - */ - -static int moduleLoaded (char *modName) -{ - int len = strlen (modName) ; - int found = FALSE ; - FILE *fd = fopen ("/proc/modules", "r") ; - char line [80] ; - - if (fd == NULL) - { - fprintf (stderr, "gpio: Unable to check /proc/modules: %s\n", strerror (errno)) ; - exit (1) ; - } - - while (fgets (line, 80, fd) != NULL) - { - if (strncmp (line, modName, len) != 0) - continue ; - - found = TRUE ; - break ; - } - - fclose (fd) ; - - return found ; -} - - -/* - * doLoad: - * Load either the spi or i2c modules and change device ownerships, etc. - ********************************************************************************* - */ - -static void checkDevTree (char *argv []) -{ - struct stat statBuf ; - - if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... - { - fprintf (stderr, -"%s: Unable to load/unload modules as this Pi has the device tree enabled.\n" -" You need to run the raspi-config program (as root) and select the\n" -" modules (SPI or I2C) that you wish to load/unload there and reboot.\n" -" There is more information here:\n" -" https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=97314\n", argv [0]) ; - exit (1) ; - } -} - -static void _doLoadUsage (char *argv []) -{ - fprintf (stderr, "Usage: %s load [I2C baudrate in Kb/sec]\n", argv [0]) ; - exit (1) ; -} - -static void doLoad (int argc, char *argv []) -{ - char *module1, *module2 ; - char cmd [80] ; - char *file1, *file2 ; - char args1 [32], args2 [32] ; - - checkDevTree (argv) ; - - if (argc < 3) - _doLoadUsage (argv) ; - - args1 [0] = args2 [0] = 0 ; - - /**/ if (strcasecmp (argv [2], "spi") == 0) - { - module1 = "spidev" ; - module2 = "spi_bcm2708" ; - file1 = "/dev/spidev0.0" ; - file2 = "/dev/spidev0.1" ; - if (argc == 4) - { - fprintf (stderr, "%s: Unable to set the buffer size now. Load aborted. Please see the man page.\n", argv [0]) ; - exit (1) ; - } - else if (argc > 4) - _doLoadUsage (argv) ; - } - else if (strcasecmp (argv [2], "i2c") == 0) - { - module1 = "i2c_dev" ; - module2 = "i2c_bcm2708" ; - file1 = "/dev/i2c-0" ; - file2 = "/dev/i2c-1" ; - if (argc == 4) - sprintf (args2, " baudrate=%d", atoi (argv [3]) * 1000) ; - else if (argc > 4) - _doLoadUsage (argv) ; - } - else - _doLoadUsage (argv) ; - - if (findExecutable ("modprobe") == NULL) - printf ("No found\n") ; - - if (!moduleLoaded (module1)) - { - sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module1, args1) ; - system (cmd) ; - } - - if (!moduleLoaded (module2)) - { - sprintf (cmd, "%s %s%s", findExecutable (MODPROBE), module2, args2) ; - system (cmd) ; - } - - if (!moduleLoaded (module2)) - { - fprintf (stderr, "%s: Unable to load %s\n", argv [0], module2) ; - exit (1) ; - } - - sleep (1) ; // To let things get settled - - changeOwner (argv [0], file1) ; - changeOwner (argv [0], file2) ; -} - - -/* - * doUnLoad: - * Un-Load either the spi or i2c modules and change device ownerships, etc. - ********************************************************************************* - */ - -static void _doUnLoadUsage (char *argv []) -{ - fprintf (stderr, "Usage: %s unload \n", argv [0]) ; - exit (1) ; -} - -static void doUnLoad (int argc, char *argv []) -{ - char *module1, *module2 ; - char cmd [80] ; - - checkDevTree (argv) ; - - if (argc != 3) - _doUnLoadUsage (argv) ; - - /**/ if (strcasecmp (argv [2], "spi") == 0) - { - module1 = "spidev" ; - module2 = "spi_bcm2708" ; - } - else if (strcasecmp (argv [2], "i2c") == 0) - { - module1 = "i2c_dev" ; - module2 = "i2c_bcm2708" ; - } - else - _doUnLoadUsage (argv) ; - - if (moduleLoaded (module1)) - { - sprintf (cmd, "%s %s", findExecutable (RMMOD), module1) ; - system (cmd) ; - } - - if (moduleLoaded (module2)) - { - sprintf (cmd, "%s %s", findExecutable (RMMOD), module2) ; - system (cmd) ; - } -} - - -/* - * doI2Cdetect: - * Run the i2cdetect command with the right runes for this Pi revision - ********************************************************************************* - */ - -static void doI2Cdetect (UNU int argc, char *argv []) -{ - int port = piGpioLayout () == 1 ? 0 : 1 ; - char *c, *command ; - - if ((c = findExecutable (I2CDETECT)) == NULL) - { - fprintf (stderr, "%s: Unable to find i2cdetect command: %s\n", argv [0], strerror (errno)) ; - return ; - } - - if (!moduleLoaded ("i2c_dev")) - { - fprintf (stderr, "%s: The I2C kernel module(s) are not loaded.\n", argv [0]) ; - return ; - } - - command = malloc (strlen (c) + 16) ; - sprintf (command, "%s -y %d", c, port) ; - if (system (command) < 0) - fprintf (stderr, "%s: Unable to run i2cdetect: %s\n", argv [0], strerror (errno)) ; - -} - - -/* - * doExports: - * List all GPIO exports - ********************************************************************************* - */ - -static void doExports (UNU int argc, UNU char *argv []) -{ - int fd ; - int i, l, first ; - char fName [128] ; - char buf [16] ; - - for (first = 0, i = 0 ; i < 64 ; ++i) // Crude, but effective - { - -// Try to read the direction - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - continue ; - - if (first == 0) - { - ++first ; - printf ("GPIO Pins exported:\n") ; - } - - printf ("%4d: ", i) ; - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - - printf ("%-3s", buf) ; - - close (fd) ; - -// Try to Read the value - - sprintf (fName, "/sys/class/gpio/gpio%d/value", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - { - printf ("No Value file (huh?)\n") ; - continue ; - } - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - - printf (" %s", buf) ; - -// Read any edge trigger file - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", i) ; - if ((fd = open (fName, O_RDONLY)) == -1) - { - printf ("\n") ; - continue ; - } - - if ((l = read (fd, buf, 16)) == 0) - sprintf (buf, "%s", "?") ; - - buf [l] = 0 ; - if ((buf [strlen (buf) - 1]) == '\n') - buf [strlen (buf) - 1] = 0 ; - - printf (" %-8s\n", buf) ; - - close (fd) ; - } -} - - -/* - * doExport: - * gpio export pin mode - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doExport (int argc, char *argv []) -{ - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s export pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - mode = argv [3] ; - - if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; - } - - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; - if ((fd = fopen (fName, "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } - - /**/ if ((strcasecmp (mode, "in") == 0) || (strcasecmp (mode, "input") == 0)) - fprintf (fd, "in\n") ; - else if ((strcasecmp (mode, "out") == 0) || (strcasecmp (mode, "output") == 0)) - fprintf (fd, "out\n") ; - else if ((strcasecmp (mode, "high") == 0) || (strcasecmp (mode, "up") == 0)) - fprintf (fd, "high\n") ; - else if ((strcasecmp (mode, "low") == 0) || (strcasecmp (mode, "down") == 0)) - fprintf (fd, "low\n") ; - else - { - fprintf (stderr, "%s: Invalid mode: %s. Should be in, out, high or low\n", argv [1], mode) ; - exit (1) ; - } - - fclose (fd) ; - -// Change ownership so the current user can actually use it - - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; - -} - - -/* - * doWfi: - * gpio wfi pin mode - * Wait for Interrupt on a given pin. - * Slight cheat here - it's easier to actually use ISR now (which calls - * gpio to set the pin modes!) then we simply sleep, and expect the thread - * to exit the program. Crude but effective. - ********************************************************************************* - */ - -static void wfi (void) - { exit (0) ; } - -void doWfi (int argc, char *argv []) -{ - int pin, mode ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s wfi pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - /**/ if (strcasecmp (argv [3], "rising") == 0) mode = INT_EDGE_RISING ; - else if (strcasecmp (argv [3], "falling") == 0) mode = INT_EDGE_FALLING ; - else if (strcasecmp (argv [3], "both") == 0) mode = INT_EDGE_BOTH ; - else - { - fprintf (stderr, "%s: wfi: Invalid mode: %s. Should be rising, falling or both\n", argv [1], argv [3]) ; - exit (1) ; - } - - if (wiringPiISR (pin, mode, &wfi) < 0) - { - fprintf (stderr, "%s: wfi: Unable to setup ISR: %s\n", argv [1], strerror (errno)) ; - exit (1) ; - } - - for (;;) - delay (9999) ; -} - - - -/* - * doEdge: - * gpio edge pin mode - * Easy access to changing the edge trigger on a GPIO pin - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doEdge (int argc, char *argv []) -{ - FILE *fd ; - int pin ; - char *mode ; - char fName [128] ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s edge pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - mode = argv [3] ; - -// Export the pin and set direction to input - - if ((fd = fopen ("/sys/class/gpio/export", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface: %s\n", argv [0], strerror (errno)) ; - exit (1) ; - } - - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/direction", pin) ; - if ((fd = fopen (fName, "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO direction interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } - - fprintf (fd, "in\n") ; - fclose (fd) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - if ((fd = fopen (fName, "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO edge interface for pin %d: %s\n", argv [0], pin, strerror (errno)) ; - exit (1) ; - } - - /**/ if (strcasecmp (mode, "none") == 0) fprintf (fd, "none\n") ; - else if (strcasecmp (mode, "rising") == 0) fprintf (fd, "rising\n") ; - else if (strcasecmp (mode, "falling") == 0) fprintf (fd, "falling\n") ; - else if (strcasecmp (mode, "both") == 0) fprintf (fd, "both\n") ; - else - { - fprintf (stderr, "%s: Invalid mode: %s. Should be none, rising, falling or both\n", argv [1], mode) ; - exit (1) ; - } - -// Change ownership of the value and edge files, so the current user can actually use it! - - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - changeOwner (argv [0], fName) ; - - sprintf (fName, "/sys/class/gpio/gpio%d/edge", pin) ; - changeOwner (argv [0], fName) ; - - fclose (fd) ; -} - - -/* - * doUnexport: - * gpio unexport pin - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doUnexport (int argc, char *argv []) -{ - FILE *fd ; - int pin ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s unexport pin\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", argv [0]) ; - exit (1) ; - } - - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; -} - - -/* - * doUnexportAll: - * gpio unexportall - * Un-Export all the GPIO pins. - * This uses the /sys/class/gpio device interface. - ********************************************************************************* - */ - -void doUnexportall (char *progName) -{ - FILE *fd ; - int pin ; - - for (pin = 0 ; pin < 63 ; ++pin) - { - if ((fd = fopen ("/sys/class/gpio/unexport", "w")) == NULL) - { - fprintf (stderr, "%s: Unable to open GPIO export interface\n", progName) ; - exit (1) ; - } - fprintf (fd, "%d\n", pin) ; - fclose (fd) ; - } -} - - -/* - * doReset: - * Reset the GPIO pins - as much as we can do - ********************************************************************************* - */ - -static void doReset (UNU char *progName) -{ - printf ("GPIO Reset is dangerous and has been removed from the gpio command.\n") ; - printf (" - Please write a shell-script to reset the GPIO pins into the state\n") ; - printf (" that you need them in for your applications.\n") ; -} - - -/* - * doMode: - * gpio mode pin mode ... - ********************************************************************************* - */ - -void doMode (int argc, char *argv []) -{ - int pin ; - char *mode ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s mode pin mode\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - mode = argv [3] ; - - /**/ if (strcasecmp (mode, "in") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "input") == 0) pinMode (pin, INPUT) ; - else if (strcasecmp (mode, "out") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "output") == 0) pinMode (pin, OUTPUT) ; - else if (strcasecmp (mode, "pwm") == 0) pinMode (pin, PWM_OUTPUT) ; - else if (strcasecmp (mode, "pwmTone") == 0) pinMode (pin, PWM_TONE_OUTPUT) ; - else if (strcasecmp (mode, "clock") == 0) pinMode (pin, GPIO_CLOCK) ; - else if (strcasecmp (mode, "up") == 0) pullUpDnControl (pin, PUD_UP) ; - else if (strcasecmp (mode, "down") == 0) pullUpDnControl (pin, PUD_DOWN) ; - else if (strcasecmp (mode, "tri") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "off") == 0) pullUpDnControl (pin, PUD_OFF) ; - else if (strcasecmp (mode, "alt0") == 0) pinModeAlt (pin, 0b100) ; - else if (strcasecmp (mode, "alt1") == 0) pinModeAlt (pin, 0b101) ; - else if (strcasecmp (mode, "alt2") == 0) pinModeAlt (pin, 0b110) ; - else if (strcasecmp (mode, "alt3") == 0) pinModeAlt (pin, 0b111) ; - else if (strcasecmp (mode, "alt4") == 0) pinModeAlt (pin, 0b011) ; - else if (strcasecmp (mode, "alt5") == 0) pinModeAlt (pin, 0b010) ; - else - { - fprintf (stderr, "%s: Invalid mode: %s. Should be in/out/pwm/clock/up/down/tri\n", argv [1], mode) ; - exit (1) ; - } -} - - -/* - * doPadDrive: - * gpio drive group value - ********************************************************************************* - */ - -static void doPadDrive (int argc, char *argv []) -{ - int group, val ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s drive group value\n", argv [0]) ; - exit (1) ; - } - - group = atoi (argv [2]) ; - val = atoi (argv [3]) ; - - if ((group < 0) || (group > 2)) - { - fprintf (stderr, "%s: drive group not 0, 1 or 2: %d\n", argv [0], group) ; - exit (1) ; - } - - if ((val < 0) || (val > 7)) - { - fprintf (stderr, "%s: drive value not 0-7: %d\n", argv [0], val) ; - exit (1) ; - } - - setPadDrive (group, val) ; -} - - -/* - * doUsbP: - * Control USB Power - High (1.2A) or Low (600mA) - * gpio usbp high/low - ********************************************************************************* - */ - -static void doUsbP (int argc, char *argv []) -{ - int model, rev, mem, maker, overVolted ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; - } - -// Make sure we're on a B+ - - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - if (!((model == PI_MODEL_BP) || (model == PI_MODEL_2))) - { - fprintf (stderr, "USB power contol is applicable to B+ and v2 boards only.\n") ; - exit (1) ; - } - -// Make sure we start in BCM_GPIO mode - - wiringPiSetupGpio () ; - - if ((strcasecmp (argv [2], "high") == 0) || (strcasecmp (argv [2], "hi") == 0)) - { - digitalWrite (PI_USB_POWER_CONTROL, 1) ; - pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; - printf ("Switched to HIGH current USB (1.2A)\n") ; - return ; - } - - if ((strcasecmp (argv [2], "low") == 0) || (strcasecmp (argv [2], "lo") == 0)) - { - digitalWrite (PI_USB_POWER_CONTROL, 0) ; - pinMode (PI_USB_POWER_CONTROL, OUTPUT) ; - printf ("Switched to LOW current USB (600mA)\n") ; - return ; - } - - fprintf (stderr, "Usage: %s usbp high|low\n", argv [0]) ; - exit (1) ; -} - - -/* - * doGbw: - * gpio gbw channel value - * Gertboard Write - To the Analog output - ********************************************************************************* - */ - -static void doGbw (int argc, char *argv []) -{ - int channel, value ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s gbw \n", argv [0]) ; - exit (1) ; - } - - channel = atoi (argv [2]) ; - value = atoi (argv [3]) ; - - if ((channel < 0) || (channel > 1)) - { - fprintf (stderr, "%s: gbw: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; - } - - if ((value < 0) || (value > 255)) - { - fprintf (stderr, "%s: gbw: Value must be from 0 to 255\n", argv [0]) ; - exit (1) ; - } - - if (gertboardAnalogSetup (64) < 0) - { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; - } - - analogWrite (64 + channel, value) ; -} - - -/* - * doGbr: - * gpio gbr channel - * From the analog input - ********************************************************************************* - */ - -static void doGbr (int argc, char *argv []) -{ - int channel ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s gbr \n", argv [0]) ; - exit (1) ; - } - - channel = atoi (argv [2]) ; - - if ((channel < 0) || (channel > 1)) - { - fprintf (stderr, "%s: gbr: Channel number must be 0 or 1\n", argv [0]) ; - exit (1) ; - } - - if (gertboardAnalogSetup (64) < 0) - { - fprintf (stderr, "Unable to initialise the Gertboard SPI interface: %s\n", strerror (errno)) ; - exit (1) ; - } - - printf ("%d\n", analogRead (64 + channel)) ; -} - - -/* - * doWrite: - * gpio write pin value - ********************************************************************************* - */ - -static void doWrite (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s write pin value\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - /**/ if ((strcasecmp (argv [3], "up") == 0) || (strcasecmp (argv [3], "on") == 0)) - val = 1 ; - else if ((strcasecmp (argv [3], "down") == 0) || (strcasecmp (argv [3], "off") == 0)) - val = 0 ; - else - val = atoi (argv [3]) ; - - /**/ if (val == 0) - digitalWrite (pin, LOW) ; - else - digitalWrite (pin, HIGH) ; -} - - -/* - * doAwriterite: - * gpio awrite pin value - ********************************************************************************* - */ - -static void doAwrite (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s awrite pin value\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - val = atoi (argv [3]) ; - - analogWrite (pin, val) ; -} - - -/* - * doWriteByte: - * gpio wb value - ********************************************************************************* - */ - -static void doWriteByte (int argc, char *argv []) -{ - int val ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s wb value\n", argv [0]) ; - exit (1) ; - } - - val = (int)strtol (argv [2], NULL, 0) ; - - digitalWriteByte (val) ; -} - - -/* - * doReadByte: - * gpio rbx|rbd value - ********************************************************************************* - */ - -static void doReadByte (int argc, char *argv [], int printHex) -{ - int val ; - - if (argc != 2) - { - fprintf (stderr, "Usage: %s rbx|rbd\n", argv [0]) ; - exit (1) ; - } - - val = digitalReadByte () ; - if (printHex) - printf ("%02X\n", val) ; - else - printf ("%d\n", val) ; -} - - -/* - * doRead: - * Read a pin and return the value - ********************************************************************************* - */ - -void doRead (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s read pin\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - val = digitalRead (pin) ; - - printf ("%s\n", val == 0 ? "0" : "1") ; -} - - -/* - * doAread: - * Read an analog pin and return the value - ********************************************************************************* - */ - -void doAread (int argc, char *argv []) -{ - if (argc != 3) - { - fprintf (stderr, "Usage: %s aread pin\n", argv [0]) ; - exit (1) ; - } - - printf ("%d\n", analogRead (atoi (argv [2]))) ; -} - - -/* - * doToggle: - * Toggle an IO pin - ********************************************************************************* - */ - -void doToggle (int argc, char *argv []) -{ - int pin ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s toggle pin\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - digitalWrite (pin, !digitalRead (pin)) ; -} - - -/* - * doBlink: - * Blink an IO pin - ********************************************************************************* - */ - -void doBlink (int argc, char *argv []) -{ - int pin ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s blink pin\n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - pinMode (pin, OUTPUT) ; - for (;;) - { - digitalWrite (pin, !digitalRead (pin)) ; - delay (500) ; - } - -} - - -/* - * doPwmTone: - * Output a tone in a PWM pin - ********************************************************************************* - */ - -void doPwmTone (int argc, char *argv []) -{ - int pin, freq ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s pwmTone \n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - freq = atoi (argv [3]) ; - - pwmToneWrite (pin, freq) ; -} - - -/* - * doClock: - * Output a clock on a pin - ********************************************************************************* - */ - -void doClock (int argc, char *argv []) -{ - int pin, freq ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s clock \n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - freq = atoi (argv [3]) ; - - gpioClockSet (pin, freq) ; -} - - -/* - * doPwm: - * Output a PWM value on a pin - ********************************************************************************* - */ - -void doPwm (int argc, char *argv []) -{ - int pin, val ; - - if (argc != 4) - { - fprintf (stderr, "Usage: %s pwm \n", argv [0]) ; - exit (1) ; - } - - pin = atoi (argv [2]) ; - - val = atoi (argv [3]) ; - - pwmWrite (pin, val) ; -} - - -/* - * doPwmMode: doPwmRange: doPwmClock: - * Change the PWM mode, range and clock divider values - ********************************************************************************* - */ - -static void doPwmMode (int mode) -{ - pwmSetMode (mode) ; -} - -static void doPwmRange (int argc, char *argv []) -{ - unsigned int range ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s pwmr \n", argv [0]) ; - exit (1) ; - } - - range = (unsigned int)strtoul (argv [2], NULL, 10) ; - - if (range == 0) - { - fprintf (stderr, "%s: range must be > 0\n", argv [0]) ; - exit (1) ; - } - - pwmSetRange (range) ; -} - -static void doPwmClock (int argc, char *argv []) -{ - unsigned int clock ; - - if (argc != 3) - { - fprintf (stderr, "Usage: %s pwmc \n", argv [0]) ; - exit (1) ; - } - - clock = (unsigned int)strtoul (argv [2], NULL, 10) ; - - if ((clock < 1) || (clock > 4095)) - { - fprintf (stderr, "%s: clock must be between 0 and 4096\n", argv [0]) ; - exit (1) ; - } - - pwmSetClock (clock) ; -} - - -/* - * doVersion: - * Handle the ever more complicated version command and print out - * some usefull information. - ********************************************************************************* - */ - -static void doVersion (char *argv []) -{ - int model, rev, mem, maker, warranty ; - struct stat statBuf ; - char name [80] ; - FILE *fd ; - - int vMaj, vMin ; - - wiringPiVersion (&vMaj, &vMin) ; - printf ("gpio version: %d.%d\n", vMaj, vMin) ; - printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; - printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ; - printf ("For details type: %s -warranty\n", argv [0]) ; - printf ("\n") ; - piBoardId (&model, &rev, &mem, &maker, &warranty) ; - - printf ("Raspberry Pi Details:\n") ; - printf (" Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", - piModelNames [model], piRevisionNames [rev], piMemorySize [mem], piMakerNames [maker], warranty ? "[Out of Warranty]" : "") ; - -// Check for device tree - - if (stat ("/proc/device-tree", &statBuf) == 0) // We're on a devtree system ... - printf (" * Device tree is enabled.\n") ; - - if (stat ("/proc/device-tree/model", &statBuf) == 0) // Output Kernel idea of board type - { - if ((fd = fopen ("/proc/device-tree/model", "r")) != NULL) - { - fgets (name, 80, fd) ; - fclose (fd) ; - printf (" *--> %s\n", name) ; - } - } - - if (stat ("/dev/gpiomem", &statBuf) == 0) // User level GPIO is GO - printf (" * This Raspberry Pi supports user-level GPIO access.\n") ; - else - printf (" * Root or sudo required for GPIO access.\n") ; -} - - -/* - * main: - * Start here - ********************************************************************************* - */ - -int main (int argc, char *argv []) -{ - int i ; - - if (getenv ("WIRINGPI_DEBUG") != NULL) - { - printf ("gpio: wiringPi debug mode enabled\n") ; - wiringPiDebug = TRUE ; - } - - if (argc == 1) - { - fprintf (stderr, "%s\n", usage) ; - return 1 ; - } - -// Help - - if (strcasecmp (argv [1], "-h") == 0) - { - printf ("%s: %s\n", argv [0], usage) ; - return 0 ; - } - -// Version & Warranty -// Wish I could remember why I have both -R and -V ... - - if ((strcmp (argv [1], "-R") == 0) || (strcmp (argv [1], "-V") == 0)) - { - printf ("%d\n", piGpioLayout ()) ; - return 0 ; - } - -// Version and information - - if (strcmp (argv [1], "-v") == 0) - { - doVersion (argv) ; - return 0 ; - } - - if (strcasecmp (argv [1], "-warranty") == 0) - { - printf ("gpio version: %s\n", VERSION) ; - printf ("Copyright (c) 2012-2017 Gordon Henderson\n") ; - printf ("\n") ; - printf (" This program is free software; you can redistribute it and/or modify\n") ; - printf (" it under the terms of the GNU Leser General Public License as published\n") ; - printf (" by the Free Software Foundation, either version 3 of the License, or\n") ; - printf (" (at your option) any later version.\n") ; - printf ("\n") ; - printf (" This program is distributed in the hope that it will be useful,\n") ; - printf (" but WITHOUT ANY WARRANTY; without even the implied warranty of\n") ; - printf (" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") ; - printf (" GNU Lesser General Public License for more details.\n") ; - printf ("\n") ; - printf (" You should have received a copy of the GNU Lesser General Public License\n") ; - printf (" along with this program. If not, see .\n") ; - printf ("\n") ; - return 0 ; - } - - if (geteuid () != 0) - { - fprintf (stderr, "%s: Must be root to run. Program should be suid root. This is an error.\n", argv [0]) ; - return 1 ; - } - -// Initial test for /sys/class/gpio operations: - - /**/ if (strcasecmp (argv [1], "exports" ) == 0) { doExports (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "export" ) == 0) { doExport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "edge" ) == 0) { doEdge (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexport" ) == 0) { doUnexport (argc, argv) ; return 0 ; } - else if (strcasecmp (argv [1], "unexportall") == 0) { doUnexportall (argv [0]) ; return 0 ; } - -// Check for load command: - - if (strcasecmp (argv [1], "load" ) == 0) { doLoad (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "unload" ) == 0) { doUnLoad (argc, argv) ; return 0 ; } - -// Check for usb power command - - if (strcasecmp (argv [1], "usbp" ) == 0) { doUsbP (argc, argv) ; return 0 ; } - -// Gertboard commands - - if (strcasecmp (argv [1], "gbr" ) == 0) { doGbr (argc, argv) ; return 0 ; } - if (strcasecmp (argv [1], "gbw" ) == 0) { doGbw (argc, argv) ; return 0 ; } - -// Check for allreadall command, force Gpio mode - - if (strcasecmp (argv [1], "allreadall") == 0) - { - wiringPiSetupGpio () ; - doAllReadall () ; - return 0 ; - } - -// Check for -g argument - - /**/ if (strcasecmp (argv [1], "-g") == 0) - { - wiringPiSetupGpio () ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_GPIO ; - } - -// Check for -1 argument - - else if (strcasecmp (argv [1], "-1") == 0) - { - wiringPiSetupPhys () ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_PHYS ; - } - -// Check for -p argument for PiFace - - else if (strcasecmp (argv [1], "-p") == 0) - { - piFaceSetup (200) ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_PIFACE ; - } - -// Check for -z argument so we don't actually initialise wiringPi - - else if (strcasecmp (argv [1], "-z") == 0) - { - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - wpMode = WPI_MODE_UNINITIALISED ; - } - -// Default to wiringPi mode - - else - { - wiringPiSetup () ; - wpMode = WPI_MODE_PINS ; - } - -// Check for -x argument to load in a new extension -// -x extension:base:args -// Can load many modules, but unless daemon mode we can only send one -// command at a time. - - while (strcasecmp (argv [1], "-x") == 0) - { - if (argc < 3) - { - fprintf (stderr, "%s: -x missing extension command.\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - - if (!loadWPiExtension (argv [0], argv [2], TRUE)) - { - fprintf (stderr, "%s: Extension load failed: %s\n", argv [0], strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - -// Shift args down by 2 - - for (i = 3 ; i < argc ; ++i) - argv [i - 2] = argv [i] ; - argc -= 2 ; - } - - if (argc <= 1) - { - fprintf (stderr, "%s: no command given\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - -// Core wiringPi functions - - /**/ if (strcasecmp (argv [1], "mode" ) == 0) doMode (argc, argv) ; - else if (strcasecmp (argv [1], "read" ) == 0) doRead (argc, argv) ; - else if (strcasecmp (argv [1], "write" ) == 0) doWrite (argc, argv) ; - else if (strcasecmp (argv [1], "pwm" ) == 0) doPwm (argc, argv) ; - else if (strcasecmp (argv [1], "awrite" ) == 0) doAwrite (argc, argv) ; - else if (strcasecmp (argv [1], "aread" ) == 0) doAread (argc, argv) ; - -// GPIO Nicies - - else if (strcasecmp (argv [1], "toggle" ) == 0) doToggle (argc, argv) ; - else if (strcasecmp (argv [1], "blink" ) == 0) doBlink (argc, argv) ; - -// Pi Specifics - - else if (strcasecmp (argv [1], "pwm-bal" ) == 0) doPwmMode (PWM_MODE_BAL) ; - else if (strcasecmp (argv [1], "pwm-ms" ) == 0) doPwmMode (PWM_MODE_MS) ; - else if (strcasecmp (argv [1], "pwmr" ) == 0) doPwmRange (argc, argv) ; - else if (strcasecmp (argv [1], "pwmc" ) == 0) doPwmClock (argc, argv) ; - else if (strcasecmp (argv [1], "pwmTone" ) == 0) doPwmTone (argc, argv) ; - else if (strcasecmp (argv [1], "drive" ) == 0) doPadDrive (argc, argv) ; - else if (strcasecmp (argv [1], "readall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "nreadall" ) == 0) doReadall () ; - else if (strcasecmp (argv [1], "pins" ) == 0) doPins () ; - else if (strcasecmp (argv [1], "i2cdetect") == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "i2cd" ) == 0) doI2Cdetect (argc, argv) ; - else if (strcasecmp (argv [1], "reset" ) == 0) doReset (argv [0]) ; - else if (strcasecmp (argv [1], "wb" ) == 0) doWriteByte (argc, argv) ; - else if (strcasecmp (argv [1], "rbx" ) == 0) doReadByte (argc, argv, TRUE) ; - else if (strcasecmp (argv [1], "rbd" ) == 0) doReadByte (argc, argv, FALSE) ; - else if (strcasecmp (argv [1], "clock" ) == 0) doClock (argc, argv) ; - else if (strcasecmp (argv [1], "wfi" ) == 0) doWfi (argc, argv) ; - else - { - fprintf (stderr, "%s: Unknown command: %s.\n", argv [0], argv [1]) ; - exit (EXIT_FAILURE) ; - } - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/gpio/pins.c b/other/wiringpi/wiringPi-96344ff/gpio/pins.c deleted file mode 100644 index 3a4dc15ae..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/pins.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * pins.c: - * Just display a handy Pi pinnout diagram. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - - -#include - -void doPins (void) -{ - printf ("The pins command has been deprecated - sorry. Please use the\n") ; - printf (" gpio readall\n") ; - printf ("command to get a list of the pinnouts for your Pi.\n") ; -} - diff --git a/other/wiringpi/wiringPi-96344ff/gpio/pintest b/other/wiringpi/wiringPi-96344ff/gpio/pintest deleted file mode 100755 index b5743619e..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/pintest +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash -# -# pintest -# Test the Pi's GPIO port -# Copyright (c) 2013-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - - -# logErr pin, expected got -################################################################################ - -logErr () -{ - if [ $errs = 0 ]; then - echo "" - fi - echo " --> Pin $1 failure. Expected $2, got $3" - let errs+=1 -} - - -# printErrorCount -################################################################################ - -printErrCount() -{ - if [ $errs = 0 ]; then - echo "No faults detected." - elif [ $errs = 1 ]; then - echo "One fault detected." - else - echo "$errs faults detected" - fi -} - - -# testPins start end -################################################################################ - -testPins() -{ - start=$1 - end=$2 - errs=0 - - printf "%30s %2d:%2d: " "$3" $1 $2 - -# Set range to inputs - - for i in `seq $start $end`; do - gpio mode $i in - done - -# Enable internal pull-ups and expect to read high - - for i in `seq $start $end`; do - gpio mode $i up - if [ `gpio read $i` = 0 ]; then - logErr $i 1 0 - fi - done - -# Enable internal pull-downs and expect to read low - - for i in `seq $start $end`; do - gpio mode $i down - if [ `gpio read $i` = 1 ]; then - echo "Pin $i failure - expected 0, got 1" - let errs+=1 - fi - done - -# Remove the internal pull up/downs - - for i in `seq $start $end`; do - gpio mode $i tri - done - - if [ $errs = 0 ]; then - echo " OK" - else - printErrCount - fi - - let totErrs+=errs -} - - -intro() -{ - cat <. - *********************************************************************** - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -extern int wpMode ; - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (1==2) -#endif - -/* - * doReadallExternal: - * A relatively crude way to read the pins on an external device. - * We don't know the input/output mode of pins, but we can tell - * if it's an analog pin or a digital one... - ********************************************************************************* - */ - -static void doReadallExternal (void) -{ - int pin ; - - printf ("+------+---------+--------+\n") ; - printf ("| Pin | Digital | Analog |\n") ; - printf ("+------+---------+--------+\n") ; - - for (pin = wiringPiNodes->pinBase ; pin <= wiringPiNodes->pinMax ; ++pin) - printf ("| %4d | %4d | %4d |\n", pin, digitalRead (pin), analogRead (pin)) ; - - printf ("+------+---------+--------+\n") ; -} - - -/* - * doReadall: - * Read all the GPIO pins - * We also want to use this to read the state of pins on an externally - * connected device, so we need to do some fiddling with the internal - * wiringPi node structures - since the gpio command can only use - * one external device at a time, we'll use that to our advantage... - ********************************************************************************* - */ - -static char *alts [] = -{ - "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3" -} ; - -static int physToWpi [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 8, -1, - 9, -1, - 7, 15, - -1, 16, - 0, 1, - 2, -1, - 3, 4, - -1, 5, - 12, -1, - 13, 6, - 14, 10, - -1, 11, // 25, 26 - 30, 31, // Actually I2C, but not used - 21, -1, - 22, 26, - 23, -1, - 24, 27, - 25, 28, - -1, 29, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - 17, 18, - 19, 20, - -1, -1, -1, -1, -1, -1, -1, -1, -1 -} ; - -static char *physNames [64] = -{ - NULL, - - " 3.3v", "5v ", - " SDA.1", "5v ", - " SCL.1", "0v ", - "GPIO. 7", "TxD ", - " 0v", "RxD ", - "GPIO. 0", "GPIO. 1", - "GPIO. 2", "0v ", - "GPIO. 3", "GPIO. 4", - " 3.3v", "GPIO. 5", - " MOSI", "0v ", - " MISO", "GPIO. 6", - " SCLK", "CE0 ", - " 0v", "CE1 ", - " SDA.0", "SCL.0 ", - "GPIO.21", "0v ", - "GPIO.22", "GPIO.26", - "GPIO.23", "0v ", - "GPIO.24", "GPIO.27", - "GPIO.25", "GPIO.28", - " 0v", "GPIO.29", - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - NULL, NULL, - "GPIO.17", "GPIO.18", - "GPIO.19", "GPIO.20", - NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, -} ; - - -/* - * readallPhys: - * Given a physical pin output the data on it and the next pin: - *| BCM | wPi | Name | Mode | Val| Physical |Val | Mode | Name | wPi | BCM | - ********************************************************************************* - */ - -static void readallPhys (int physPin) -{ - int pin ; - - if (physPinToGpio (physPin) == -1) - printf (" | | ") ; - else - printf (" | %3d | %3d", physPinToGpio (physPin), physToWpi [physPin]) ; - - printf (" | %s", physNames [physPin]) ; - - if (physToWpi [physPin] == -1) - printf (" | | ") ; - else - { - /**/ if (wpMode == WPI_MODE_GPIO) - pin = physPinToGpio (physPin) ; - else if (wpMode == WPI_MODE_PHYS) - pin = physPin ; - else - pin = physToWpi [physPin] ; - - printf (" | %4s", alts [getAlt (pin)]) ; - printf (" | %d", digitalRead (pin)) ; - } - -// Pin numbers: - - printf (" | %2d", physPin) ; - ++physPin ; - printf (" || %-2d", physPin) ; - -// Same, reversed - - if (physToWpi [physPin] == -1) - printf (" | | ") ; - else - { - /**/ if (wpMode == WPI_MODE_GPIO) - pin = physPinToGpio (physPin) ; - else if (wpMode == WPI_MODE_PHYS) - pin = physPin ; - else - pin = physToWpi [physPin] ; - - printf (" | %d", digitalRead (pin)) ; - printf (" | %-4s", alts [getAlt (pin)]) ; - } - - printf (" | %-5s", physNames [physPin]) ; - - if (physToWpi [physPin] == -1) - printf (" | | ") ; - else - printf (" | %-3d | %-3d", physToWpi [physPin], physPinToGpio (physPin)) ; - - printf (" |\n") ; -} - - -/* - * allReadall: - * Read all the pins regardless of the model. Primarily of use for - * the compute module, but handy for other fiddling... - ********************************************************************************* - */ - -static void allReadall (void) -{ - int pin ; - - printf ("+-----+------+-------+ +-----+------+-------+\n") ; - printf ("| Pin | Mode | Value | | Pin | Mode | Value |\n") ; - printf ("+-----+------+-------+ +-----+------+-------+\n") ; - - for (pin = 0 ; pin < 27 ; ++pin) - { - printf ("| %3d ", pin) ; - printf ("| %-4s ", alts [getAlt (pin)]) ; - printf ("| %s ", digitalRead (pin) == HIGH ? "High" : "Low ") ; - printf ("| ") ; - printf ("| %3d ", pin + 27) ; - printf ("| %-4s ", alts [getAlt (pin + 27)]) ; - printf ("| %s ", digitalRead (pin + 27) == HIGH ? "High" : "Low ") ; - printf ("|\n") ; - } - - printf ("+-----+------+-------+ +-----+------+-------+\n") ; - -} - - -/* - * abReadall: - * Read all the pins on the model A or B. - ********************************************************************************* - */ - -void abReadall (int model, int rev) -{ - int pin ; - char *type ; - - if (model == PI_MODEL_A) - type = " A" ; - else - if (rev == PI_VERSION_2) - type = "B2" ; - else - type = "B1" ; - - printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - for (pin = 1 ; pin <= 26 ; pin += 2) - readallPhys (pin) ; - - if (rev == PI_VERSION_2) // B version 2 - { - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - for (pin = 51 ; pin <= 54 ; pin += 2) - readallPhys (pin) ; - } - - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - printf (" +-----+-----+---------+------+---+-Model %s-+---+------+---------+-----+-----+\n", type) ; -} - - -/* - * piPlusReadall: - * Read all the pins on the model A+ or the B+ - ********************************************************************************* - */ - -static void plus2header (int model) -{ - /**/ if (model == PI_MODEL_AP) - printf (" +-----+-----+---------+------+---+--A Plus--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_BP) - printf (" +-----+-----+---------+------+---+--B Plus--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_ZERO) - printf (" +-----+-----+---------+------+---+-Pi Zero--+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_ZERO_W) - printf (" +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_2) - printf (" +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+\n") ; - else if (model == PI_MODEL_3) - printf (" +-----+-----+---------+------+---+---Pi 3---+---+------+---------+-----+-----+\n") ; - else - printf (" +-----+-----+---------+------+---+---Pi ?---+---+------+---------+-----+-----+\n") ; -} - - -static void piPlusReadall (int model) -{ - int pin ; - - plus2header (model) ; - - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - for (pin = 1 ; pin <= 40 ; pin += 2) - readallPhys (pin) ; - printf (" +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+\n") ; - printf (" | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |\n") ; - - plus2header (model) ; -} - - -/* - * doReadall: - * Generic read all pins called from main program. Works out the Pi type - * and calls the appropriate function. - ********************************************************************************* - */ - -void doReadall (void) -{ - int model, rev, mem, maker, overVolted ; - - if (wiringPiNodes != NULL) // External readall - { - doReadallExternal () ; - return ; - } - - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B)) - abReadall (model, rev) ; - else if ((model == PI_MODEL_BP) || (model == PI_MODEL_AP) || (model == PI_MODEL_2) || (model == PI_MODEL_3) || (model == PI_MODEL_ZERO) || (model == PI_MODEL_ZERO_W)) - piPlusReadall (model) ; - else if ((model == PI_MODEL_CM) || (model == PI_MODEL_CM3)) - allReadall () ; - else - printf ("Oops - unable to determine board type... model: %d\n", model) ; -} - -/* - * doAllReadall: - * Force reading of all pins regardless of Pi model - ********************************************************************************* - */ - -void doAllReadall (void) -{ - allReadall () ; -} diff --git a/other/wiringpi/wiringPi-96344ff/gpio/test.sh b/other/wiringpi/wiringPi-96344ff/gpio/test.sh deleted file mode 100755 index 708f1d364..000000000 --- a/other/wiringpi/wiringPi-96344ff/gpio/test.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# -# test.sh: -# Simple test: Assumes LEDs on Pins 0-7 and lights them -# in-turn. -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -# Simple test - assumes LEDs on Pins 0-7. - -for i in `seq 0 7`; -do - gpio mode $i out -done - -while true; -do - for i in `seq 0 7`; - do - gpio write $i 1 - sleep 0.1 - done - - for i in `seq 0 7`; - do - gpio write $i 0 - sleep 0.1 - done -done diff --git a/other/wiringpi/wiringPi-96344ff/newVersion b/other/wiringpi/wiringPi-96344ff/newVersion deleted file mode 100755 index ed4b438a1..000000000 --- a/other/wiringpi/wiringPi-96344ff/newVersion +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -e -# -# newVersion: -# Utility to create the version.h include file for the gpio command. -# and the Debian package -# -# Copyright (c) 2012-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -echo Updating to version: `cat VERSION` - -rm -f version.h -vMaj=`cut -d. -f1 VERSION` -vMin=`cut -d. -f2 VERSION` -echo "#define VERSION \"`cat VERSION`\"" > version.h -echo "#define VERSION_MAJOR $vMaj" >> version.h -echo "#define VERSION_MINOR $vMin" >> version.h - -rm -f debian-template/wiringPi/DEBIAN/control -cat > debian-template/wiringPi/DEBIAN/control < -Description: The wiringPi libraries, headers and gpio command - Libraries to allow GPIO access on a Raspberry Pi from C and C++ - and BASIC programs as well as from the command-line -EOF diff --git a/other/wiringpi/wiringPi-96344ff/pins/Makefile b/other/wiringpi/wiringPi-96344ff/pins/Makefile deleted file mode 100644 index 9535fb56b..000000000 --- a/other/wiringpi/wiringPi-96344ff/pins/Makefile +++ /dev/null @@ -1,22 +0,0 @@ - -SRC = pins.tex - -ifneq ($V,1) -Q ?= @ -endif - - -all: ${SRC} - $Q echo Generating DVI - $Q latex pins.tex - -pins.dvi: pins.tex - $Q latex pins.tex - -pdf: pins.dvi - $Q dvipdf pins.dvi - - -.PHONY: clean -clean: - $Q rm -f *.dvi *.aux *.log *.ps *.toc *.bak *~ diff --git a/other/wiringpi/wiringPi-96344ff/pins/pins.pdf b/other/wiringpi/wiringPi-96344ff/pins/pins.pdf deleted file mode 100644 index bd9629d62..000000000 Binary files a/other/wiringpi/wiringPi-96344ff/pins/pins.pdf and /dev/null differ diff --git a/other/wiringpi/wiringPi-96344ff/pins/pins.tex b/other/wiringpi/wiringPi-96344ff/pins/pins.tex deleted file mode 100644 index c3753e9e6..000000000 --- a/other/wiringpi/wiringPi-96344ff/pins/pins.tex +++ /dev/null @@ -1,116 +0,0 @@ -\documentclass[12pt,a4paper]{article} -\parskip 1ex -\parindent 0em -\thispagestyle{empty} -\pagestyle{plain} -\pagenumbering{arabic} -\setlength{\topmargin}{0pt} -\setlength{\headheight}{0pt} -\setlength{\headsep}{0pt} -\setlength{\topskip}{0pt} -\setlength{\textheight}{240mm} -\setlength{\footskip}{5ex} -\setlength{\oddsidemargin}{0pt} -\setlength{\evensidemargin}{0pt} -\setlength{\textwidth}{160mm} -\usepackage[dvips]{graphics,color} -\usepackage{helvet} -\renewcommand{\familydefault}{\sfdefault} -\begin{document} -\begin{sffamily} -\definecolor{rtb-black}{rgb} {0.0, 0.0, 0.0} -\definecolor{rtb-navy}{rgb} {0.0, 0.0, 0.5} -\definecolor{rtb-green}{rgb} {0.0, 0.5, 0.0} -\definecolor{rtb-teal}{rgb} {0.0, 0.5, 0.5} -\definecolor{rtb-maroon}{rgb} {0.5, 0.0, 0.0} -\definecolor{rtb-purple}{rgb} {0.5, 0.0, 0.5} -\definecolor{rtb-olive}{rgb} {0.5, 0.5, 0.0} -\definecolor{rtb-silver}{rgb} {0.7, 0.7, 0.7} -\definecolor{rtb-grey}{rgb} {0.5, 0.5, 0.5} -\definecolor{rtb-blue}{rgb} {0.0, 0.0, 1.0} -\definecolor{rtb-lime}{rgb} {0.0, 1.0, 0.0} -\definecolor{rtb-aqua}{rgb} {0.0, 1.0, 1.0} -\definecolor{rtb-red}{rgb} {1.0, 0.0, 0.0} -\definecolor{rtb-fuchsia}{rgb}{1.0, 0.0, 1.0} -\definecolor{rtb-yellow}{rgb} {1.0, 1.0, 0.0} -\definecolor{rtb-white}{rgb} {1.0, 1.0, 1.0} - -\begin{center} -\bfseries{WiringPi: GPIO Pin Numbering Tables}\\ -\tt{http://wiringpi.com/} -\end{center} - -\begin{center} -\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|} -\hline -\multicolumn{8}{|c|}{\bfseries{P1: The Main GPIO connector}}\\ -\hline -\hline -WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ -\hline -\hline - & & \textcolor{rtb-red}{3.3v} & \raggedleft{1} & 2 & \textcolor{rtb-maroon}{5v} & & \\ -\hline -8 & Rv1:0 - Rv2:2 & \textcolor{rtb-aqua}{SDA} & \raggedleft{3} & 4 & \textcolor{rtb-maroon}{5v} & & \\ -\hline -9 & Rv1:1 - Rv2:3 & \textcolor{rtb-aqua}{SCL} & \raggedleft{5} & 6 & \textcolor{rtb-black}{0v} & & \\ -\hline -7 & 4 & \textcolor{rtb-green}{GPIO7} & \raggedleft{7} & 8 & \textcolor{rtb-yellow}{TxD} & 14 & 15\\ -\hline - & & \textcolor{rtb-black}{0v} & \raggedleft{9} & 10 & \textcolor{rtb-yellow}{RxD} & 15 & 16\\ -\hline -0 & 17 & \textcolor{rtb-green}{GPIO0} & \raggedleft{11} & 12 & \textcolor{rtb-green}{GPIO1} & 18 & 1\\ -\hline -2 & Rv1:21 - Rv2:27 & \textcolor{rtb-green}{GPIO2} & \raggedleft{13} & 14 & \textcolor{rtb-black}{0v} & & \\ -\hline -3 & 22 & \textcolor{rtb-green}{GPIO3} & \raggedleft{15} & 16 & \textcolor{rtb-green}{GPIO4} & 23 & 4\\ -\hline - & & \textcolor{rtb-red}{3.3v} & \raggedleft{17} & 18 & \textcolor{rtb-green}{GPIO5} & 24 & 5\\ -\hline -12 & 10 & \textcolor{rtb-teal}{MOSI} & \raggedleft{19} & 20 & \textcolor{rtb-black}{0v} & & \\ -\hline -13 & 9 & \textcolor{rtb-teal}{MISO} & \raggedleft{21} & 22 & \textcolor{rtb-green}{GPIO6} & 25 & 6\\ -\hline -14 & 11 & \textcolor{rtb-teal}{SCLK} & \raggedleft{23} & 24 & \textcolor{rtb-teal}{CE0} & 8 & 10\\ -\hline - & & \textcolor{rtb-black}{0v} & \raggedleft{25} & 26 & \textcolor{rtb-teal}{CE1} & 7 & 11\\ -\hline -\hline -WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ -\hline -\end{tabular} -\end{center} - -Note the differences between Revision 1 and Revision 2 Raspberry -Pi's. The Revision 2 is readily identifiable by the presence of the 2 -mounting holes. - -The revision 2 Raspberry Pi has an additional GPIO connector, P5, which is next to the main P1 GPIO -connector: - -\begin{center} -\begin{tabular}{|c|c|c||p{8mm}|p{8mm}||c|c|c|c|} -\hline -\multicolumn{8}{|c|}{\bfseries{P5: Secondary GPIO connector (Rev. 2 Pi only)}}\\ -\hline -\hline -WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ -\hline -\hline - & & \textcolor{rtb-maroon}{5v} & \raggedleft{1} & 2 & \textcolor{rtb-red}{3.3v} & & \\ -\hline -17 & 28 & \textcolor{rtb-green}{GPIO8} & \raggedleft{3} & 4 & \textcolor{rtb-green}{GPIO9} & 29 & 18 \\ -\hline -19 & 30 & \textcolor{rtb-green}{GPIO10} & \raggedleft{5} & 6 & \textcolor{rtb-green}{GPIO11} & 31 & 20 \\ -\hline - & & \textcolor{rtb-black}{0v} & \raggedleft{7} & 8 & \textcolor{rtb-black}{0v} & & \\ -\hline -\hline -WiringPi Pin & BCM GPIO & Name & \multicolumn{2}{|c||}{Header} & Name & BCM GPIO & WiringPi Pin\\ -\hline -\end{tabular} -\end{center} - - -\end{sffamily} -\end{document} diff --git a/other/wiringpi/wiringPi-96344ff/update b/other/wiringpi/wiringPi-96344ff/update deleted file mode 100755 index 0f722434c..000000000 --- a/other/wiringpi/wiringPi-96344ff/update +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -# update - update source files from master on yakko - -rsync -aHx --exclude='*.o' --exclude='*~' -v --delete gordon@yakko:rpi/git/wiringPi/ . diff --git a/other/wiringpi/wiringPi-96344ff/version.h b/other/wiringpi/wiringPi-96344ff/version.h deleted file mode 100644 index 45b2c50dc..000000000 --- a/other/wiringpi/wiringPi-96344ff/version.h +++ /dev/null @@ -1,3 +0,0 @@ -#define VERSION "2.44" -#define VERSION_MAJOR 2 -#define VERSION_MINOR 44 diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/COPYING.LESSER b/other/wiringpi/wiringPi-96344ff/wiringPi/COPYING.LESSER deleted file mode 100644 index 65c5ca88a..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/COPYING.LESSER +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser 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 -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/Makefile b/other/wiringpi/wiringPi-96344ff/wiringPi/Makefile deleted file mode 100644 index e1868b9a7..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/Makefile +++ /dev/null @@ -1,177 +0,0 @@ -# -# Makefile: -# wiringPi - Wiring Compatable library for the Raspberry Pi -# -# Copyright (c) 2012-2015 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# https://projects.drogon.net/raspberry-pi/wiringpi/ -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -VERSION=$(shell cat ../VERSION) -DESTDIR?=/usr -PREFIX?=/local - -LDCONFIG?=ldconfig - -ifneq ($V,1) -Q ?= @ -endif - -STATIC=libwiringPi.a -DYNAMIC=libwiringPi.so.$(VERSION) - -#DEBUG = -g -O0 -DEBUG = -O2 -CC = gcc -INCLUDE = -I. -DEFS = -D_GNU_SOURCE -CFLAGS = $(DEBUG) $(DEFS) -Wformat=2 -Wall -Wextra -Winline $(INCLUDE) -pipe -fPIC - -LIBS = -lm -lpthread -lrt -lcrypt - -############################################################################### - -SRC = wiringPi.c \ - wiringSerial.c wiringShift.c \ - piHiPri.c piThread.c \ - wiringPiSPI.c wiringPiI2C.c \ - softPwm.c softTone.c \ - mcp23008.c mcp23016.c mcp23017.c \ - mcp23s08.c mcp23s17.c \ - sr595.c \ - pcf8574.c pcf8591.c \ - mcp3002.c mcp3004.c mcp4802.c mcp3422.c \ - max31855.c max5322.c ads1115.c \ - sn3218.c \ - bmp180.c htu21d.c ds18b20.c rht03.c \ - drcSerial.c drcNet.c \ - pseudoPins.c \ - wpiExtensions.c - -HEADERS = $(shell ls *.h) - -OBJ = $(SRC:.c=.o) - -all: $(DYNAMIC) - -static: $(STATIC) - -$(STATIC): $(OBJ) - $Q echo "[Link (Static)]" - $Q ar rcs $(STATIC) $(OBJ) - $Q ranlib $(STATIC) -# @size $(STATIC) - -$(DYNAMIC): $(OBJ) - $Q echo "[Link (Dynamic)]" - $Q $(CC) -shared -Wl,-soname,libwiringPi.so$(WIRINGPI_SONAME_SUFFIX) -o libwiringPi.so.$(VERSION) $(LIBS) $(OBJ) - -.c.o: - $Q echo [Compile] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - - -.PHONY: clean -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) $(OBJ_I2C) *~ core tags Makefile.bak libwiringPi.* - -.PHONY: tags -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - - -.PHONY: install -install: $(DYNAMIC) - $Q echo "[Install Headers]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include - $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include - $Q echo "[Install Dynamic Lib]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib - $Q install -m 0755 libwiringPi.so.$(VERSION) $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) - $Q ln -sf $(DESTDIR)$(PREFIX)/lib/libwiringPi.so.$(VERSION) $(DESTDIR)/lib/libwiringPi.so - $Q $(LDCONFIG) - -.PHONY: install-static -install-static: $(STATIC) - $Q echo "[Install Headers]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/include - $Q install -m 0644 $(HEADERS) $(DESTDIR)$(PREFIX)/include - $Q echo "[Install Static Lib]" - $Q install -m 0755 -d $(DESTDIR)$(PREFIX)/lib - $Q install -m 0755 libwiringPi.a $(DESTDIR)$(PREFIX)/lib - -.PHONY: install-deb -install-deb: $(DYNAMIC) - $Q echo "[Install Headers: deb]" - $Q install -m 0755 -d ~/wiringPi/debian-template/wiringPi/usr/include - $Q install -m 0644 $(HEADERS) ~/wiringPi/debian-template/wiringPi/usr/include - $Q echo "[Install Dynamic Lib: deb]" - install -m 0755 -d ~/wiringPi/debian-template/wiringPi/usr/lib - install -m 0755 libwiringPi.so.$(VERSION) ~/wiringPi/debian-template/wiringPi/usr/lib/libwiringPi.so.$(VERSION) - ln -sf ~/wiringPi/debian-template/wiringPi/usr/lib/libwiringPi.so.$(VERSION) ~/wiringPi/debian-template/wiringPi/usr/lib/libwiringPi.so - -.PHONY: uninstall -uninstall: - $Q echo "[UnInstall]" - $Q cd $(DESTDIR)$(PREFIX)/include/ && rm -f $(HEADERS) - $Q cd $(DESTDIR)$(PREFIX)/lib/ && rm -f libwiringPi.* - $Q $(LDCONFIG) - - -.PHONY: depend -depend: - makedepend -Y $(SRC) $(SRC_I2C) - -# DO NOT DELETE - -wiringPi.o: softPwm.h softTone.h wiringPi.h ../version.h -wiringSerial.o: wiringSerial.h -wiringShift.o: wiringPi.h wiringShift.h -piHiPri.o: wiringPi.h -piThread.o: wiringPi.h -wiringPiSPI.o: wiringPi.h wiringPiSPI.h -wiringPiI2C.o: wiringPi.h wiringPiI2C.h -softPwm.o: wiringPi.h softPwm.h -softTone.o: wiringPi.h softTone.h -mcp23008.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23008.h -mcp23016.o: wiringPi.h wiringPiI2C.h mcp23016.h mcp23016reg.h -mcp23017.o: wiringPi.h wiringPiI2C.h mcp23x0817.h mcp23017.h -mcp23s08.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s08.h -mcp23s17.o: wiringPi.h wiringPiSPI.h mcp23x0817.h mcp23s17.h -sr595.o: wiringPi.h sr595.h -pcf8574.o: wiringPi.h wiringPiI2C.h pcf8574.h -pcf8591.o: wiringPi.h wiringPiI2C.h pcf8591.h -mcp3002.o: wiringPi.h wiringPiSPI.h mcp3002.h -mcp3004.o: wiringPi.h wiringPiSPI.h mcp3004.h -mcp4802.o: wiringPi.h wiringPiSPI.h mcp4802.h -mcp3422.o: wiringPi.h wiringPiI2C.h mcp3422.h -max31855.o: wiringPi.h wiringPiSPI.h max31855.h -max5322.o: wiringPi.h wiringPiSPI.h max5322.h -ads1115.o: wiringPi.h wiringPiI2C.h ads1115.h -sn3218.o: wiringPi.h wiringPiI2C.h sn3218.h -bmp180.o: wiringPi.h wiringPiI2C.h bmp180.h -htu21d.o: wiringPi.h wiringPiI2C.h htu21d.h -ds18b20.o: wiringPi.h ds18b20.h -drcSerial.o: wiringPi.h wiringSerial.h drcSerial.h -pseudoPins.o: wiringPi.h pseudoPins.h -wpiExtensions.o: wiringPi.h mcp23008.h mcp23016.h mcp23017.h mcp23s08.h -wpiExtensions.o: mcp23s17.h sr595.h pcf8574.h pcf8591.h mcp3002.h mcp3004.h -wpiExtensions.o: mcp4802.h mcp3422.h max31855.h max5322.h ads1115.h sn3218.h -wpiExtensions.o: drcSerial.h pseudoPins.h bmp180.h htu21d.h ds18b20.h -wpiExtensions.o: wpiExtensions.h diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/ads1115.c b/other/wiringpi/wiringPi-96344ff/wiringPi/ads1115.c deleted file mode 100644 index 648e6129c..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/ads1115.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * ads1115.c: - * Extend wiringPi with the ADS1115 I2C 16-bit ADC - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -/* - ********************************************************************************* - * We're going to work in a hybrid mode to fit in with the wiringPi way of - * doing things, so there will be 4 analog pin which read the 4 single-ended - * channels as usual, also some fake digitalOutputs - these are the control - * registers that allow the user to put it into single/diff mode, set the - * gain and data rates. - ********************************************************************************* - */ - -#include -#include -#include - -#include -#include - -#include "ads1115.h" - -// Bits in the config register (it's a 16-bit register) - -#define CONFIG_OS_MASK (0x8000) // Operational Status Register -#define CONFIG_OS_SINGLE (0x8000) // Write - Starts a single-conversion - // Read 1 = Conversion complete - -// The multiplexor - -#define CONFIG_MUX_MASK (0x7000) - -// Differential modes - -#define CONFIG_MUX_DIFF_0_1 (0x0000) // Pos = AIN0, Neg = AIN1 (default) -#define CONFIG_MUX_DIFF_0_3 (0x1000) // Pos = AIN0, Neg = AIN3 -#define CONFIG_MUX_DIFF_1_3 (0x2000) // Pos = AIN1, Neg = AIN3 -#define CONFIG_MUX_DIFF_2_3 (0x3000) // Pos = AIN2, Neg = AIN3 (2nd differential channel) - -// Single-ended modes - -#define CONFIG_MUX_SINGLE_0 (0x4000) // AIN0 -#define CONFIG_MUX_SINGLE_1 (0x5000) // AIN1 -#define CONFIG_MUX_SINGLE_2 (0x6000) // AIN2 -#define CONFIG_MUX_SINGLE_3 (0x7000) // AIN3 - -// Programmable Gain Amplifier - -#define CONFIG_PGA_MASK (0x0E00) -#define CONFIG_PGA_6_144V (0x0000) // +/-6.144V range = Gain 2/3 -#define CONFIG_PGA_4_096V (0x0200) // +/-4.096V range = Gain 1 -#define CONFIG_PGA_2_048V (0x0400) // +/-2.048V range = Gain 2 (default) -#define CONFIG_PGA_1_024V (0x0600) // +/-1.024V range = Gain 4 -#define CONFIG_PGA_0_512V (0x0800) // +/-0.512V range = Gain 8 -#define CONFIG_PGA_0_256V (0x0A00) // +/-0.256V range = Gain 16 - -#define CONFIG_MODE (0x0100) // 0 is continuous, 1 is single-shot (default) - -// Data Rate - -#define CONFIG_DR_MASK (0x00E0) -#define CONFIG_DR_8SPS (0x0000) // 8 samples per second -#define CONFIG_DR_16SPS (0x0020) // 16 samples per second -#define CONFIG_DR_32SPS (0x0040) // 32 samples per second -#define CONFIG_DR_64SPS (0x0060) // 64 samples per second -#define CONFIG_DR_128SPS (0x0080) // 128 samples per second (default) -#define CONFIG_DR_475SPS (0x00A0) // 475 samples per second -#define CONFIG_DR_860SPS (0x00C0) // 860 samples per second - -// Comparator mode - -#define CONFIG_CMODE_MASK (0x0010) -#define CONFIG_CMODE_TRAD (0x0000) // Traditional comparator with hysteresis (default) -#define CONFIG_CMODE_WINDOW (0x0010) // Window comparator - -// Comparator polarity - the polarity of the output alert/rdy pin - -#define CONFIG_CPOL_MASK (0x0008) -#define CONFIG_CPOL_ACTVLOW (0x0000) // Active low (default) -#define CONFIG_CPOL_ACTVHI (0x0008) // Active high - -// Latching comparator - does the alert/rdy pin latch - -#define CONFIG_CLAT_MASK (0x0004) -#define CONFIG_CLAT_NONLAT (0x0000) // Non-latching comparator (default) -#define CONFIG_CLAT_LATCH (0x0004) // Latching comparator - -// Comparitor queue - -#define CONFIG_CQUE_MASK (0x0003) -#define CONFIG_CQUE_1CONV (0x0000) // Assert after one conversions -#define CONFIG_CQUE_2CONV (0x0001) // Assert after two conversions -#define CONFIG_CQUE_4CONV (0x0002) // Assert after four conversions -#define CONFIG_CQUE_NONE (0x0003) // Disable the comparator (default) - -#define CONFIG_DEFAULT (0x8583) // From the datasheet - - -static const uint16_t dataRates [8] = -{ - CONFIG_DR_8SPS, CONFIG_DR_16SPS, CONFIG_DR_32SPS, CONFIG_DR_64SPS, CONFIG_DR_128SPS, CONFIG_DR_475SPS, CONFIG_DR_860SPS -} ; - -static const uint16_t gains [6] = -{ - CONFIG_PGA_6_144V, CONFIG_PGA_4_096V, CONFIG_PGA_2_048V, CONFIG_PGA_1_024V, CONFIG_PGA_0_512V, CONFIG_PGA_0_256V -} ; - - -/* - * analogRead: - * Pin is the channel to sample on the device. - * Channels 0-3 are single ended inputs, - * channels 4-7 are the various differential combinations. - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int chan = pin - node->pinBase ; - int16_t result ; - uint16_t config = CONFIG_DEFAULT ; - - chan &= 7 ; - -// Setup the configuration register - -// Set PGA/voltage range - - config &= ~CONFIG_PGA_MASK ; - config |= node->data0 ; - -// Set sample speed - - config &= ~CONFIG_DR_MASK ; - config |= node->data1 ; - -// Set single-ended channel or differential mode - - config &= ~CONFIG_MUX_MASK ; - - switch (chan) - { - case 0: config |= CONFIG_MUX_SINGLE_0 ; break ; - case 1: config |= CONFIG_MUX_SINGLE_1 ; break ; - case 2: config |= CONFIG_MUX_SINGLE_2 ; break ; - case 3: config |= CONFIG_MUX_SINGLE_3 ; break ; - - case 4: config |= CONFIG_MUX_DIFF_0_1 ; break ; - case 5: config |= CONFIG_MUX_DIFF_2_3 ; break ; - case 6: config |= CONFIG_MUX_DIFF_0_3 ; break ; - case 7: config |= CONFIG_MUX_DIFF_1_3 ; break ; - } - -// Start a single conversion - - config |= CONFIG_OS_SINGLE ; - config = __bswap_16 (config) ; - wiringPiI2CWriteReg16 (node->fd, 1, config) ; - -// Wait for the conversion to complete - - for (;;) - { - result = wiringPiI2CReadReg16 (node->fd, 1) ; - result = __bswap_16 (result) ; - if ((result & CONFIG_OS_MASK) != 0) - break ; - delayMicroseconds (100) ; - } - - result = wiringPiI2CReadReg16 (node->fd, 0) ; - result = __bswap_16 (result) ; - -// Sometimes with a 0v input on a single-ended channel the internal 0v reference -// can be higher than the input, so you get a negative result... - - if ( (chan < 4) && (result < 0) ) - return 0 ; - else - return (int)result ; -} - - -/* - * digitalWrite: - * It may seem odd to have a digital write here, but it's the best way - * to pass paramters into the chip in the wiringPi way of things. - * We have 2 digital registers: - * 0 is the gain control - * 1 is the data rate control - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int data) -{ - int chan = pin - node->pinBase ; - chan &= 3 ; - - if (chan == 0) // Gain Control - { - if ( (data < 0) || (data > 6) ) // Use default if out of range - data = 2 ; - node->data0 = gains [data] ; - } - else // Data rate control - { - if ( (data < 0) || (data > 7) ) // Use default if out of range - data = 4 ; - node->data1 = dataRates [data] ; // Bugfix 0-1 by "Eric de jong (gm)" - Thanks. - } - -} - - -/* - * analogWrite: - * We're using this to write to the 2 comparitor threshold registers. - * We could use a digitalWrite here but as it's an analog comparison - * then it feels better to do it this way. - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int data) -{ - int chan = pin - node->pinBase ; - int reg ; - int16_t ndata ; - - chan &= 3 ; - - reg = chan + 2 ; - - /**/ if (data < -32767) - ndata = -32767 ; - else if (data > 32767) - ndata = 32767 ; - else - ndata = (int16_t)data ; - - ndata = __bswap_16 (ndata) ; - wiringPiI2CWriteReg16 (node->fd, reg, data) ; -} - - - -/* - * ads1115Setup: - * Create a new wiringPi device node for an ads1115 on the Pi's - * I2C interface. - ********************************************************************************* - */ - -int ads1115Setup (const int pinBase, int i2cAddr) -{ - struct wiringPiNodeStruct *node ; - int fd ; - - if ((fd = wiringPiI2CSetup (i2cAddr)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 8) ; - - node->fd = fd ; - node->data0 = CONFIG_PGA_4_096V ; // Gain in data0 - node->data1 = CONFIG_DR_128SPS ; // Samples/sec in data1 - node->analogRead = myAnalogRead ; - node->analogWrite = myAnalogWrite ; - node->digitalWrite = myDigitalWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/ads1115.h b/other/wiringpi/wiringPi-96344ff/wiringPi/ads1115.h deleted file mode 100644 index 5c91735cc..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/ads1115.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * ads1115.c: - * Extend wiringPi with the ADS1115 I2C 16-bit ADC - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -// Constants for some of the internal functions - -// Gain - -#define ADS1115_GAIN_6 0 -#define ADS1115_GAIN_4 1 -#define ADS1115_GAIN_2 2 -#define ADS1115_GAIN_1 3 -#define ADS1115_GAIN_HALF 4 -#define ADS1115_GAIN_QUARTER 5 - -// Data rate - -#define ADS1115_DR_8 0 -#define ADS1115_DR_16 1 -#define ADS1115_DR_32 2 -#define ADS1115_DR_64 3 -#define ADS1115_DR_128 4 -#define ADS1115_DR_250 5 -#define ADS1115_DR_475 6 -#define ADS1115_DR_860 7 - -#ifdef __cplusplus -extern "C" { -#endif - -extern int ads1115Setup (int pinBase, int i2cAddress) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/bmp180.c b/other/wiringpi/wiringPi-96344ff/wiringPi/bmp180.c deleted file mode 100644 index bad4bb39b..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/bmp180.c +++ /dev/null @@ -1,237 +0,0 @@ -/* - * bmp180.c: - * Extend wiringPi with the BMP180 I2C Pressure and Temperature - * sensor. This is used in the Pi Weather Station - * Copyright (c) 2016 Gordon Henderson - * - * Information from the document held at: - * http://wmrx00.sourceforge.net/Arduino/BMP085-Calcs.pdf - * was very useful when building this code. - * - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" - -#include "bmp180.h" - -#undef DEBUG - -#define I2C_ADDRESS 0x77 -#define BMP180_OSS 0 - - -// Static calibration data -// The down-side of this is that there can only be one BMP180 in -// a system - which is practice isn't an issue as it's I2C -// address is fixed. - -static int16_t AC1, AC2, AC3 ; -static uint16_t AC4, AC5, AC6 ; -static int16_t VB1, VB2 ; -static int16_t MB, MC, MD ; - -static double c5, c6, mc, md, x0, x1, x2, yy0, yy1, yy2, p0, p1, p2 ; - -// Pressure & Temp variables - -uint32_t cPress, cTemp ; - -static int altitude ; - -/* - * read16: - * Quick hack to read the 16-bit data with the correct endian - ********************************************************************************* - */ - -uint16_t read16 (int fd, int reg) -{ - return (wiringPiI2CReadReg8 (fd, reg) << 8) | wiringPiI2CReadReg8 (fd, reg + 1) ; - -} - - -/* - * bmp180ReadTempPress: - * Does the hard work of reading the sensor - ********************************************************************************* - */ - -static void bmp180ReadTempPress (int fd) -{ - double fTemp, fPress ; - double tu, a ; - double pu, s, x, y, z ; - - uint8_t data [4] ; - -// Start a temperature sensor reading - - wiringPiI2CWriteReg8 (fd, 0xF4, 0x2E) ; - delay (5) ; - -// Read the raw data - - data [0] = wiringPiI2CReadReg8 (fd, 0xF6) ; - data [1] = wiringPiI2CReadReg8 (fd, 0xF7) ; - -// And calculate... - - tu = (data [0] * 256.0) + data [1] ; - - a = c5 * (tu - c6) ; - fTemp = a + (mc / (a + md)) ; - cTemp = (int)rint (((100.0 * fTemp) + 0.5) / 10.0) ; - -#ifdef DEBUG - printf ("fTemp: %f, cTemp: %6d\n", fTemp, cTemp) ; -#endif - -// Start a pressure snsor reading - - wiringPiI2CWriteReg8 (fd, 0xF4, 0x34 | (BMP180_OSS << 6)) ; - delay (5) ; - -// Read the raw data - - data [0] = wiringPiI2CReadReg8 (fd, 0xF6) ; - data [1] = wiringPiI2CReadReg8 (fd, 0xF7) ; - data [2] = wiringPiI2CReadReg8 (fd, 0xF8) ; - -// And calculate... - - pu = ((double)data [0] * 256.0) + (double)data [1] + ((double)data [2] / 256.0) ; - s = fTemp - 25.0 ; - x = (x2 * pow (s, 2.0)) + (x1 * s) + x0 ; - y = (yy2 * pow (s, 2.0)) + (yy1 * s) + yy0 ; - z = (pu - x) / y ; - fPress = (p2 * pow (z, 2.0)) + (p1 * z) + p0 ; - cPress = (int)rint (((100.0 * fPress) + 0.5) / 10.0) ; - -#ifdef DEBUG - printf ("fPress: %f, cPress: %6d\n", fPress, cPress) ; -#endif -} - - -/* - * myAnalogWrite: - * Write to a fake register to represent the height above sea level - * so that the peudo millibar register can read the pressure in mB - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int chan = pin - node->pinBase ; - - if (chan == 0) - altitude = value ; -} - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int chan = pin - node->pinBase ; - - bmp180ReadTempPress (node->fd) ; - - /**/ if (chan == 0) // Read Temperature - return cTemp ; - else if (chan == 1) // Pressure - return cPress ; - else if (chan == 2) // Pressure in mB - return cPress / pow (1 - ((double)altitude / 44330.0), 5.255) ; - else - return -9999 ; - -} - - -/* - * bmp180Setup: - * Create a new instance of a PCF8591 I2C GPIO interface. We know it - * has 4 pins, (4 analog inputs and 1 analog output which we'll shadow - * input 0) so all we need to know here is the I2C address and the - * user-defined pin base. - ********************************************************************************* - */ - -int bmp180Setup (const int pinBase) -{ - double c3, c4, b1 ; - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (I2C_ADDRESS)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 4) ; - - node->fd = fd ; - node->analogRead = myAnalogRead ; - node->analogWrite = myAnalogWrite ; - -// Read calibration data - - AC1 = read16 (fd, 0xAA) ; - AC2 = read16 (fd, 0xAC) ; - AC3 = read16 (fd, 0xAE) ; - AC4 = read16 (fd, 0xB0) ; - AC5 = read16 (fd, 0xB2) ; - AC6 = read16 (fd, 0xB4) ; - VB1 = read16 (fd, 0xB6) ; - VB2 = read16 (fd, 0xB8) ; - MB = read16 (fd, 0xBA) ; - MC = read16 (fd, 0xBC) ; - MD = read16 (fd, 0xBE) ; - -// Calculate coefficients - - c3 = 160.0 * pow (2.0, -15.0) * AC3 ; - c4 = pow (10.0, -3.0) * pow(2.0,-15.0) * AC4 ; - b1 = pow (160.0, 2.0) * pow(2.0,-30.0) * VB1 ; - c5 = (pow (2.0, -15.0) / 160.0) * AC5 ; - c6 = AC6 ; - mc = (pow (2.0, 11.0) / pow(160.0,2.0)) * MC ; - md = MD / 160.0 ; - x0 = AC1 ; - x1 = 160.0 * pow (2.0, -13.0) * AC2 ; - x2 = pow (160.0, 2.0) * pow(2.0,-25.0) * VB2 ; - yy0 = c4 * pow (2.0, 15.0) ; - yy1 = c4 * c3 ; - yy2 = c4 * b1 ; - p0 = (3791.0 - 8.0) / 1600.0 ; - p1 = 1.0 - 7357.0 * pow (2.0, -20.0) ; - p2 = 3038.0 * 100.0 * pow (2.0, -36.0) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/bmp180.h b/other/wiringpi/wiringPi-96344ff/wiringPi/bmp180.h deleted file mode 100644 index 4a6d13ae6..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/bmp180.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * bmp180.h: - * Extend wiringPi with the BMP180 I2C Pressure and Temperature - * sensor. - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int bmp180Setup (const int pinBase) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/drcNet.c b/other/wiringpi/wiringPi-96344ff/wiringPi/drcNet.c deleted file mode 100644 index 0964ff779..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/drcNet.c +++ /dev/null @@ -1,405 +0,0 @@ -/* - * drcNet.h: - * Extend wiringPi with the DRC Network protocol (e.g. to another Pi) - * Copyright (c) 2016-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include "wiringPi.h" -#include "drcNet.h" -#include "../wiringPiD/drcNetCmd.h" - - -/* - * remoteReadline: - * Read in a line of data from the remote server, ending with a newline - * character which is not stored. Returns the length or < 0 on - * any sort of failure. - ********************************************************************************* - */ - -static int remoteReadline (int fd, char *buf, int max) -{ - int len = 0 ; - char c ; - - for (;;) - { - if (read (fd, &c, 1) < 1) - return -1 ; - - if (c == '\n') - return len ; - - *buf++ = c ; - if (++len == max) - return len ; - } -} - - -/* - * getChallenge: - * Read in lines from the remote site until we get one identified - * as the challenge. This line contains the password salt. - ********************************************************************************* - */ - -static char *getChallenge (int fd) -{ - static char buf [1024] ; - int num ; - - for (;;) - { - if ((num = remoteReadline (fd, buf, 1023)) < 0) - return NULL ; - buf [num] = 0 ; - - if (strncmp (buf, "Challenge ", 10) == 0) - return &buf [10] ; - } -} - - -/* - * authenticate: - * Read in the challenge from the server, use it to encrypt our password - * and send it back to the server. Wait for a reply back from the server - * to say that we're good to go. - * The server will simply disconnect on a bad response. No 3 chances here. - ********************************************************************************* - */ - -static int authenticate (int fd, const char *pass) -{ - char *challenge ; - char *encrypted ; - char salted [1024] ; - - if ((challenge = getChallenge (fd)) == NULL) - return -1 ; - - sprintf (salted, "$6$%s$", challenge) ; - encrypted = crypt (pass, salted) ; - -// This is an assertion, or sanity check on my part... -// The '20' comes from the $6$ then the 16 characters of the salt, -// then the terminating $. - - if (strncmp (encrypted, salted, 20) != 0) - { - errno = EBADE ; - return -1 ; - } - -// 86 characters is the length of the SHA-256 hash - - if (write (fd, encrypted + 20, 86) == 86) - return 0 ; - else - return -1 ; -} - - -/* - * _drcSetupNet: - * Do the hard work of establishing a network connection and authenticating - * the password. - ********************************************************************************* - */ - -int _drcSetupNet (const char *ipAddress, const char *port, const char *password) -{ - struct addrinfo hints; - struct addrinfo *result, *rp ; - struct in6_addr serveraddr ; - int remoteFd ; - -// Start by seeing if we've been given a (textual) numeric IP address -// which will save lookups in getaddrinfo() - - memset (&hints, 0, sizeof (hints)) ; - hints.ai_flags = AI_NUMERICSERV ; - hints.ai_family = AF_UNSPEC ; - hints.ai_socktype = SOCK_STREAM ; - hints.ai_protocol = 0 ; - - if (inet_pton (AF_INET, ipAddress, &serveraddr) == 1) // Valid IPv4 - { - hints.ai_family = AF_INET ; - hints.ai_flags |= AI_NUMERICHOST ; - } - else - { - if (inet_pton (AF_INET6, ipAddress, &serveraddr) == 1) // Valid IPv6 - { - hints.ai_family = AF_INET6 ; - hints.ai_flags |= AI_NUMERICHOST ; - } - } - -// Now use getaddrinfo() with the newly supplied hints - - if (getaddrinfo (ipAddress, port, &hints, &result) != 0) - return -1 ; - -// Now try each address in-turn until we get one that connects... - - for (rp = result; rp != NULL; rp = rp->ai_next) - { - if ((remoteFd = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol)) < 0) - continue ; - - if (connect (remoteFd, rp->ai_addr, rp->ai_addrlen) < 0) - continue ; - - if (authenticate (remoteFd, password) < 0) - { - close (remoteFd) ; - errno = EACCES ; // Permission denied - return -1 ; - } - else - return remoteFd ; - } - - errno = EHOSTUNREACH ; // Host unreachable - may not be right, but good enough - return -1 ; // Nothing connected -} - - -/* - * myPinMode: - * Change the pin mode on the remote DRC device - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_PIN_MODE ; - cmd.data = mode ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; -} - - -/* - * myPullUpDnControl: - ********************************************************************************* - */ - -static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_PULL_UP_DN ; - cmd.data = mode ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_DIGITAL_WRITE ; - cmd.data = value ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; -} - - -/* - * myDigitalWrite8: - ********************************************************************************* - -static void myDigitalWrite8 (struct wiringPiNodeStruct *node, int pin, int value) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_DIGITAL_WRITE8 ; - cmd.data = value ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; -} - */ - - -/* - * myAnalogWrite: - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_ANALOG_WRITE ; - cmd.data = value ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; -} - - -/* - * myPwmWrite: - ********************************************************************************* - */ - -static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_PWM_WRITE ; - cmd.data = value ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; -} - - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_ANALOG_READ ; - cmd.data = 0 ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; - - return cmd.data ; -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_DIGITAL_READ ; - cmd.data = 0 ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; - - return cmd.data ; -} - - -/* - * myDigitalRead8: - ********************************************************************************* - -static unsigned int myDigitalRead8 (struct wiringPiNodeStruct *node, int pin) -{ - struct drcNetComStruct cmd ; - - cmd.pin = pin - node->pinBase ; - cmd.cmd = DRCN_DIGITAL_READ8 ; - cmd.data = 0 ; - - (void)send (node->fd, &cmd, sizeof (cmd), 0) ; - (void)recv (node->fd, &cmd, sizeof (cmd), 0) ; - - return cmd.data ; -} - */ - - -/* - * drcNet: - * Create a new instance of an DRC GPIO interface. - * Could be a variable nunber of pins here - we might not know in advance. - ********************************************************************************* - */ - -int drcSetupNet (const int pinBase, const int numPins, const char *ipAddress, const char *port, const char *password) -{ - int fd, len ; - struct wiringPiNodeStruct *node ; - - if ((fd = _drcSetupNet (ipAddress, port, password)) < 0) - return FALSE ; - - len = sizeof (struct drcNetComStruct) ; - - if (setsockopt (fd, SOL_SOCKET, SO_RCVLOWAT, (void *)&len, sizeof (len)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, numPins) ; - - node->fd = fd ; - node->pinMode = myPinMode ; - node->pullUpDnControl = myPullUpDnControl ; - node->analogRead = myAnalogRead ; - node->analogRead = myAnalogRead ; - node->analogWrite = myAnalogWrite ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; -//node->digitalRead8 = myDigitalRead8 ; -//node->digitalWrite8 = myDigitalWrite8 ; - node->pwmWrite = myPwmWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/drcNet.h b/other/wiringpi/wiringPi-96344ff/wiringPi/drcNet.h deleted file mode 100644 index 00f9b05d4..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/drcNet.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * drcNet.h: - * Extend wiringPi with the DRC Network protocol (e.g. to another Pi) - * Copyright (c) 2016-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -/********* -struct drcNetStruct -{ - uint32_t pin ; - uint32_t cmd ; - uint32_t data ; -} ; -**************/ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int drcSetupNet (const int pinBase, const int numPins, const char *ipAddress, const char *port, const char *password) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/drcSerial.c b/other/wiringpi/wiringPi-96344ff/wiringPi/drcSerial.c deleted file mode 100644 index db7cc0973..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/drcSerial.c +++ /dev/null @@ -1,196 +0,0 @@ -/* - * drcSerial.c: - * Extend wiringPi with the DRC Serial protocol (e.g. to Arduino) - * Copyright (c) 2013-2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include "wiringPi.h" -#include "wiringSerial.h" - -#include "drcSerial.h" - - -/* - * myPinMode: - * Change the pin mode on the remote DRC device - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - /**/ if (mode == OUTPUT) - serialPutchar (node->fd, 'o') ; // Input - else if (mode == PWM_OUTPUT) - serialPutchar (node->fd, 'p') ; // PWM - else - serialPutchar (node->fd, 'i') ; // Default to input - - serialPutchar (node->fd, pin - node->pinBase) ; -} - - -/* - * myPullUpDnControl: - * ATmegas only have pull-up's on of off. No pull-downs. - ********************************************************************************* - */ - -static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) -{ - -// Force pin into input mode - - serialPutchar (node->fd, 'i' ) ; - serialPutchar (node->fd, pin - node->pinBase) ; - - /**/ if (mode == PUD_UP) - { - serialPutchar (node->fd, '1') ; - serialPutchar (node->fd, pin - node->pinBase) ; - } - else if (mode == PUD_OFF) - { - serialPutchar (node->fd, '0') ; - serialPutchar (node->fd, pin - node->pinBase) ; - } -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - serialPutchar (node->fd, value == 0 ? '0' : '1') ; - serialPutchar (node->fd, pin - node->pinBase) ; -} - - -/* - * myPwmWrite: - ********************************************************************************* - */ - -static void myPwmWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - serialPutchar (node->fd, 'v') ; - serialPutchar (node->fd, pin - node->pinBase) ; - serialPutchar (node->fd, value & 0xFF) ; -} - - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int vHi, vLo ; - - serialPutchar (node->fd, 'a') ; - serialPutchar (node->fd, pin - node->pinBase) ; - vHi = serialGetchar (node->fd) ; - vLo = serialGetchar (node->fd) ; - - return (vHi << 8) | vLo ; -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - serialPutchar (node->fd, 'r') ; // Send read command - serialPutchar (node->fd, pin - node->pinBase) ; - return (serialGetchar (node->fd) == '0') ? 0 : 1 ; -} - - -/* - * drcSetup: - * Create a new instance of an DRC GPIO interface. - * Could be a variable nunber of pins here - we might not know in advance - * if it's an ATmega with 14 pins, or something with less or more! - ********************************************************************************* - */ - -int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) -{ - int fd ; - int ok, tries ; - time_t then ; - struct wiringPiNodeStruct *node ; - - if ((fd = serialOpen (device, baud)) < 0) - return FALSE ; - - delay (10) ; // May need longer if it's an Uno that reboots on the open... - -// Flush any pending input - - while (serialDataAvail (fd)) - (void)serialGetchar (fd) ; - - ok = FALSE ; - for (tries = 1 ; (tries < 5) && (!ok) ; ++tries) - { - serialPutchar (fd, '@') ; // Ping - then = time (NULL) + 2 ; - while (time (NULL) < then) - if (serialDataAvail (fd)) - { - if (serialGetchar (fd) == '@') - { - ok = TRUE ; - break ; - } - } - } - - if (!ok) - { - serialClose (fd) ; - return FALSE ; - } - - node = wiringPiNewNode (pinBase, numPins) ; - - node->fd = fd ; - node->pinMode = myPinMode ; - node->pullUpDnControl = myPullUpDnControl ; - node->analogRead = myAnalogRead ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->pwmWrite = myPwmWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/drcSerial.h b/other/wiringpi/wiringPi-96344ff/wiringPi/drcSerial.h deleted file mode 100644 index 29e988e1f..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/drcSerial.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * drcSerial.h: - * Extend wiringPi with the DRC Serial protocol (e.g. to Arduino) - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/ds18b20.c b/other/wiringpi/wiringPi-96344ff/wiringPi/ds18b20.c deleted file mode 100644 index 533398e21..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/ds18b20.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * ds18b20.c: - * Extend wiringPi with the DS18B20 1-Wire temperature sensor. - * This is used in the Pi Weather Station and many other places. - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "wiringPi.h" - -#include "ds18b20.h" - -#define W1_PREFIX "/sys/bus/w1/devices/28-" -#define W1_POSTFIX "/w1_slave" - - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int chan = pin - node->pinBase ; - int fd = node->fd ; - char buffer [4096] ; - char *p ; - int temp, sign ; - - if (chan != 0) - return -9999 ; - -// Rewind the file - we're keeping it open to keep things going -// smoothly - - lseek (fd, 0, SEEK_SET) ; - -// Read the file - we know it's only a couple of lines, so this ought to be -// more than enough - - if (read (fd, buffer, 4096) <= 0) // Read nothing, or it failed in some odd way - return -9998 ; - -// Look for YES, then t= - - if (strstr (buffer, "YES") == NULL) - return -9997 ; - - if ((p = strstr (buffer, "t=")) == NULL) - return -9996 ; - -// p points to the 't', so we skip over it... - - p += 2 ; - -// and extract the number -// (without caring about overflow) - - - if (*p == '-') // Negative number? - { - sign = -1 ; - ++p ; - } - else - sign = 1 ; - - temp = 0 ; - while (isdigit (*p)) - { - temp = temp * 10 + (*p - '0') ; - ++p ; - } - -// We know it returns temp * 1000, but we only really want temp * 10, so -// do a bit of rounding... - - temp = (temp + 50) / 100 ; - return temp * sign ; -} - - -/* - * ds18b20Setup: - * Create a new instance of a DS18B20 temperature sensor. - ********************************************************************************* - */ - -int ds18b20Setup (const int pinBase, const char *deviceId) -{ - int fd ; - struct wiringPiNodeStruct *node ; - char *fileName ; - -// Allocate space for the filename - - if ((fileName = malloc (strlen (W1_PREFIX) + strlen (W1_POSTFIX) + strlen (deviceId) + 1)) == NULL) - return FALSE ; - - sprintf (fileName, "%s%s%s", W1_PREFIX, deviceId, W1_POSTFIX) ; - - fd = open (fileName, O_RDONLY) ; - - free (fileName) ; - - if (fd < 0) - return FALSE ; - -// We'll keep the file open, to make access a little faster -// although it's very slow reading these things anyway )-: - - node = wiringPiNewNode (pinBase, 1) ; - - node->fd = fd ; - node->analogRead = myAnalogRead ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/ds18b20.h b/other/wiringpi/wiringPi-96344ff/wiringPi/ds18b20.h deleted file mode 100644 index a9ea29112..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/ds18b20.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * bmp180.h: - * Extend wiringPi with the BMP180 I2C Pressure and Temperature - * sensor. - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int ds18b20Setup (const int pinBase, const char *serialNum) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/htu21d.c b/other/wiringpi/wiringPi-96344ff/wiringPi/htu21d.c deleted file mode 100644 index 46c0fcb66..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/htu21d.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * htu21d.c: - * Extend wiringPi with the HTU21D I2C humidity and Temperature - * sensor. This is used in the Pi Weather station. - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" - -#include "htu21d.h" - -#define DEBUG -#undef FAKE_SENSOR - -#define I2C_ADDRESS 0x40 - -int checksum (UNU uint8_t data [4]) -{ - return TRUE ; -} - - - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int chan = pin - node->pinBase ; - int fd = node->fd ; - uint8_t data [4] ; - uint32_t sTemp, sHumid ; - double fTemp, fHumid ; - int cTemp, cHumid ; - - /**/ if (chan == 0) // Read Temperature - { - -// Send read temperature command: - - data [0] = 0xF3 ; - if (write (fd, data, 1) != 1) - return -9999 ; - -// Wait then read the data - - delay (50) ; - if (read (fd, data, 3) != 3) - return -9998 ; - - if (!checksum (data)) - return -9997 ; - -// Do the calculation - - sTemp = (data [0] << 8) | data [1] ; - fTemp = -48.85 + 175.72 * (double)sTemp / 63356.0 ; - cTemp = (int)rint (((100.0 * fTemp) + 0.5) / 10.0) ; - return cTemp ; - } - else if (chan == 1) // humidity - { -// Send read humidity command: - - data [0] = 0xF5 ; - if (write (fd, data, 1) != 1) - return -9999 ; - -// Wait then read the data - - delay (50) ; - if (read (fd, data, 3) != 3) - return -9998 ; - - if (!checksum (data)) - return -9997 ; - - sHumid = (data [0] << 8) | data [1] ; - fHumid = -6.0 + 125.0 * (double)sHumid / 65536.0 ; - cHumid = (int)rint (((100.0 * fHumid) + 0.5) / 10.0) ; - return cHumid ; - } - else - return -9999 ; -} - - -/* - * htu21dSetup: - * Create a new instance of a HTU21D I2C GPIO interface. - * This chip has a fixed I2C address, so we are not providing any - * allowance to change this. - ********************************************************************************* - */ - -int htu21dSetup (const int pinBase) -{ - int fd ; - struct wiringPiNodeStruct *node ; - uint8_t data ; - int status ; - - if ((fd = wiringPiI2CSetup (I2C_ADDRESS)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 2) ; - - node->fd = fd ; - node->analogRead = myAnalogRead ; - -// Send a reset code to it: - - data = 0xFE ; - if (write (fd, &data, 1) != 1) - return FALSE ; - - delay (15) ; - -// Read the status register to check it's really there - - status = wiringPiI2CReadReg8 (fd, 0xE7) ; - - return (status == 0x02) ? TRUE : FALSE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/htu21d.h b/other/wiringpi/wiringPi-96344ff/wiringPi/htu21d.h deleted file mode 100644 index 3965c5445..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/htu21d.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * htu21d.h: - * Extend wiringPi with the HTU21D I2C Humidity and Temperature - * sensor. - * Copyright (c) 2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int htu21dSetup (const int pinBase) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/max31855.c b/other/wiringpi/wiringPi-96344ff/wiringPi/max31855.c deleted file mode 100644 index d86cabdbc..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/max31855.c +++ /dev/null @@ -1,99 +0,0 @@ -/* - * max31855.c: - * Extend wiringPi with the max31855 SPI Analog to Digital convertor - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include -#include - -#include "max31855.h" - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - uint32_t spiData ; - int temp ; - int chan = pin - node->pinBase ; - - wiringPiSPIDataRW (node->fd, (unsigned char *)&spiData, 4) ; - - spiData = __bswap_32(spiData) ; - - switch (chan) - { - case 0: // Existing read - return raw value * 4 - spiData >>= 18 ; - temp = spiData & 0x1FFF ; // Bottom 13 bits - if ((spiData & 0x2000) != 0) // Negative - temp = -temp ; - - return temp ; - - case 1: // Return error bits - return spiData & 0x7 ; - - case 2: // Return temp in C * 10 - spiData >>= 18 ; - temp = spiData & 0x1FFF ; // Bottom 13 bits - if ((spiData & 0x2000) != 0) // Negative - temp = -temp ; - - return (int)((((double)temp * 25) + 0.5) / 10.0) ; - - case 3: // Return temp in F * 10 - spiData >>= 18 ; - temp = spiData & 0x1FFF ; // Bottom 13 bits - if ((spiData & 0x2000) != 0) // Negative - temp = -temp ; - - return (int)((((((double)temp * 0.25 * 9.0 / 5.0) + 32.0) * 100.0) + 0.5) / 10.0) ; - - default: // Who knows... - return 0 ; - - } -} - - -/* - * max31855Setup: - * Create a new wiringPi device node for an max31855 on the Pi's - * SPI interface. - ********************************************************************************* - */ - -int max31855Setup (const int pinBase, int spiChannel) -{ - struct wiringPiNodeStruct *node ; - - if (wiringPiSPISetup (spiChannel, 5000000) < 0) // 5MHz - prob 4 on the Pi - return FALSE ; - - node = wiringPiNewNode (pinBase, 4) ; - - node->fd = spiChannel ; - node->analogRead = myAnalogRead ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/max31855.h b/other/wiringpi/wiringPi-96344ff/wiringPi/max31855.h deleted file mode 100644 index 385c4bd36..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/max31855.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * max31855.c: - * Extend wiringPi with the MAX31855 SPI Thermocouple driver - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int max31855Setup (int pinBase, int spiChannel) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/max5322.c b/other/wiringpi/wiringPi-96344ff/wiringPi/max5322.c deleted file mode 100644 index e56b0853a..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/max5322.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * max5322.c: - * Extend wiringPi with the MAX5322 SPI Digital to Analog convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "max5322.h" - -/* - * myAnalogWrite: - * Write analog value on the given pin - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - unsigned char spiData [2] ; - unsigned char chanBits, dataBits ; - int chan = pin - node->pinBase ; - - if (chan == 0) - chanBits = 0b01000000 ; - else - chanBits = 0b01010000 ; - - chanBits |= ((value >> 12) & 0x0F) ; - dataBits = ((value ) & 0xFF) ; - - spiData [0] = chanBits ; - spiData [1] = dataBits ; - - wiringPiSPIDataRW (node->fd, spiData, 2) ; -} - -/* - * max5322Setup: - * Create a new wiringPi device node for an max5322 on the Pi's - * SPI interface. - ********************************************************************************* - */ - -int max5322Setup (const int pinBase, int spiChannel) -{ - struct wiringPiNodeStruct *node ; - unsigned char spiData [2] ; - - if (wiringPiSPISetup (spiChannel, 8000000) < 0) // 10MHz Max - return FALSE ; - - node = wiringPiNewNode (pinBase, 2) ; - - node->fd = spiChannel ; - node->analogWrite = myAnalogWrite ; - -// Enable both DACs - - spiData [0] = 0b11100000 ; - spiData [1] = 0 ; - - wiringPiSPIDataRW (node->fd, spiData, 2) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/max5322.h b/other/wiringpi/wiringPi-96344ff/wiringPi/max5322.h deleted file mode 100644 index a217cf88f..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/max5322.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * max5322.h: - * Extend wiringPi with the MAX5322 SPI Digital to Analog convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int max5322Setup (int pinBase, int spiChannel) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23008.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23008.c deleted file mode 100644 index 71757a875..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23008.c +++ /dev/null @@ -1,149 +0,0 @@ -/* - * mcp23008.c: - * Extend wiringPi with the MCP 23008 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" -#include "mcp23x0817.h" - -#include "mcp23008.h" - - -/* - * myPinMode: - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - reg = MCP23x08_IODIR ; - mask = 1 << (pin - node->pinBase) ; - old = wiringPiI2CReadReg8 (node->fd, reg) ; - - if (mode == OUTPUT) - old &= (~mask) ; - else - old |= mask ; - - wiringPiI2CWriteReg8 (node->fd, reg, old) ; -} - - -/* - * myPullUpDnControl: - ********************************************************************************* - */ - -static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - reg = MCP23x08_GPPU ; - mask = 1 << (pin - node->pinBase) ; - - old = wiringPiI2CReadReg8 (node->fd, reg) ; - - if (mode == PUD_UP) - old |= mask ; - else - old &= (~mask) ; - - wiringPiI2CWriteReg8 (node->fd, reg, old) ; -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int bit, old ; - - bit = 1 << ((pin - node->pinBase) & 7) ; - - old = node->data2 ; - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - wiringPiI2CWriteReg8 (node->fd, MCP23x08_GPIO, old) ; - node->data2 = old ; -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - int mask, value ; - - mask = 1 << ((pin - node->pinBase) & 7) ; - value = wiringPiI2CReadReg8 (node->fd, MCP23x08_GPIO) ; - - if ((value & mask) == 0) - return LOW ; - else - return HIGH ; -} - - -/* - * mcp23008Setup: - * Create a new instance of an MCP23008 I2C GPIO interface. We know it - * has 8 pins, so all we need to know here is the I2C address and the - * user-defined pin base. - ********************************************************************************* - */ - -int mcp23008Setup (const int pinBase, const int i2cAddress) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; - - wiringPiI2CWriteReg8 (fd, MCP23x08_IOCON, IOCON_INIT) ; - - node = wiringPiNewNode (pinBase, 8) ; - - node->fd = fd ; - node->pinMode = myPinMode ; - node->pullUpDnControl = myPullUpDnControl ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->data2 = wiringPiI2CReadReg8 (fd, MCP23x08_OLAT) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23008.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23008.h deleted file mode 100644 index e9299a8cf..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23008.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 23008.h: - * Extend wiringPi with the MCP 23008 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp23008Setup (const int pinBase, const int i2cAddress) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016.c deleted file mode 100644 index 928d9e5ac..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016.c +++ /dev/null @@ -1,164 +0,0 @@ -/* - * mcp23016.c: - * Extend wiringPi with the MCP 23016 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" -#include "mcp23016.h" - -#include "mcp23016reg.h" - - -/* - * myPinMode: - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - reg = MCP23016_IODIR0 ; - else - { - reg = MCP23016_IODIR1 ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - old = wiringPiI2CReadReg8 (node->fd, reg) ; - - if (mode == OUTPUT) - old &= (~mask) ; - else - old |= mask ; - - wiringPiI2CWriteReg8 (node->fd, reg, old) ; -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int bit, old ; - - pin -= node->pinBase ; // Pin now 0-15 - - bit = 1 << (pin & 7) ; - - if (pin < 8) // Bank A - { - old = node->data2 ; - - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - wiringPiI2CWriteReg8 (node->fd, MCP23016_GP0, old) ; - node->data2 = old ; - } - else // Bank B - { - old = node->data3 ; - - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - wiringPiI2CWriteReg8 (node->fd, MCP23016_GP1, old) ; - node->data3 = old ; - } -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - int mask, value, gpio ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - gpio = MCP23016_GP0 ; - else - { - gpio = MCP23016_GP1 ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - value = wiringPiI2CReadReg8 (node->fd, gpio) ; - - if ((value & mask) == 0) - return LOW ; - else - return HIGH ; -} - - -/* - * mcp23016Setup: - * Create a new instance of an MCP23016 I2C GPIO interface. We know it - * has 16 pins, so all we need to know here is the I2C address and the - * user-defined pin base. - ********************************************************************************* - */ - -int mcp23016Setup (const int pinBase, const int i2cAddress) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; - - wiringPiI2CWriteReg8 (fd, MCP23016_IOCON0, IOCON_INIT) ; - wiringPiI2CWriteReg8 (fd, MCP23016_IOCON1, IOCON_INIT) ; - - node = wiringPiNewNode (pinBase, 16) ; - - node->fd = fd ; - node->pinMode = myPinMode ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->data2 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT0) ; - node->data3 = wiringPiI2CReadReg8 (fd, MCP23016_OLAT1) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016.h deleted file mode 100644 index f9b5cc549..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * mcp23016.h: - * Extend wiringPi with the MCP 23016 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp23016Setup (const int pinBase, const int i2cAddress) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016reg.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016reg.h deleted file mode 100644 index 9aea92d51..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23016reg.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * mcp23016: - * Copyright (c) 2012-2013 Gordon Henderson - * - * Header file for code using the MCP23016 GPIO expander - * chip. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -// MCP23016 Registers - -#define MCP23016_GP0 0x00 -#define MCP23016_GP1 0x01 -#define MCP23016_OLAT0 0x02 -#define MCP23016_OLAT1 0x03 -#define MCP23016_IPOL0 0x04 -#define MCP23016_IPOL1 0x05 -#define MCP23016_IODIR0 0x06 -#define MCP23016_IODIR1 0x07 -#define MCP23016_INTCAP0 0x08 -#define MCP23016_INTCAP1 0x09 -#define MCP23016_IOCON0 0x0A -#define MCP23016_IOCON1 0x0B - -// Bits in the IOCON register - -#define IOCON_IARES 0x01 - -// Default initialisation mode - -#define IOCON_INIT 0 diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23017.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23017.c deleted file mode 100644 index 4c3952d26..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23017.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * mcp23017.c: - * Extend wiringPi with the MCP 23017 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" -#include "mcp23x0817.h" - -#include "mcp23017.h" - - -/* - * myPinMode: - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - reg = MCP23x17_IODIRA ; - else - { - reg = MCP23x17_IODIRB ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - old = wiringPiI2CReadReg8 (node->fd, reg) ; - - if (mode == OUTPUT) - old &= (~mask) ; - else - old |= mask ; - - wiringPiI2CWriteReg8 (node->fd, reg, old) ; -} - - -/* - * myPullUpDnControl: - ********************************************************************************* - */ - -static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - reg = MCP23x17_GPPUA ; - else - { - reg = MCP23x17_GPPUB ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - old = wiringPiI2CReadReg8 (node->fd, reg) ; - - if (mode == PUD_UP) - old |= mask ; - else - old &= (~mask) ; - - wiringPiI2CWriteReg8 (node->fd, reg, old) ; -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int bit, old ; - - pin -= node->pinBase ; // Pin now 0-15 - - bit = 1 << (pin & 7) ; - - if (pin < 8) // Bank A - { - old = node->data2 ; - - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOA, old) ; - node->data2 = old ; - } - else // Bank B - { - old = node->data3 ; - - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - wiringPiI2CWriteReg8 (node->fd, MCP23x17_GPIOB, old) ; - node->data3 = old ; - } -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - int mask, value, gpio ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - gpio = MCP23x17_GPIOA ; - else - { - gpio = MCP23x17_GPIOB ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - value = wiringPiI2CReadReg8 (node->fd, gpio) ; - - if ((value & mask) == 0) - return LOW ; - else - return HIGH ; -} - - -/* - * mcp23017Setup: - * Create a new instance of an MCP23017 I2C GPIO interface. We know it - * has 16 pins, so all we need to know here is the I2C address and the - * user-defined pin base. - ********************************************************************************* - */ - -int mcp23017Setup (const int pinBase, const int i2cAddress) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; - - wiringPiI2CWriteReg8 (fd, MCP23x17_IOCON, IOCON_INIT) ; - - node = wiringPiNewNode (pinBase, 16) ; - - node->fd = fd ; - node->pinMode = myPinMode ; - node->pullUpDnControl = myPullUpDnControl ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->data2 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATA) ; - node->data3 = wiringPiI2CReadReg8 (fd, MCP23x17_OLATB) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23017.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23017.h deleted file mode 100644 index 79b4d7b31..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23017.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 23017.h: - * Extend wiringPi with the MCP 23017 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp23017Setup (const int pinBase, const int i2cAddress) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s08.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s08.c deleted file mode 100644 index f293f3a14..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s08.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * mcp23s08.c: - * Extend wiringPi with the MCP 23s08 SPI GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "wiringPiSPI.h" -#include "mcp23x0817.h" - -#include "mcp23s08.h" - -#define MCP_SPEED 4000000 - - - -/* - * writeByte: - * Write a byte to a register on the MCP23s08 on the SPI bus. - ********************************************************************************* - */ - -static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data) -{ - uint8_t spiData [4] ; - - spiData [0] = CMD_WRITE | ((devId & 7) << 1) ; - spiData [1] = reg ; - spiData [2] = data ; - - wiringPiSPIDataRW (spiPort, spiData, 3) ; -} - -/* - * readByte: - * Read a byte from a register on the MCP23s08 on the SPI bus. - ********************************************************************************* - */ - -static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg) -{ - uint8_t spiData [4] ; - - spiData [0] = CMD_READ | ((devId & 7) << 1) ; - spiData [1] = reg ; - - wiringPiSPIDataRW (spiPort, spiData, 3) ; - - return spiData [2] ; -} - - -/* - * myPinMode: - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - reg = MCP23x08_IODIR ; - mask = 1 << (pin - node->pinBase) ; - old = readByte (node->data0, node->data1, reg) ; - - if (mode == OUTPUT) - old &= (~mask) ; - else - old |= mask ; - - writeByte (node->data0, node->data1, reg, old) ; -} - - -/* - * myPullUpDnControl: - ********************************************************************************* - */ - -static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - reg = MCP23x08_GPPU ; - mask = 1 << (pin - node->pinBase) ; - - old = readByte (node->data0, node->data1, reg) ; - - if (mode == PUD_UP) - old |= mask ; - else - old &= (~mask) ; - - writeByte (node->data0, node->data1, reg, old) ; -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int bit, old ; - - bit = 1 << ((pin - node->pinBase) & 7) ; - - old = node->data2 ; - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - writeByte (node->data0, node->data1, MCP23x08_GPIO, old) ; - node->data2 = old ; -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - int mask, value ; - - mask = 1 << ((pin - node->pinBase) & 7) ; - value = readByte (node->data0, node->data1, MCP23x08_GPIO) ; - - if ((value & mask) == 0) - return LOW ; - else - return HIGH ; -} - - -/* - * mcp23s08Setup: - * Create a new instance of an MCP23s08 SPI GPIO interface. We know it - * has 8 pins, so all we need to know here is the SPI address and the - * user-defined pin base. - ********************************************************************************* - */ - -int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) -{ - struct wiringPiNodeStruct *node ; - - if (wiringPiSPISetup (spiPort, MCP_SPEED) < 0) - return FALSE ; - - writeByte (spiPort, devId, MCP23x08_IOCON, IOCON_INIT) ; - - node = wiringPiNewNode (pinBase, 8) ; - - node->data0 = spiPort ; - node->data1 = devId ; - node->pinMode = myPinMode ; - node->pullUpDnControl = myPullUpDnControl ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->data2 = readByte (spiPort, devId, MCP23x08_OLAT) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s08.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s08.h deleted file mode 100644 index ebf93d198..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s08.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 23s08.h: - * Extend wiringPi with the MCP 23s08 SPI GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp23s08Setup (const int pinBase, const int spiPort, const int devId) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s17.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s17.c deleted file mode 100644 index 42b0358d3..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s17.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * mcp23s17.c: - * Extend wiringPi with the MCP 23s17 SPI GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "wiringPiSPI.h" -#include "mcp23x0817.h" - -#include "mcp23s17.h" - -#define MCP_SPEED 4000000 - - - -/* - * writeByte: - * Write a byte to a register on the MCP23s17 on the SPI bus. - ********************************************************************************* - */ - -static void writeByte (uint8_t spiPort, uint8_t devId, uint8_t reg, uint8_t data) -{ - uint8_t spiData [4] ; - - spiData [0] = CMD_WRITE | ((devId & 7) << 1) ; - spiData [1] = reg ; - spiData [2] = data ; - - wiringPiSPIDataRW (spiPort, spiData, 3) ; -} - -/* - * readByte: - * Read a byte from a register on the MCP23s17 on the SPI bus. - ********************************************************************************* - */ - -static uint8_t readByte (uint8_t spiPort, uint8_t devId, uint8_t reg) -{ - uint8_t spiData [4] ; - - spiData [0] = CMD_READ | ((devId & 7) << 1) ; - spiData [1] = reg ; - - wiringPiSPIDataRW (spiPort, spiData, 3) ; - - return spiData [2] ; -} - - -/* - * myPinMode: - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - reg = MCP23x17_IODIRA ; - else - { - reg = MCP23x17_IODIRB ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - old = readByte (node->data0, node->data1, reg) ; - - if (mode == OUTPUT) - old &= (~mask) ; - else - old |= mask ; - - writeByte (node->data0, node->data1, reg, old) ; -} - - -/* - * myPullUpDnControl: - ********************************************************************************* - */ - -static void myPullUpDnControl (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int mask, old, reg ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - reg = MCP23x17_GPPUA ; - else - { - reg = MCP23x17_GPPUB ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - old = readByte (node->data0, node->data1, reg) ; - - if (mode == PUD_UP) - old |= mask ; - else - old &= (~mask) ; - - writeByte (node->data0, node->data1, reg, old) ; -} - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int bit, old ; - - pin -= node->pinBase ; // Pin now 0-15 - - bit = 1 << (pin & 7) ; - - if (pin < 8) // Bank A - { - old = node->data2 ; - - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - writeByte (node->data0, node->data1, MCP23x17_GPIOA, old) ; - node->data2 = old ; - } - else // Bank B - { - old = node->data3 ; - - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - writeByte (node->data0, node->data1, MCP23x17_GPIOB, old) ; - node->data3 = old ; - } -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - int mask, value, gpio ; - - pin -= node->pinBase ; - - if (pin < 8) // Bank A - gpio = MCP23x17_GPIOA ; - else - { - gpio = MCP23x17_GPIOB ; - pin &= 0x07 ; - } - - mask = 1 << pin ; - value = readByte (node->data0, node->data1, gpio) ; - - if ((value & mask) == 0) - return LOW ; - else - return HIGH ; -} - - -/* - * mcp23s17Setup: - * Create a new instance of an MCP23s17 SPI GPIO interface. We know it - * has 16 pins, so all we need to know here is the SPI address and the - * user-defined pin base. - ********************************************************************************* - */ - -int mcp23s17Setup (const int pinBase, const int spiPort, const int devId) -{ - struct wiringPiNodeStruct *node ; - - if (wiringPiSPISetup (spiPort, MCP_SPEED) < 0) - return FALSE ; - - writeByte (spiPort, devId, MCP23x17_IOCON, IOCON_INIT | IOCON_HAEN) ; - writeByte (spiPort, devId, MCP23x17_IOCONB, IOCON_INIT | IOCON_HAEN) ; - - node = wiringPiNewNode (pinBase, 16) ; - - node->data0 = spiPort ; - node->data1 = devId ; - node->pinMode = myPinMode ; - node->pullUpDnControl = myPullUpDnControl ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->data2 = readByte (spiPort, devId, MCP23x17_OLATA) ; - node->data3 = readByte (spiPort, devId, MCP23x17_OLATB) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s17.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s17.h deleted file mode 100644 index 3b2a80883..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23s17.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 23s17.h: - * Extend wiringPi with the MCP 23s17 SPI GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp23s17Setup (int pinBase, int spiPort, int devId) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23x08.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23x08.h deleted file mode 100644 index c4e6b272c..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23x08.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * mcp23x17: - * Copyright (c) 2012-2013 Gordon Henderson - * - * Header file for code using the MCP23x17 GPIO expander chip. - * This comes in 2 flavours: MCP23017 which has an I2C interface, - * an the MXP23S17 which has an SPI interface. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -// MCP23x17 Registers - -#define IODIRA 0x00 -#define IPOLA 0x02 -#define GPINTENA 0x04 -#define DEFVALA 0x06 -#define INTCONA 0x08 -#define IOCON 0x0A -#define GPPUA 0x0C -#define INTFA 0x0E -#define INTCAPA 0x10 -#define GPIOA 0x12 -#define OLATA 0x14 - -#define IODIRB 0x01 -#define IPOLB 0x03 -#define GPINTENB 0x05 -#define DEFVALB 0x07 -#define INTCONB 0x09 -#define IOCONB 0x0B -#define GPPUB 0x0D -#define INTFB 0x0F -#define INTCAPB 0x11 -#define GPIOB 0x13 -#define OLATB 0x15 - -// Bits in the IOCON register - -#define IOCON_UNUSED 0x01 -#define IOCON_INTPOL 0x02 -#define IOCON_ODR 0x04 -#define IOCON_HAEN 0x08 -#define IOCON_DISSLW 0x10 -#define IOCON_SEQOP 0x20 -#define IOCON_MIRROR 0x40 -#define IOCON_BANK_MODE 0x80 - -// Default initialisation mode - -#define IOCON_INIT (IOCON_SEQOP) - -// SPI Command codes - -#define CMD_WRITE 0x40 -#define CMD_READ 0x41 diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23x0817.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23x0817.h deleted file mode 100644 index 58bc03823..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp23x0817.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * mcp23xxx: - * Copyright (c) 2012-2013 Gordon Henderson - * - * Header file for code using the MCP23x08 and 17 GPIO expander - * chips. - * This comes in 2 flavours: MCP230xx (08/17) which has an I2C - * interface, and the MXP23Sxx (08/17) which has an SPI interface. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -// MCP23x08 Registers - -#define MCP23x08_IODIR 0x00 -#define MCP23x08_IPOL 0x01 -#define MCP23x08_GPINTEN 0x02 -#define MCP23x08_DEFVAL 0x03 -#define MCP23x08_INTCON 0x04 -#define MCP23x08_IOCON 0x05 -#define MCP23x08_GPPU 0x06 -#define MCP23x08_INTF 0x07 -#define MCP23x08_INTCAP 0x08 -#define MCP23x08_GPIO 0x09 -#define MCP23x08_OLAT 0x0A - -// MCP23x17 Registers - -#define MCP23x17_IODIRA 0x00 -#define MCP23x17_IPOLA 0x02 -#define MCP23x17_GPINTENA 0x04 -#define MCP23x17_DEFVALA 0x06 -#define MCP23x17_INTCONA 0x08 -#define MCP23x17_IOCON 0x0A -#define MCP23x17_GPPUA 0x0C -#define MCP23x17_INTFA 0x0E -#define MCP23x17_INTCAPA 0x10 -#define MCP23x17_GPIOA 0x12 -#define MCP23x17_OLATA 0x14 - -#define MCP23x17_IODIRB 0x01 -#define MCP23x17_IPOLB 0x03 -#define MCP23x17_GPINTENB 0x05 -#define MCP23x17_DEFVALB 0x07 -#define MCP23x17_INTCONB 0x09 -#define MCP23x17_IOCONB 0x0B -#define MCP23x17_GPPUB 0x0D -#define MCP23x17_INTFB 0x0F -#define MCP23x17_INTCAPB 0x11 -#define MCP23x17_GPIOB 0x13 -#define MCP23x17_OLATB 0x15 - -// Bits in the IOCON register - -#define IOCON_UNUSED 0x01 -#define IOCON_INTPOL 0x02 -#define IOCON_ODR 0x04 -#define IOCON_HAEN 0x08 -#define IOCON_DISSLW 0x10 -#define IOCON_SEQOP 0x20 -#define IOCON_MIRROR 0x40 -#define IOCON_BANK_MODE 0x80 - -// Default initialisation mode - -#define IOCON_INIT (IOCON_SEQOP) - -// SPI Command codes - -#define CMD_WRITE 0x40 -#define CMD_READ 0x41 diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3002.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3002.c deleted file mode 100644 index 9ebf3e413..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3002.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * mcp3002.c: - * Extend wiringPi with the MCP3002 SPI Analog to Digital convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "mcp3002.h" - -/* - * myAnalogRead: - * Return the analog value of the given pin - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - unsigned char spiData [2] ; - unsigned char chanBits ; - int chan = pin - node->pinBase ; - - if (chan == 0) - chanBits = 0b11010000 ; - else - chanBits = 0b11110000 ; - - spiData [0] = chanBits ; - spiData [1] = 0 ; - - wiringPiSPIDataRW (node->fd, spiData, 2) ; - - return ((spiData [0] << 8) | (spiData [1] >> 1)) & 0x3FF ; -} - - -/* - * mcp3002Setup: - * Create a new wiringPi device node for an mcp3002 on the Pi's - * SPI interface. - ********************************************************************************* - */ - -int mcp3002Setup (const int pinBase, int spiChannel) -{ - struct wiringPiNodeStruct *node ; - - if (wiringPiSPISetup (spiChannel, 1000000) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 2) ; - - node->fd = spiChannel ; - node->analogRead = myAnalogRead ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3002.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3002.h deleted file mode 100644 index 0cd727f33..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3002.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * mcp3002.c: - * Extend wiringPi with the MCP3002 SPI Analog to Digital convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp3002Setup (int pinBase, int spiChannel) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3004.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3004.c deleted file mode 100644 index be8383e14..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3004.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * mcp3004.c: - * Extend wiringPi with the MCP3004 SPI Analog to Digital convertor - * Copyright (c) 2012-2013 Gordon Henderson - * - * Thanks also to "ShorTie" on IRC for some remote debugging help! - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "mcp3004.h" - -/* - * myAnalogRead: - * Return the analog value of the given pin - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - unsigned char spiData [3] ; - unsigned char chanBits ; - int chan = pin - node->pinBase ; - - chanBits = 0b10000000 | (chan << 4) ; - - spiData [0] = 1 ; // Start bit - spiData [1] = chanBits ; - spiData [2] = 0 ; - - wiringPiSPIDataRW (node->fd, spiData, 3) ; - - return ((spiData [1] << 8) | spiData [2]) & 0x3FF ; -} - - -/* - * mcp3004Setup: - * Create a new wiringPi device node for an mcp3004 on the Pi's - * SPI interface. - ********************************************************************************* - */ - -int mcp3004Setup (const int pinBase, int spiChannel) -{ - struct wiringPiNodeStruct *node ; - - if (wiringPiSPISetup (spiChannel, 1000000) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 8) ; - - node->fd = spiChannel ; - node->analogRead = myAnalogRead ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3004.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3004.h deleted file mode 100644 index a07c0bf01..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3004.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * mcp3004.c: - * Extend wiringPi with the MCP3004 SPI Analog to Digital convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp3004Setup (int pinBase, int spiChannel) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3422.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3422.c deleted file mode 100644 index be14db661..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3422.c +++ /dev/null @@ -1,125 +0,0 @@ -/* - * mcp3422.c: - * Extend wiringPi with the MCP3422/3/4 I2C ADC chip - * This code assumes single-ended mode only. - * Tested on actual hardware: 20th Feb 2016. - * Copyright (c) 2013-2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -#include -#include -#include -#include -#include - -#include -#include - -#include "mcp3422.h" - - -/* - * waitForConversion: - * Common code to wait for the ADC to finish conversion - ********************************************************************************* - */ - -void waitForConversion (int fd, unsigned char *buffer, int n) -{ - for (;;) - { - read (fd, buffer, n) ; - if ((buffer [n-1] & 0x80) == 0) - break ; - delay (1) ; - } -} - -/* - * myAnalogRead: - * Read a channel from the device - ********************************************************************************* - */ - -int myAnalogRead (struct wiringPiNodeStruct *node, int chan) -{ - unsigned char config ; - unsigned char buffer [4] ; - int value = 0 ; - int realChan = (chan & 3) - node->pinBase ; - -// One-shot mode, trigger plus the other configs. - - config = 0x80 | (realChan << 5) | (node->data0 << 2) | (node->data1) ; - - wiringPiI2CWrite (node->fd, config) ; - - switch (node->data0) // Sample rate - { - case MCP3422_SR_3_75: // 18 bits - waitForConversion (node->fd, &buffer [0], 4) ; - value = ((buffer [0] & 3) << 16) | (buffer [1] << 8) | buffer [2] ; - break ; - - case MCP3422_SR_15: // 16 bits - waitForConversion (node->fd, buffer, 3) ; - value = (buffer [0] << 8) | buffer [1] ; - break ; - - case MCP3422_SR_60: // 14 bits - waitForConversion (node->fd, buffer, 3) ; - value = ((buffer [0] & 0x3F) << 8) | buffer [1] ; - break ; - - case MCP3422_SR_240: // 12 bits - default - waitForConversion (node->fd, buffer, 3) ; - value = ((buffer [0] & 0x0F) << 8) | buffer [1] ; - break ; - } - - return value ; -} - - -/* - * mcp3422Setup: - * Create a new wiringPi device node for the mcp3422 - ********************************************************************************* - */ - -int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 4) ; - - node->fd = fd ; - node->data0 = sampleRate ; - node->data1 = gain ; - node->analogRead = myAnalogRead ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3422.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3422.h deleted file mode 100644 index 72647d457..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp3422.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * mcp3422.h: - * Extend wiringPi with the MCP3422/3/4 I2C ADC chip - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#define MCP3422_SR_240 0 -#define MCP3422_SR_60 1 -#define MCP3422_SR_15 2 -#define MCP3422_SR_3_75 3 - -#define MCP3422_GAIN_1 0 -#define MCP3422_GAIN_2 1 -#define MCP3422_GAIN_4 2 -#define MCP3422_GAIN_8 3 - - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp3422Setup (int pinBase, int i2cAddress, int sampleRate, int gain) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp4802.c b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp4802.c deleted file mode 100644 index ef104ed40..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp4802.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * mcp4802.c: - * Extend wiringPi with the MCP4802 SPI Digital to Analog convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "mcp4802.h" - -/* - * myAnalogWrite: - * Write analog value on the given pin - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - unsigned char spiData [2] ; - unsigned char chanBits, dataBits ; - int chan = pin - node->pinBase ; - - if (chan == 0) - chanBits = 0x30 ; - else - chanBits = 0xB0 ; - - chanBits |= ((value >> 4) & 0x0F) ; - dataBits = ((value << 4) & 0xF0) ; - - spiData [0] = chanBits ; - spiData [1] = dataBits ; - - wiringPiSPIDataRW (node->fd, spiData, 2) ; -} - -/* - * mcp4802Setup: - * Create a new wiringPi device node for an mcp4802 on the Pi's - * SPI interface. - ********************************************************************************* - */ - -int mcp4802Setup (const int pinBase, int spiChannel) -{ - struct wiringPiNodeStruct *node ; - - if (wiringPiSPISetup (spiChannel, 1000000) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 2) ; - - node->fd = spiChannel ; - node->analogWrite = myAnalogWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp4802.h b/other/wiringpi/wiringPi-96344ff/wiringPi/mcp4802.h deleted file mode 100644 index effa02461..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/mcp4802.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * mcp4802.c: - * Extend wiringPi with the MCP4802 SPI Digital to Analog convertor - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int mcp4802Setup (int pinBase, int spiChannel) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8574.c b/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8574.c deleted file mode 100644 index e0b686a8e..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8574.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * pcf8574.c: - * Extend wiringPi with the PCF8574 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" - -#include "pcf8574.h" - - -/* - * myPinMode: - * The PCF8574 is an odd chip - the pins are effectively bi-directional, - * however the pins should be drven high when used as an input pin... - * So, we're effectively copying digitalWrite... - ********************************************************************************* - */ - -static void myPinMode (struct wiringPiNodeStruct *node, int pin, int mode) -{ - int bit, old ; - - bit = 1 << ((pin - node->pinBase) & 7) ; - - old = node->data2 ; - if (mode == OUTPUT) - old &= (~bit) ; // Write bit to 0 - else - old |= bit ; // Write bit to 1 - - wiringPiI2CWrite (node->fd, old) ; - node->data2 = old ; -} - - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int bit, old ; - - bit = 1 << ((pin - node->pinBase) & 7) ; - - old = node->data2 ; - if (value == LOW) - old &= (~bit) ; - else - old |= bit ; - - wiringPiI2CWrite (node->fd, old) ; - node->data2 = old ; -} - - -/* - * myDigitalRead: - ********************************************************************************* - */ - -static int myDigitalRead (struct wiringPiNodeStruct *node, int pin) -{ - int mask, value ; - - mask = 1 << ((pin - node->pinBase) & 7) ; - value = wiringPiI2CRead (node->fd) ; - - if ((value & mask) == 0) - return LOW ; - else - return HIGH ; -} - - -/* - * pcf8574Setup: - * Create a new instance of a PCF8574 I2C GPIO interface. We know it - * has 8 pins, so all we need to know here is the I2C address and the - * user-defined pin base. - ********************************************************************************* - */ - -int pcf8574Setup (const int pinBase, const int i2cAddress) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 8) ; - - node->fd = fd ; - node->pinMode = myPinMode ; - node->digitalRead = myDigitalRead ; - node->digitalWrite = myDigitalWrite ; - node->data2 = wiringPiI2CRead (fd) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8574.h b/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8574.h deleted file mode 100644 index 8e2d8181d..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8574.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * pcf8574.h: - * Extend wiringPi with the PCF8574 I2C GPIO expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int pcf8574Setup (const int pinBase, const int i2cAddress) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8591.c b/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8591.c deleted file mode 100644 index 66c6255b2..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8591.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * pcf8591.c: - * Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip - * The chip has 1 8-bit DAC and 4 x 8-bit ADCs - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" - -#include "pcf8591.h" - - -/* - * myAnalogWrite: - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, UNU int pin, int value) -{ - unsigned char b [2] ; - b [0] = 0x40 ; - b [1] = value & 0xFF ; - write (node->fd, b, 2) ; -} - - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int x ; - - wiringPiI2CWrite (node->fd, 0x40 | ((pin - node->pinBase) & 3)) ; - - x = wiringPiI2CRead (node->fd) ; // Throw away the first read - x = wiringPiI2CRead (node->fd) ; - - return x ; -} - - -/* - * pcf8591Setup: - * Create a new instance of a PCF8591 I2C GPIO interface. We know it - * has 4 pins, (4 analog inputs and 1 analog output which we'll shadow - * input 0) so all we need to know here is the I2C address and the - * user-defined pin base. - ********************************************************************************* - */ - -int pcf8591Setup (const int pinBase, const int i2cAddress) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (i2cAddress)) < 0) - return FALSE ; - - node = wiringPiNewNode (pinBase, 4) ; - - node->fd = fd ; - node->analogRead = myAnalogRead ; - node->analogWrite = myAnalogWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8591.h b/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8591.h deleted file mode 100644 index 6b44ccf90..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/pcf8591.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * pcf8591.h: - * Extend wiringPi with the PCF8591 I2C GPIO Analog expander chip - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int pcf8591Setup (const int pinBase, const int i2cAddress) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/piHiPri.c b/other/wiringpi/wiringPi-96344ff/wiringPi/piHiPri.c deleted file mode 100644 index d2f3b4e9c..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/piHiPri.c +++ /dev/null @@ -1,51 +0,0 @@ -/* - * piHiPri: - * Simple way to get your program running at high priority - * with realtime schedulling. - * - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" - - -/* - * piHiPri: - * Attempt to set a high priority schedulling for the running program - ********************************************************************************* - */ - -int piHiPri (const int pri) -{ - struct sched_param sched ; - - memset (&sched, 0, sizeof(sched)) ; - - if (pri > sched_get_priority_max (SCHED_RR)) - sched.sched_priority = sched_get_priority_max (SCHED_RR) ; - else - sched.sched_priority = pri ; - - return sched_setscheduler (0, SCHED_RR, &sched) ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/piThread.c b/other/wiringpi/wiringPi-96344ff/wiringPi/piThread.c deleted file mode 100644 index b0499be49..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/piThread.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * piThread.c: - * Provide a simplified interface to pthreads - * - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include "wiringPi.h" - -static pthread_mutex_t piMutexes [4] ; - - - -/* - * piThreadCreate: - * Create and start a thread - ********************************************************************************* - */ - -int piThreadCreate (void *(*fn)(void *)) -{ - pthread_t myThread ; - - return pthread_create (&myThread, NULL, fn, NULL) ; -} - -/* - * piLock: piUnlock: - * Activate/Deactivate a mutex. - * We're keeping things simple here and only tracking 4 mutexes which - * is more than enough for out entry-level pthread programming - ********************************************************************************* - */ - -void piLock (int key) -{ - pthread_mutex_lock (&piMutexes [key]) ; -} - -void piUnlock (int key) -{ - pthread_mutex_unlock (&piMutexes [key]) ; -} - diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/pseudoPins.c b/other/wiringpi/wiringPi-96344ff/wiringPi/pseudoPins.c deleted file mode 100644 index c2bf5e046..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/pseudoPins.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * pseudoPins.c: - * Extend wiringPi with a number of pseudo pins which can be - * digitally or analog written/read. - * - * Note: - * Just one set of pseudo pins can exist per Raspberry Pi. - * These pins are shared between all programs running on - * that Raspberry Pi. The values are also persistant as - * they live in shared RAM. This gives you a means for - * temporary variable storing/sharing between programs, - * or for other cunning things I've not thought of yet.. - * - * Copyright (c) 2012-2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#define SHARED_NAME "wiringPiPseudoPins" -#define PSEUDO_PINS 64 - -#include -#include -#include -#include -#include - -#include - -#include "pseudoPins.h" - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int *ptr = (int *)node->data0 ; - int myPin = pin - node->pinBase ; - - return *(ptr + myPin) ; -} - - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int *ptr = (int *)node->data0 ; - int myPin = pin - node->pinBase ; - - *(ptr + myPin) = value ; -} - - -/* - * pseudoPinsSetup: - * Create a new wiringPi device node for the pseudoPins driver - ********************************************************************************* - */ - -int pseudoPinsSetup (const int pinBase) -{ - struct wiringPiNodeStruct *node ; - void *ptr ; - - node = wiringPiNewNode (pinBase, PSEUDO_PINS) ; - - node->fd = shm_open (SHARED_NAME, O_CREAT | O_RDWR, 0666) ; - - if (node->fd < 0) - return FALSE ; - - if (ftruncate (node->fd, PSEUDO_PINS * sizeof (int)) < 0) - return FALSE ; - - ptr = mmap (NULL, PSEUDO_PINS * sizeof (int), PROT_READ | PROT_WRITE, MAP_SHARED, node->fd, 0) ; - - node->data0 = (unsigned int)ptr ; - - node->analogRead = myAnalogRead ; - node->analogWrite = myAnalogWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/pseudoPins.h b/other/wiringpi/wiringPi-96344ff/wiringPi/pseudoPins.h deleted file mode 100644 index bef4660b6..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/pseudoPins.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * pseudoPins.h: - * Extend wiringPi with a number of pseudo pins which can be - * digitally or analog written/read. - * Copyright (c) 2012-2016 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -extern int pseudoPinsSetup (const int pinBase) ; diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/rht03.c b/other/wiringpi/wiringPi-96344ff/wiringPi/rht03.c deleted file mode 100644 index 1129cfdae..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/rht03.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * rht03.c: - * Extend wiringPi with the rht03 Maxdetect 1-Wire sensor. - * Copyright (c) 2016-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include - -#include "wiringPi.h" -#include "rht03.h" - -/* - * maxDetectLowHighWait: - * Wait for a transition from low to high on the bus - ********************************************************************************* - */ - -static int maxDetectLowHighWait (const int pin) -{ - struct timeval now, timeOut, timeUp ; - -// If already high then wait for pin to go low - - gettimeofday (&now, NULL) ; - timerclear (&timeOut) ; - timeOut.tv_usec = 1000 ; - timeradd (&now, &timeOut, &timeUp) ; - - while (digitalRead (pin) == HIGH) - { - gettimeofday (&now, NULL) ; - if (timercmp (&now, &timeUp, >)) - return FALSE ; - } - -// Wait for it to go HIGH - - gettimeofday (&now, NULL) ; - timerclear (&timeOut) ; - timeOut.tv_usec = 1000 ; - timeradd (&now, &timeOut, &timeUp) ; - - while (digitalRead (pin) == LOW) - { - gettimeofday (&now, NULL) ; - if (timercmp (&now, &timeUp, >)) - return FALSE ; - } - - return TRUE ; -} - - -/* - * maxDetectClockByte: - * Read in a single byte from the MaxDetect bus - ********************************************************************************* - */ - -static unsigned int maxDetectClockByte (const int pin) -{ - unsigned int byte = 0 ; - int bit ; - - for (bit = 0 ; bit < 8 ; ++bit) - { - if (!maxDetectLowHighWait (pin)) - return 0 ; - -// bit starting now - we need to time it. - - delayMicroseconds (30) ; - byte <<= 1 ; - if (digitalRead (pin) == HIGH) // It's a 1 - byte |= 1 ; - } - - return byte ; -} - - -/* - * maxDetectRead: - * Read in and return the 4 data bytes from the MaxDetect sensor. - * Return TRUE/FALSE depending on the checksum validity - ********************************************************************************* - */ - -static int maxDetectRead (const int pin, unsigned char buffer [4]) -{ - int i ; - unsigned int checksum ; - unsigned char localBuf [5] ; - struct timeval now, then, took ; - -// See how long we took - - gettimeofday (&then, NULL) ; - -// Wake up the RHT03 by pulling the data line low, then high -// Low for 10mS, high for 40uS. - - pinMode (pin, OUTPUT) ; - digitalWrite (pin, 0) ; delay (10) ; - digitalWrite (pin, 1) ; delayMicroseconds (40) ; - pinMode (pin, INPUT) ; - -// Now wait for sensor to pull pin low - - if (!maxDetectLowHighWait (pin)) - return FALSE ; - -// and read in 5 bytes (40 bits) - - for (i = 0 ; i < 5 ; ++i) - localBuf [i] = maxDetectClockByte (pin) ; - - checksum = 0 ; - for (i = 0 ; i < 4 ; ++i) - { - buffer [i] = localBuf [i] ; - checksum += localBuf [i] ; - } - checksum &= 0xFF ; - -// See how long we took - - gettimeofday (&now, NULL) ; - timersub (&now, &then, &took) ; - -// Total time to do this should be: -// 10mS + 40µS - reset -// + 80µS + 80µS - sensor doing its low -> high thing -// + 40 * (50µS + 27µS (0) or 70µS (1) ) -// = 15010µS -// so if we take more than that, we've had a scheduling interruption and the -// reading is probably bogus. - - if ((took.tv_sec != 0) || (took.tv_usec > 16000)) - return FALSE ; - - return checksum == localBuf [4] ; -} - - -/* - * myReadRHT03: - * Read the Temperature & Humidity from an RHT03 sensor - * Values returned are *10, so 123 is 12.3. - ********************************************************************************* - */ - -static int myReadRHT03 (const int pin, int *temp, int *rh) -{ - int result ; - unsigned char buffer [4] ; - -// Read ... - - result = maxDetectRead (pin, buffer) ; - - if (!result) - return FALSE ; - - *rh = (buffer [0] * 256 + buffer [1]) ; - *temp = (buffer [2] * 256 + buffer [3]) ; - - if ((*temp & 0x8000) != 0) // Negative - { - *temp &= 0x7FFF ; - *temp = -*temp ; - } - -// Discard obviously bogus readings - the checksum can't detect a 2-bit error -// (which does seem to happen - no realtime here) - - if ((*rh > 999) || (*temp > 800) || (*temp < -400)) - return FALSE ; - - return TRUE ; -} - - -/* - * myAnalogRead: - ********************************************************************************* - */ - -static int myAnalogRead (struct wiringPiNodeStruct *node, int pin) -{ - int piPin = node->fd ; - int chan = pin - node->pinBase ; - int temp = -9997 ; - int rh = -9997 ; - int try ; - - if (chan > 1) - return -9999 ; // Bad parameters - - for (try = 0 ; try < 10 ; ++try) - { - if (myReadRHT03 (piPin, &temp, &rh)) - return chan == 0 ? temp : rh ; - } - - return -9998 ; -} - - -/* - * rht03Setup: - * Create a new instance of an RHT03 temperature sensor. - ********************************************************************************* - */ - -int rht03Setup (const int pinBase, const int piPin) -{ - struct wiringPiNodeStruct *node ; - - if ((piPin & PI_GPIO_MASK) != 0) // Must be an on-board pin - return FALSE ; - -// 2 pins - temperature and humidity - - node = wiringPiNewNode (pinBase, 2) ; - - node->fd = piPin ; - node->analogRead = myAnalogRead ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/rht03.h b/other/wiringpi/wiringPi-96344ff/wiringPi/rht03.h deleted file mode 100644 index 9523fbf1b..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/rht03.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * rht03.h: - * Extend wiringPi with the rht03 Maxdetect 1-Wire sensor. - * Copyright (c) 2016-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -extern int rht03Setup (const int pinBase, const int devicePin) ; diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/sn3218.c b/other/wiringpi/wiringPi-96344ff/wiringPi/sn3218.c deleted file mode 100644 index d9b91132b..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/sn3218.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * sn3218.c: - * Extend wiringPi with the SN3218 I2C LEd Driver - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "sn3218.h" - -/* - * myAnalogWrite: - * Write analog value on the given pin - ********************************************************************************* - */ - -static void myAnalogWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - int fd = node->fd ; - int chan = 0x01 + (pin - node->pinBase) ; - - wiringPiI2CWriteReg8 (fd, chan, value & 0xFF) ; // Value - wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update -} - -/* - * sn3218Setup: - * Create a new wiringPi device node for an sn3218 on the Pi's - * SPI interface. - ********************************************************************************* - */ - -int sn3218Setup (const int pinBase) -{ - int fd ; - struct wiringPiNodeStruct *node ; - - if ((fd = wiringPiI2CSetup (0x54)) < 0) - return FALSE ; - -// Setup the chip - initialise all 18 LEDs to off - -//wiringPiI2CWriteReg8 (fd, 0x17, 0) ; // Reset - wiringPiI2CWriteReg8 (fd, 0x00, 1) ; // Not Shutdown - wiringPiI2CWriteReg8 (fd, 0x13, 0x3F) ; // Enable LEDs 0- 5 - wiringPiI2CWriteReg8 (fd, 0x14, 0x3F) ; // Enable LEDs 6-11 - wiringPiI2CWriteReg8 (fd, 0x15, 0x3F) ; // Enable LEDs 12-17 - wiringPiI2CWriteReg8 (fd, 0x16, 0x00) ; // Update - - node = wiringPiNewNode (pinBase, 18) ; - - node->fd = fd ; - node->analogWrite = myAnalogWrite ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/sn3218.h b/other/wiringpi/wiringPi-96344ff/wiringPi/sn3218.h deleted file mode 100644 index 580d5f96b..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/sn3218.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * sn3218.c: - * Extend wiringPi with the SN3218 I2C LED driver board. - * Copyright (c) 2012-2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int sn3218Setup (int pinBase) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/softPwm.c b/other/wiringpi/wiringPi-96344ff/wiringPi/softPwm.c deleted file mode 100644 index d99fa0092..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/softPwm.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * softPwm.c: - * Provide many channels of software driven PWM. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include -#include - -#include "wiringPi.h" -#include "softPwm.h" - -// MAX_PINS: -// This is more than the number of Pi pins because we can actually softPwm. -// Once upon a time I let pins on gpio expanders be softPwm'd, but it's really -// really not a good thing. - -#define MAX_PINS 64 - -// The PWM Frequency is derived from the "pulse time" below. Essentially, -// the frequency is a function of the range and this pulse time. -// The total period will be range * pulse time in µS, so a pulse time -// of 100 and a range of 100 gives a period of 100 * 100 = 10,000 µS -// which is a frequency of 100Hz. -// -// It's possible to get a higher frequency by lowering the pulse time, -// however CPU uage will skyrocket as wiringPi uses a hard-loop to time -// periods under 100µS - this is because the Linux timer calls are just -// not accurate at all, and have an overhead. -// -// Another way to increase the frequency is to reduce the range - however -// that reduces the overall output accuracy... - -#define PULSE_TIME 100 - -static volatile int marks [MAX_PINS] ; -static volatile int range [MAX_PINS] ; -static volatile pthread_t threads [MAX_PINS] ; -static volatile int newPin = -1 ; - - -/* - * softPwmThread: - * Thread to do the actual PWM output - ********************************************************************************* - */ - -static void *softPwmThread (void *arg) -{ - int pin, mark, space ; - struct sched_param param ; - - param.sched_priority = sched_get_priority_max (SCHED_RR) ; - pthread_setschedparam (pthread_self (), SCHED_RR, ¶m) ; - - pin = *((int *)arg) ; - free (arg) ; - - pin = newPin ; - newPin = -1 ; - - piHiPri (90) ; - - for (;;) - { - mark = marks [pin] ; - space = range [pin] - mark ; - - if (mark != 0) - digitalWrite (pin, HIGH) ; - delayMicroseconds (mark * 100) ; - - if (space != 0) - digitalWrite (pin, LOW) ; - delayMicroseconds (space * 100) ; - } - - return NULL ; -} - - -/* - * softPwmWrite: - * Write a PWM value to the given pin - ********************************************************************************* - */ - -void softPwmWrite (int pin, int value) -{ - if (pin < MAX_PINS) - { - /**/ if (value < 0) - value = 0 ; - else if (value > range [pin]) - value = range [pin] ; - - marks [pin] = value ; - } -} - - -/* - * softPwmCreate: - * Create a new softPWM thread. - ********************************************************************************* - */ - -int softPwmCreate (int pin, int initialValue, int pwmRange) -{ - int res ; - pthread_t myThread ; - int *passPin ; - - if (pin >= MAX_PINS) - return -1 ; - - if (range [pin] != 0) // Already running on this pin - return -1 ; - - if (pwmRange <= 0) - return -1 ; - - passPin = malloc (sizeof (*passPin)) ; - if (passPin == NULL) - return -1 ; - - digitalWrite (pin, LOW) ; - pinMode (pin, OUTPUT) ; - - marks [pin] = initialValue ; - range [pin] = pwmRange ; - - *passPin = pin ; - newPin = pin ; - res = pthread_create (&myThread, NULL, softPwmThread, (void *)passPin) ; - - while (newPin != -1) - delay (1) ; - - threads [pin] = myThread ; - - return res ; -} - - -/* - * softPwmStop: - * Stop an existing softPWM thread - ********************************************************************************* - */ - -void softPwmStop (int pin) -{ - if (pin < MAX_PINS) - { - if (range [pin] != 0) - { - pthread_cancel (threads [pin]) ; - pthread_join (threads [pin], NULL) ; - range [pin] = 0 ; - digitalWrite (pin, LOW) ; - } - } -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/softPwm.h b/other/wiringpi/wiringPi-96344ff/wiringPi/softPwm.h deleted file mode 100644 index 0351da5d1..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/softPwm.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * softPwm.h: - * Provide 2 channels of software driven PWM. - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int softPwmCreate (int pin, int value, int range) ; -extern void softPwmWrite (int pin, int value) ; -extern void softPwmStop (int pin) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/softServo.c b/other/wiringpi/wiringPi-96344ff/wiringPi/softServo.c deleted file mode 100644 index 9de9f4faf..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/softServo.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * softServo.c: - * Provide N channels of software driven PWM suitable for RC - * servo motors. - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -//#include -#include -#include -#include -#include - -#include "wiringPi.h" -#include "softServo.h" - -// RC Servo motors are a bit of an oddity - designed in the days when -// radio control was experimental and people were tryin to make -// things as simple as possible as it was all very expensive... -// -// So... To drive an RC Servo motor, you need to send it a modified PWM -// signal - it needs anything from 1ms to 2ms - with 1ms meaning -// to move the server fully left, and 2ms meaning to move it fully -// right. Then you need a long gap before sending the next pulse. -// The reason for this is that you send a multiplexed stream of these -// pulses up the radio signal into the reciever which de-multiplexes -// them into the signals for each individual servo. Typically there -// might be 8 channels, so you need at least 8 "slots" of 2mS pulses -// meaning the entire frame must fit into a 16mS slot - which would -// then be repeated... -// -// In practice we have a total slot width of about 20mS - so we're sending 50 -// updates per second to each servo. -// -// In this code, we don't need to be too fussy about the gap as we're not doing -// the multipexing, but it does need to be at least 10mS, and preferably 16 -// from what I've been able to determine. - -// WARNING: -// This code is really experimental. It was written in response to some people -// asking for a servo driver, however while it works, there is too much -// jitter to successfully drive a small servo - I have tried it with a micro -// servo and it worked, but the servo ran hot due to the jitter in the signal -// being sent to it. -// -// If you want servo control for the Pi, then use the servoblaster kernel -// module. - -#define MAX_SERVOS 8 - -static int pinMap [MAX_SERVOS] ; // Keep track of our pins -static int pulseWidth [MAX_SERVOS] ; // microseconds - - -/* - * softServoThread: - * Thread to do the actual Servo PWM output - ********************************************************************************* - */ - -static PI_THREAD (softServoThread) -{ - register int i, j, k, m, tmp ; - int lastDelay, pin, servo ; - - int myDelays [MAX_SERVOS] ; - int myPins [MAX_SERVOS] ; - - struct timeval tNow, tStart, tPeriod, tGap, tTotal ; - struct timespec tNs ; - - tTotal.tv_sec = 0 ; - tTotal.tv_usec = 8000 ; - - piHiPri (50) ; - - for (;;) - { - gettimeofday (&tStart, NULL) ; - - memcpy (myDelays, pulseWidth, sizeof (myDelays)) ; - memcpy (myPins, pinMap, sizeof (myPins)) ; - -// Sort the delays (& pins), shortest first - - for (m = MAX_SERVOS / 2 ; m > 0 ; m /= 2 ) - for (j = m ; j < MAX_SERVOS ; ++j) - for (i = j - m ; i >= 0 ; i -= m) - { - k = i + m ; - if (myDelays [k] >= myDelays [i]) - break ; - else // Swap - { - tmp = myDelays [i] ; myDelays [i] = myDelays [k] ; myDelays [k] = tmp ; - tmp = myPins [i] ; myPins [i] = myPins [k] ; myPins [k] = tmp ; - } - } - -// All on - - lastDelay = 0 ; - for (servo = 0 ; servo < MAX_SERVOS ; ++servo) - { - if ((pin = myPins [servo]) == -1) - continue ; - - digitalWrite (pin, HIGH) ; - myDelays [servo] = myDelays [servo] - lastDelay ; - lastDelay += myDelays [servo] ; - } - -// Now loop, turning them all off as required - - for (servo = 0 ; servo < MAX_SERVOS ; ++servo) - { - if ((pin = myPins [servo]) == -1) - continue ; - - delayMicroseconds (myDelays [servo]) ; - digitalWrite (pin, LOW) ; - } - -// Wait until the end of an 8mS time-slot - - gettimeofday (&tNow, NULL) ; - timersub (&tNow, &tStart, &tPeriod) ; - timersub (&tTotal, &tPeriod, &tGap) ; - tNs.tv_sec = tGap.tv_sec ; - tNs.tv_nsec = tGap.tv_usec * 1000 ; - nanosleep (&tNs, NULL) ; - } - - return NULL ; -} - - -/* - * softServoWrite: - * Write a Servo value to the given pin - ********************************************************************************* - */ - -void softServoWrite (int servoPin, int value) -{ - int servo ; - - servoPin &= 63 ; - - /**/ if (value < -250) - value = -250 ; - else if (value > 1250) - value = 1250 ; - - for (servo = 0 ; servo < MAX_SERVOS ; ++servo) - if (pinMap [servo] == servoPin) - pulseWidth [servo] = value + 1000 ; // uS -} - - -/* - * softServoSetup: - * Setup the software servo system - ********************************************************************************* - */ - -int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) -{ - int servo ; - - if (p0 != -1) { pinMode (p0, OUTPUT) ; digitalWrite (p0, LOW) ; } - if (p1 != -1) { pinMode (p1, OUTPUT) ; digitalWrite (p1, LOW) ; } - if (p2 != -1) { pinMode (p2, OUTPUT) ; digitalWrite (p2, LOW) ; } - if (p3 != -1) { pinMode (p3, OUTPUT) ; digitalWrite (p3, LOW) ; } - if (p4 != -1) { pinMode (p4, OUTPUT) ; digitalWrite (p4, LOW) ; } - if (p5 != -1) { pinMode (p5, OUTPUT) ; digitalWrite (p5, LOW) ; } - if (p6 != -1) { pinMode (p6, OUTPUT) ; digitalWrite (p6, LOW) ; } - if (p7 != -1) { pinMode (p7, OUTPUT) ; digitalWrite (p7, LOW) ; } - - pinMap [0] = p0 ; - pinMap [1] = p1 ; - pinMap [2] = p2 ; - pinMap [3] = p3 ; - pinMap [4] = p4 ; - pinMap [5] = p5 ; - pinMap [6] = p6 ; - pinMap [7] = p7 ; - - for (servo = 0 ; servo < MAX_SERVOS ; ++servo) - pulseWidth [servo] = 1500 ; // Mid point - - return piThreadCreate (softServoThread) ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/softServo.h b/other/wiringpi/wiringPi-96344ff/wiringPi/softServo.h deleted file mode 100644 index 794cf552c..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/softServo.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * softServo.h: - * Provide N channels of software driven PWM suitable for RC - * servo motors. - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern void softServoWrite (int pin, int value) ; -extern int softServoSetup (int p0, int p1, int p2, int p3, int p4, int p5, int p6, int p7) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/softTone.c b/other/wiringpi/wiringPi-96344ff/wiringPi/softTone.c deleted file mode 100644 index e2fb73711..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/softTone.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * softTone.c: - * For that authentic retro sound... - * Er... A little experiment to produce tones out of a Pi using - * one (or 2) GPIO pins and a piezeo "speaker" element. - * (Or a high impedance speaker, but don'y blame me if you blow-up - * the GPIO pins!) - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" -#include "softTone.h" - -#define MAX_PINS 64 - -#define PULSE_TIME 100 - -static int freqs [MAX_PINS] ; -static pthread_t threads [MAX_PINS] ; - -static int newPin = -1 ; - - -/* - * softToneThread: - * Thread to do the actual PWM output - ********************************************************************************* - */ - -static PI_THREAD (softToneThread) -{ - int pin, freq, halfPeriod ; - struct sched_param param ; - - param.sched_priority = sched_get_priority_max (SCHED_RR) ; - pthread_setschedparam (pthread_self (), SCHED_RR, ¶m) ; - - pin = newPin ; - newPin = -1 ; - - piHiPri (50) ; - - for (;;) - { - freq = freqs [pin] ; - if (freq == 0) - delay (1) ; - else - { - halfPeriod = 500000 / freq ; - - digitalWrite (pin, HIGH) ; - delayMicroseconds (halfPeriod) ; - - digitalWrite (pin, LOW) ; - delayMicroseconds (halfPeriod) ; - } - } - - return NULL ; -} - - -/* - * softToneWrite: - * Write a frequency value to the given pin - ********************************************************************************* - */ - -void softToneWrite (int pin, int freq) -{ - pin &= 63 ; - - /**/ if (freq < 0) - freq = 0 ; - else if (freq > 5000) // Max 5KHz - freq = 5000 ; - - freqs [pin] = freq ; -} - - -/* - * softToneCreate: - * Create a new tone thread. - ********************************************************************************* - */ - -int softToneCreate (int pin) -{ - int res ; - pthread_t myThread ; - - pinMode (pin, OUTPUT) ; - digitalWrite (pin, LOW) ; - - if (threads [pin] != 0) - return -1 ; - - freqs [pin] = 0 ; - - newPin = pin ; - res = pthread_create (&myThread, NULL, softToneThread, NULL) ; - - while (newPin != -1) - delay (1) ; - - threads [pin] = myThread ; - - return res ; -} - - -/* - * softToneStop: - * Stop an existing softTone thread - ********************************************************************************* - */ - -void softToneStop (int pin) -{ - if (threads [pin] != 0) - { - pthread_cancel (threads [pin]) ; - pthread_join (threads [pin], NULL) ; - threads [pin] = 0 ; - digitalWrite (pin, LOW) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/softTone.h b/other/wiringpi/wiringPi-96344ff/wiringPi/softTone.h deleted file mode 100644 index a93c5af33..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/softTone.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * softTone.c: - * For that authentic retro sound... - * Er... A little experiment to produce tones out of a Pi using - * one (or 2) GPIO pins and a piezeo "speaker" element. - * (Or a high impedance speaker, but don'y blame me if you blow-up - * the GPIO pins!) - * Copyright (c) 2012 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int softToneCreate (int pin) ; -extern void softToneStop (int pin) ; -extern void softToneWrite (int pin, int freq) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/sr595.c b/other/wiringpi/wiringPi-96344ff/wiringPi/sr595.c deleted file mode 100644 index 828061849..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/sr595.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * sr595.c: - * Extend wiringPi with the 74x595 shift register as a GPIO - * expander chip. - * Note that the code can cope with a number of 595's - * daisy-chained together - up to 4 for now as we're storing - * the output "register" in a single unsigned int. - * - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#include -#include - -#include "wiringPi.h" - -#include "sr595.h" - - -/* - * myDigitalWrite: - ********************************************************************************* - */ - -static void myDigitalWrite (struct wiringPiNodeStruct *node, int pin, int value) -{ - unsigned int mask ; - int dataPin, clockPin, latchPin ; - int bit, bits, output ; - - pin -= node->pinBase ; // Normalise pin number - bits = node->pinMax - node->pinBase + 1 ; // ie. number of clock pulses - dataPin = node->data0 ; - clockPin = node->data1 ; - latchPin = node->data2 ; - output = node->data3 ; - - mask = 1 << pin ; - - if (value == LOW) - output &= (~mask) ; - else - output |= mask ; - - node->data3 = output ; - -// A low -> high latch transition copies the latch to the output pins - - digitalWrite (latchPin, LOW) ; delayMicroseconds (1) ; - for (bit = bits - 1 ; bit >= 0 ; --bit) - { - digitalWrite (dataPin, output & (1 << bit)) ; - - digitalWrite (clockPin, HIGH) ; delayMicroseconds (1) ; - digitalWrite (clockPin, LOW) ; delayMicroseconds (1) ; - } - digitalWrite (latchPin, HIGH) ; delayMicroseconds (1) ; -} - - -/* - * sr595Setup: - * Create a new instance of a 74x595 shift register GPIO expander. - ********************************************************************************* - */ - -int sr595Setup (const int pinBase, const int numPins, - const int dataPin, const int clockPin, const int latchPin) -{ - struct wiringPiNodeStruct *node ; - - node = wiringPiNewNode (pinBase, numPins) ; - - node->data0 = dataPin ; - node->data1 = clockPin ; - node->data2 = latchPin ; - node->data3 = 0 ; // Output register - node->digitalWrite = myDigitalWrite ; - -// Initialise the underlying hardware - - digitalWrite (dataPin, LOW) ; - digitalWrite (clockPin, LOW) ; - digitalWrite (latchPin, HIGH) ; - - pinMode (dataPin, OUTPUT) ; - pinMode (clockPin, OUTPUT) ; - pinMode (latchPin, OUTPUT) ; - - return TRUE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/sr595.h b/other/wiringpi/wiringPi-96344ff/wiringPi/sr595.h deleted file mode 100644 index 4a26dc7c6..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/sr595.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * sr595.h: - * Extend wiringPi with the 74x595 shift registers. - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int sr595Setup (const int pinBase, const int numPins, - const int dataPin, const int clockPin, const int latchPin) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPi.c b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPi.c deleted file mode 100644 index bd1a369cb..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPi.c +++ /dev/null @@ -1,2373 +0,0 @@ -/* - * wiringPi: - * Arduino look-a-like Wiring library for the Raspberry Pi - * Copyright (c) 2012-2017 Gordon Henderson - * Additional code for pwmSetClock by Chris Hall - * - * Thanks to code samples from Gert Jan van Loo and the - * BCM2835 ARM Peripherals manual, however it's missing - * the clock section /grr/mutter/ - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -// Revisions: -// 19 Jul 2012: -// Moved to the LGPL -// Added an abstraction layer to the main routines to save a tiny -// bit of run-time and make the clode a little cleaner (if a little -// larger) -// Added waitForInterrupt code -// Added piHiPri code -// -// 9 Jul 2012: -// Added in support to use the /sys/class/gpio interface. -// 2 Jul 2012: -// Fixed a few more bugs to do with range-checking when in GPIO mode. -// 11 Jun 2012: -// Fixed some typos. -// Added c++ support for the .h file -// Added a new function to allow for using my "pin" numbers, or native -// GPIO pin numbers. -// Removed my busy-loop delay and replaced it with a call to delayMicroseconds -// -// 02 May 2012: -// Added in the 2 UART pins -// Change maxPins to numPins to more accurately reflect purpose - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "softPwm.h" -#include "softTone.h" - -#include "wiringPi.h" -#include "../version.h" - -// Environment Variables - -#define ENV_DEBUG "WIRINGPI_DEBUG" -#define ENV_CODES "WIRINGPI_CODES" -#define ENV_GPIOMEM "WIRINGPI_GPIOMEM" - - -// Extend wiringPi with other pin-based devices and keep track of -// them in this structure - -struct wiringPiNodeStruct *wiringPiNodes = NULL ; - -// BCM Magic - -#define BCM_PASSWORD 0x5A000000 - - -// The BCM2835 has 54 GPIO pins. -// BCM2835 data sheet, Page 90 onwards. -// There are 6 control registers, each control the functions of a block -// of 10 pins. -// Each control register has 10 sets of 3 bits per GPIO pin - the ALT values -// -// 000 = GPIO Pin X is an input -// 001 = GPIO Pin X is an output -// 100 = GPIO Pin X takes alternate function 0 -// 101 = GPIO Pin X takes alternate function 1 -// 110 = GPIO Pin X takes alternate function 2 -// 111 = GPIO Pin X takes alternate function 3 -// 011 = GPIO Pin X takes alternate function 4 -// 010 = GPIO Pin X takes alternate function 5 -// -// So the 3 bits for port X are: -// X / 10 + ((X % 10) * 3) - -// Port function select bits - -#define FSEL_INPT 0b000 -#define FSEL_OUTP 0b001 -#define FSEL_ALT0 0b100 -#define FSEL_ALT1 0b101 -#define FSEL_ALT2 0b110 -#define FSEL_ALT3 0b111 -#define FSEL_ALT4 0b011 -#define FSEL_ALT5 0b010 - -// Access from ARM Running Linux -// Taken from Gert/Doms code. Some of this is not in the manual -// that I can find )-: -// -// Updates in September 2015 - all now static variables (and apologies for the caps) -// due to the Pi v2, v3, etc. and the new /dev/gpiomem interface - -static volatile unsigned int GPIO_PADS ; -static volatile unsigned int GPIO_CLOCK_BASE ; -static volatile unsigned int GPIO_BASE ; -static volatile unsigned int GPIO_TIMER ; -static volatile unsigned int GPIO_PWM ; - -#define PAGE_SIZE (4*1024) -#define BLOCK_SIZE (4*1024) - -// PWM -// Word offsets into the PWM control region - -#define PWM_CONTROL 0 -#define PWM_STATUS 1 -#define PWM0_RANGE 4 -#define PWM0_DATA 5 -#define PWM1_RANGE 8 -#define PWM1_DATA 9 - -// Clock regsiter offsets - -#define PWMCLK_CNTL 40 -#define PWMCLK_DIV 41 - -#define PWM0_MS_MODE 0x0080 // Run in MS mode -#define PWM0_USEFIFO 0x0020 // Data from FIFO -#define PWM0_REVPOLAR 0x0010 // Reverse polarity -#define PWM0_OFFSTATE 0x0008 // Ouput Off state -#define PWM0_REPEATFF 0x0004 // Repeat last value if FIFO empty -#define PWM0_SERIAL 0x0002 // Run in serial mode -#define PWM0_ENABLE 0x0001 // Channel Enable - -#define PWM1_MS_MODE 0x8000 // Run in MS mode -#define PWM1_USEFIFO 0x2000 // Data from FIFO -#define PWM1_REVPOLAR 0x1000 // Reverse polarity -#define PWM1_OFFSTATE 0x0800 // Ouput Off state -#define PWM1_REPEATFF 0x0400 // Repeat last value if FIFO empty -#define PWM1_SERIAL 0x0200 // Run in serial mode -#define PWM1_ENABLE 0x0100 // Channel Enable - -// Timer -// Word offsets - -#define TIMER_LOAD (0x400 >> 2) -#define TIMER_VALUE (0x404 >> 2) -#define TIMER_CONTROL (0x408 >> 2) -#define TIMER_IRQ_CLR (0x40C >> 2) -#define TIMER_IRQ_RAW (0x410 >> 2) -#define TIMER_IRQ_MASK (0x414 >> 2) -#define TIMER_RELOAD (0x418 >> 2) -#define TIMER_PRE_DIV (0x41C >> 2) -#define TIMER_COUNTER (0x420 >> 2) - -// Locals to hold pointers to the hardware - -static volatile uint32_t *gpio ; -static volatile uint32_t *pwm ; -static volatile uint32_t *clk ; -static volatile uint32_t *pads ; - -#ifdef USE_TIMER -static volatile uint32_t *timer ; -static volatile uint32_t *timerIrqRaw ; -#endif - -// Data for use with the boardId functions. -// The order of entries here to correspond with the PI_MODEL_X -// and PI_VERSION_X defines in wiringPi.h -// Only intended for the gpio command - use at your own risk! - -// piGpioBase: -// The base address of the GPIO memory mapped hardware IO - -#define GPIO_PERI_BASE_OLD 0x20000000 -#define GPIO_PERI_BASE_NEW 0x3F000000 - -static volatile unsigned int piGpioBase = 0 ; - -const char *piModelNames [16] = -{ - "Model A", // 0 - "Model B", // 1 - "Model A+", // 2 - "Model B+", // 3 - "Pi 2", // 4 - "Alpha", // 5 - "CM", // 6 - "Unknown07", // 07 - "Pi 3", // 08 - "Pi Zero", // 09 - "CM3", // 10 - "Unknown11", // 11 - "Pi Zero-W", // 12 - "Unknown13", // 13 - "Unknown14", // 14 - "Unknown15", // 15 -} ; - -const char *piRevisionNames [16] = -{ - "00", - "01", - "02", - "03", - "04", - "05", - "06", - "07", - "08", - "09", - "10", - "11", - "12", - "13", - "14", - "15", -} ; - -const char *piMakerNames [16] = -{ - "Sony", // 0 - "Egoman", // 1 - "Embest", // 2 - "Unknown", // 3 - "Embest", // 4 - "Unknown05", // 5 - "Unknown06", // 6 - "Unknown07", // 7 - "Unknown08", // 8 - "Unknown09", // 9 - "Unknown10", // 10 - "Unknown11", // 11 - "Unknown12", // 12 - "Unknown13", // 13 - "Unknown14", // 14 - "Unknown15", // 15 -} ; - -const int piMemorySize [8] = -{ - 256, // 0 - 512, // 1 - 1024, // 2 - 0, // 3 - 0, // 4 - 0, // 5 - 0, // 6 - 0, // 7 -} ; - -// Time for easy calculations - -static uint64_t epochMilli, epochMicro ; - -// Misc - -static int wiringPiMode = WPI_MODE_UNINITIALISED ; -static volatile int pinPass = -1 ; -static pthread_mutex_t pinMutex ; - -// Debugging & Return codes - -int wiringPiDebug = FALSE ; -int wiringPiReturnCodes = FALSE ; - -// Use /dev/gpiomem ? - -int wiringPiTryGpioMem = FALSE ; - -// sysFds: -// Map a file descriptor from the /sys/class/gpio/gpioX/value - -static int sysFds [64] = -{ - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -} ; - -// ISR Data - -static void (*isrFunctions [64])(void) ; - - -// Doing it the Arduino way with lookup tables... -// Yes, it's probably more innefficient than all the bit-twidling, but it -// does tend to make it all a bit clearer. At least to me! - -// pinToGpio: -// Take a Wiring pin (0 through X) and re-map it to the BCM_GPIO pin -// Cope for 3 different board revisions here. - -static int *pinToGpio ; - -// Revision 1, 1.1: - -static int pinToGpioR1 [64] = -{ - 17, 18, 21, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 - 0, 1, // I2C - SDA1, SCL1 wpi 8 - 9 - 8, 7, // SPI - CE1, CE0 wpi 10 - 11 - 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 - 14, 15, // UART - Tx, Rx wpi 15 - 16 - -// Padding: - - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 31 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - -// Revision 2: - -static int pinToGpioR2 [64] = -{ - 17, 18, 27, 22, 23, 24, 25, 4, // From the Original Wiki - GPIO 0 through 7: wpi 0 - 7 - 2, 3, // I2C - SDA0, SCL0 wpi 8 - 9 - 8, 7, // SPI - CE1, CE0 wpi 10 - 11 - 10, 9, 11, // SPI - MOSI, MISO, SCLK wpi 12 - 14 - 14, 15, // UART - Tx, Rx wpi 15 - 16 - 28, 29, 30, 31, // Rev 2: New GPIOs 8 though 11 wpi 17 - 20 - 5, 6, 13, 19, 26, // B+ wpi 21, 22, 23, 24, 25 - 12, 16, 20, 21, // B+ wpi 26, 27, 28, 29 - 0, 1, // B+ wpi 30, 31 - -// Padding: - - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - - -// physToGpio: -// Take a physical pin (1 through 26) and re-map it to the BCM_GPIO pin -// Cope for 2 different board revisions here. -// Also add in the P5 connector, so the P5 pins are 3,4,5,6, so 53,54,55,56 - -static int *physToGpio ; - -static int physToGpioR1 [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 0, -1, - 1, -1, - 4, 14, - -1, 15, - 17, 18, - 21, -1, - 22, 23, - -1, 24, - 10, -1, - 9, 25, - 11, 8, - -1, 7, // 25, 26 - - -1, -1, -1, -1, -1, // ... 31 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 47 - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 63 -} ; - -static int physToGpioR2 [64] = -{ - -1, // 0 - -1, -1, // 1, 2 - 2, -1, - 3, -1, - 4, 14, - -1, 15, - 17, 18, - 27, -1, - 22, 23, - -1, 24, - 10, -1, - 9, 25, - 11, 8, - -1, 7, // 25, 26 - -// B+ - - 0, 1, - 5, -1, - 6, 12, - 13, -1, - 19, 16, - 26, 20, - -1, 21, - -// the P5 connector on the Rev 2 boards: - - -1, -1, - -1, -1, - -1, -1, - -1, -1, - -1, -1, - 28, 29, - 30, 31, - -1, -1, - -1, -1, - -1, -1, - -1, -1, -} ; - -// gpioToGPFSEL: -// Map a BCM_GPIO pin to it's Function Selection -// control port. (GPFSEL 0-5) -// Groups of 10 - 3 bits per Function - 30 bits per port - -static uint8_t gpioToGPFSEL [] = -{ - 0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2, - 3,3,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5, -} ; - - -// gpioToShift -// Define the shift up for the 3 bits per pin in each GPFSEL port - -static uint8_t gpioToShift [] = -{ - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, - 0,3,6,9,12,15,18,21,24,27, -} ; - - -// gpioToGPSET: -// (Word) offset to the GPIO Set registers for each GPIO pin - -static uint8_t gpioToGPSET [] = -{ - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, -} ; - -// gpioToGPCLR: -// (Word) offset to the GPIO Clear registers for each GPIO pin - -static uint8_t gpioToGPCLR [] = -{ - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, -} ; - - -// gpioToGPLEV: -// (Word) offset to the GPIO Input level registers for each GPIO pin - -static uint8_t gpioToGPLEV [] = -{ - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, -} ; - - -#ifdef notYetReady -// gpioToEDS -// (Word) offset to the Event Detect Status - -static uint8_t gpioToEDS [] = -{ - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, -} ; - -// gpioToREN -// (Word) offset to the Rising edge ENable register - -static uint8_t gpioToREN [] = -{ - 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -} ; - -// gpioToFEN -// (Word) offset to the Falling edgde ENable register - -static uint8_t gpioToFEN [] = -{ - 22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22, - 23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, -} ; -#endif - - -// GPPUD: -// GPIO Pin pull up/down register - -#define GPPUD 37 - -// gpioToPUDCLK -// (Word) offset to the Pull Up Down Clock regsiter - -static uint8_t gpioToPUDCLK [] = -{ - 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38, - 39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39,39, -} ; - - -// gpioToPwmALT -// the ALT value to put a GPIO pin into PWM mode - -static uint8_t gpioToPwmALT [] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 - 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, 0, 0, // 8 -> 15 - 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 - FSEL_ALT0, FSEL_ALT0, 0, 0, 0, FSEL_ALT0, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; - - -// gpioToPwmPort -// The port value to put a GPIO pin into PWM mode - -static uint8_t gpioToPwmPort [] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, // 0 -> 7 - 0, 0, 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, // 8 -> 15 - 0, 0, PWM0_DATA, PWM1_DATA, 0, 0, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - 0, 0, 0, 0, 0, 0, 0, 0, // 32 -> 39 - PWM0_DATA, PWM1_DATA, 0, 0, 0, PWM1_DATA, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 - -} ; - -// gpioToGpClkALT: -// ALT value to put a GPIO pin into GP Clock mode. -// On the Pi we can really only use BCM_GPIO_4 and BCM_GPIO_21 -// for clocks 0 and 1 respectively, however I'll include the full -// list for completeness - maybe one day... - -#define GPIO_CLOCK_SOURCE 1 - -// gpioToGpClkALT0: - -static uint8_t gpioToGpClkALT0 [] = -{ - 0, 0, 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, // 0 -> 7 - 0, 0, 0, 0, 0, 0, 0, 0, // 8 -> 15 - 0, 0, 0, 0, FSEL_ALT5, FSEL_ALT5, 0, 0, // 16 -> 23 - 0, 0, 0, 0, 0, 0, 0, 0, // 24 -> 31 - FSEL_ALT0, 0, FSEL_ALT0, 0, 0, 0, 0, 0, // 32 -> 39 - 0, 0, FSEL_ALT0, FSEL_ALT0, FSEL_ALT0, 0, 0, 0, // 40 -> 47 - 0, 0, 0, 0, 0, 0, 0, 0, // 48 -> 55 - 0, 0, 0, 0, 0, 0, 0, 0, // 56 -> 63 -} ; - -// gpioToClk: -// (word) Offsets to the clock Control and Divisor register - -static uint8_t gpioToClkCon [] = -{ - -1, -1, -1, -1, 28, 30, 32, -1, // 0 -> 7 - -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 - -1, -1, -1, -1, 28, 30, -1, -1, // 16 -> 23 - -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 - 28, -1, 28, -1, -1, -1, -1, -1, // 32 -> 39 - -1, -1, 28, 30, 28, -1, -1, -1, // 40 -> 47 - -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 - -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 -} ; - -static uint8_t gpioToClkDiv [] = -{ - -1, -1, -1, -1, 29, 31, 33, -1, // 0 -> 7 - -1, -1, -1, -1, -1, -1, -1, -1, // 8 -> 15 - -1, -1, -1, -1, 29, 31, -1, -1, // 16 -> 23 - -1, -1, -1, -1, -1, -1, -1, -1, // 24 -> 31 - 29, -1, 29, -1, -1, -1, -1, -1, // 32 -> 39 - -1, -1, 29, 31, 29, -1, -1, -1, // 40 -> 47 - -1, -1, -1, -1, -1, -1, -1, -1, // 48 -> 55 - -1, -1, -1, -1, -1, -1, -1, -1, // 56 -> 63 -} ; - - -/* - * Functions - ********************************************************************************* - */ - - -/* - * wiringPiFailure: - * Fail. Or not. - ********************************************************************************* - */ - -int wiringPiFailure (int fatal, const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - if (!fatal && wiringPiReturnCodes) - return -1 ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - fprintf (stderr, "%s", buffer) ; - exit (EXIT_FAILURE) ; - - return 0 ; -} - - -/* - * piGpioLayout: - * Return a number representing the hardware revision of the board. - * This is not strictly the board revision but is used to check the - * layout of the GPIO connector - and there are 2 types that we are - * really interested in here. The very earliest Pi's and the - * ones that came after that which switched some pins .... - * - * Revision 1 really means the early Model A and B's. - * Revision 2 is everything else - it covers the B, B+ and CM. - * ... and the Pi 2 - which is a B+ ++ ... - * ... and the Pi 0 - which is an A+ ... - * - * The main difference between the revision 1 and 2 system that I use here - * is the mapping of the GPIO pins. From revision 2, the Pi Foundation changed - * 3 GPIO pins on the (original) 26-way header - BCM_GPIO 22 was dropped and - * replaced with 27, and 0 + 1 - I2C bus 0 was changed to 2 + 3; I2C bus 1. - * - * Additionally, here we set the piModel2 flag too. This is again, nothing to - * do with the actual model, but the major version numbers - the GPIO base - * hardware address changed at model 2 and above (not the Zero though) - * - ********************************************************************************* - */ - -static void piGpioLayoutOops (const char *why) -{ - fprintf (stderr, "Oops: Unable to determine board revision from /proc/cpuinfo\n") ; - fprintf (stderr, " -> %s\n", why) ; - fprintf (stderr, " -> You'd best google the error to find out why.\n") ; -//fprintf (stderr, " -> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410\n") ; - exit (EXIT_FAILURE) ; -} - -int piGpioLayout (void) -{ - FILE *cpuFd ; - char line [120] ; - char *c ; - static int gpioLayout = -1 ; - - if (gpioLayout != -1) // No point checking twice - return gpioLayout ; - - if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - piGpioLayoutOops ("Unable to open /proc/cpuinfo") ; - -// Start by looking for the Architecture to make sure we're really running -// on a Pi. I'm getting fed-up with people whinging at me because -// they can't get it to work on weirdFruitPi boards... - - while (fgets (line, 120, cpuFd) != NULL) - if (strncmp (line, "Hardware", 8) == 0) - break ; - - if (strncmp (line, "Hardware", 8) != 0) - piGpioLayoutOops ("No \"Hardware\" line") ; - - if (wiringPiDebug) - printf ("piGpioLayout: Hardware: %s\n", line) ; - -// See if it's BCM2708 or BCM2709 or the new BCM2835. - -// OK. As of Kernel 4.8, we have BCM2835 only, regardless of model. -// However I still want to check because it will trap the cheapskates and rip- -// off merchants who want to use wiringPi on non-Raspberry Pi platforms - which -// I do not support so don't email me your bleating whinges about anything -// other than a genuine Raspberry Pi. - - if (! (strstr (line, "BCM2708") || strstr (line, "BCM2709") || strstr (line, "BCM2835"))) - { - fprintf (stderr, "Unable to determine hardware version. I see: %s,\n", line) ; - fprintf (stderr, " - expecting BCM2708, BCM2709 or BCM2835.\n") ; - fprintf (stderr, "If this is a genuine Raspberry Pi then please report this\n") ; - fprintf (stderr, "to projects@drogon.net. If this is not a Raspberry Pi then you\n") ; - fprintf (stderr, "are on your own as wiringPi is designed to support the\n") ; - fprintf (stderr, "Raspberry Pi ONLY.\n") ; - exit (EXIT_FAILURE) ; - } - -// Right - we're Probably on a Raspberry Pi. Check the revision field for the real -// hardware type -// In-future, I ought to use the device tree as there are now Pi entries in -// /proc/device-tree/ ... -// but I'll leave that for the next revision. - -// Isolate the Revision line - - rewind (cpuFd) ; - while (fgets (line, 120, cpuFd) != NULL) - if (strncmp (line, "Revision", 8) == 0) - break ; - - fclose (cpuFd) ; - - if (strncmp (line, "Revision", 8) != 0) - piGpioLayoutOops ("No \"Revision\" line") ; - -// Chomp trailing CR/NL - - for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) - *c = 0 ; - - if (wiringPiDebug) - printf ("piGpioLayout: Revision string: %s\n", line) ; - -// Scan to the first character of the revision number - - for (c = line ; *c ; ++c) - if (*c == ':') - break ; - - if (*c != ':') - piGpioLayoutOops ("Bogus \"Revision\" line (no colon)") ; - -// Chomp spaces - - ++c ; - while (isspace (*c)) - ++c ; - - if (!isxdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)") ; - -// Make sure its long enough - - if (strlen (c) < 4) - piGpioLayoutOops ("Bogus revision line (too small)") ; - -// Isolate last 4 characters: (in-case of overvolting or new encoding scheme) - - c = c + strlen (c) - 4 ; - - if (wiringPiDebug) - printf ("piGpioLayout: last4Chars are: \"%s\"\n", c) ; - - if ( (strcmp (c, "0002") == 0) || (strcmp (c, "0003") == 0)) - gpioLayout = 1 ; - else - gpioLayout = 2 ; // Covers everything else from the B revision 2 to the B+, the Pi v2, v3, zero and CM's. - - if (wiringPiDebug) - printf ("piGpioLayoutOops: Returning revision: %d\n", gpioLayout) ; - - return gpioLayout ; -} - -/* - * piBoardRev: - * Deprecated, but does the same as piGpioLayout - ********************************************************************************* - */ - -int piBoardRev (void) -{ - return piGpioLayout () ; -} - - - -/* - * piBoardId: - * Return the real details of the board we have. - * - * This is undocumented and really only intended for the GPIO command. - * Use at your own risk! - * - * Seems there are some boards with 0000 in them (mistake in manufacture) - * So the distinction between boards that I can see is: - * - * 0000 - Error - * 0001 - Not used - * - * Original Pi boards: - * 0002 - Model B, Rev 1, 256MB, Egoman - * 0003 - Model B, Rev 1.1, 256MB, Egoman, Fuses/D14 removed. - * - * Newer Pi's with remapped GPIO: - * 0004 - Model B, Rev 1.2, 256MB, Sony - * 0005 - Model B, Rev 1.2, 256MB, Egoman - * 0006 - Model B, Rev 1.2, 256MB, Egoman - * - * 0007 - Model A, Rev 1.2, 256MB, Egoman - * 0008 - Model A, Rev 1.2, 256MB, Sony - * 0009 - Model A, Rev 1.2, 256MB, Egoman - * - * 000d - Model B, Rev 1.2, 512MB, Egoman (Red Pi, Blue Pi?) - * 000e - Model B, Rev 1.2, 512MB, Sony - * 000f - Model B, Rev 1.2, 512MB, Egoman - * - * 0010 - Model B+, Rev 1.2, 512MB, Sony - * 0013 - Model B+ Rev 1.2, 512MB, Embest - * 0016 - Model B+ Rev 1.2, 512MB, Sony - * 0019 - Model B+ Rev 1.2, 512MB, Egoman - * - * 0011 - Pi CM, Rev 1.1, 512MB, Sony - * 0014 - Pi CM, Rev 1.1, 512MB, Embest - * 0017 - Pi CM, Rev 1.1, 512MB, Sony - * 001a - Pi CM, Rev 1.1, 512MB, Egoman - * - * 0012 - Model A+ Rev 1.1, 256MB, Sony - * 0015 - Model A+ Rev 1.1, 512MB, Embest - * 0018 - Model A+ Rev 1.1, 256MB, Sony - * 001b - Model A+ Rev 1.1, 256MB, Egoman - * - * A small thorn is the olde style overvolting - that will add in - * 1000000 - * - * The Pi compute module has an revision of 0011 or 0014 - since we only - * check the last digit, then it's 1, therefore it'll default to not 2 or - * 3 for a Rev 1, so will appear as a Rev 2. This is fine for the most part, but - * we'll properly detect the Compute Module later and adjust accordingly. - * - * And then things changed with the introduction of the v2... - * - * For Pi v2 and subsequent models - e.g. the Zero: - * - * [USER:8] [NEW:1] [MEMSIZE:3] [MANUFACTURER:4] [PROCESSOR:4] [TYPE:8] [REV:4] - * NEW 23: will be 1 for the new scheme, 0 for the old scheme - * MEMSIZE 20: 0=256M 1=512M 2=1G - * MANUFACTURER 16: 0=SONY 1=EGOMAN 2=EMBEST - * PROCESSOR 12: 0=2835 1=2836 - * TYPE 04: 0=MODELA 1=MODELB 2=MODELA+ 3=MODELB+ 4=Pi2 MODEL B 5=ALPHA 6=CM - * REV 00: 0=REV0 1=REV1 2=REV2 - ********************************************************************************* - */ - -void piBoardId (int *model, int *rev, int *mem, int *maker, int *warranty) -{ - FILE *cpuFd ; - char line [120] ; - char *c ; - unsigned int revision ; - int bRev, bType, bProc, bMfg, bMem, bWarranty ; - -// Will deal with the properly later on - for now, lets just get it going... -// unsigned int modelNum ; - - (void)piGpioLayout () ; // Call this first to make sure all's OK. Don't care about the result. - - if ((cpuFd = fopen ("/proc/cpuinfo", "r")) == NULL) - piGpioLayoutOops ("Unable to open /proc/cpuinfo") ; - - while (fgets (line, 120, cpuFd) != NULL) - if (strncmp (line, "Revision", 8) == 0) - break ; - - fclose (cpuFd) ; - - if (strncmp (line, "Revision", 8) != 0) - piGpioLayoutOops ("No \"Revision\" line") ; - -// Chomp trailing CR/NL - - for (c = &line [strlen (line) - 1] ; (*c == '\n') || (*c == '\r') ; --c) - *c = 0 ; - - if (wiringPiDebug) - printf ("piBoardId: Revision string: %s\n", line) ; - -// Need to work out if it's using the new or old encoding scheme: - -// Scan to the first character of the revision number - - for (c = line ; *c ; ++c) - if (*c == ':') - break ; - - if (*c != ':') - piGpioLayoutOops ("Bogus \"Revision\" line (no colon)") ; - -// Chomp spaces - - ++c ; - while (isspace (*c)) - ++c ; - - if (!isxdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no hex digit at start of revision)") ; - - revision = (unsigned int)strtol (c, NULL, 16) ; // Hex number with no leading 0x - -// Check for new way: - - if ((revision & (1 << 23)) != 0) // New way - { - if (wiringPiDebug) - printf ("piBoardId: New Way: revision is: 0x%08X\n", revision) ; - - bRev = (revision & (0x0F << 0)) >> 0 ; - bType = (revision & (0xFF << 4)) >> 4 ; - bProc = (revision & (0x0F << 12)) >> 12 ; // Not used for now. - bMfg = (revision & (0x0F << 16)) >> 16 ; - bMem = (revision & (0x07 << 20)) >> 20 ; - bWarranty = (revision & (0x03 << 24)) != 0 ; - - *model = bType ; - *rev = bRev ; - *mem = bMem ; - *maker = bMfg ; - *warranty = bWarranty ; - - if (wiringPiDebug) - printf ("piBoardId: rev: %d, type: %d, proc: %d, mfg: %d, mem: %d, warranty: %d\n", - bRev, bType, bProc, bMfg, bMem, bWarranty) ; - } - else // Old way - { - if (wiringPiDebug) - printf ("piBoardId: Old Way: revision is: %s\n", c) ; - - if (!isdigit (*c)) - piGpioLayoutOops ("Bogus \"Revision\" line (no digit at start of revision)") ; - -// Make sure its long enough - - if (strlen (c) < 4) - piGpioLayoutOops ("Bogus \"Revision\" line (not long enough)") ; - -// If longer than 4, we'll assume it's been overvolted - - *warranty = strlen (c) > 4 ; - -// Extract last 4 characters: - - c = c + strlen (c) - 4 ; - -// Fill out the replys as appropriate - - /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_SONY ; ; } - else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_A ; *rev = PI_VERSION_1_2 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0013") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0016") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0019") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0014") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0017") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "001a") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EGOMAN ; } - - else if (strcmp (c, "0012") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "0015") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 1 ; *maker = PI_MAKER_EMBEST ; } - else if (strcmp (c, "0018") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_SONY ; } - else if (strcmp (c, "001b") == 0) { *model = PI_MODEL_AP ; *rev = PI_VERSION_1_1 ; *mem = 0 ; *maker = PI_MAKER_EGOMAN ; } - - else { *model = 0 ; *rev = 0 ; *mem = 0 ; *maker = 0 ; } - } -} - - - -/* - * wpiPinToGpio: - * Translate a wiringPi Pin number to native GPIO pin number. - * Provided for external support. - ********************************************************************************* - */ - -int wpiPinToGpio (int wpiPin) -{ - return pinToGpio [wpiPin & 63] ; -} - - -/* - * physPinToGpio: - * Translate a physical Pin number to native GPIO pin number. - * Provided for external support. - ********************************************************************************* - */ - -int physPinToGpio (int physPin) -{ - return physToGpio [physPin & 63] ; -} - - -/* - * setPadDrive: - * Set the PAD driver value - ********************************************************************************* - */ - -void setPadDrive (int group, int value) -{ - uint32_t wrVal ; - - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - if ((group < 0) || (group > 2)) - return ; - - wrVal = BCM_PASSWORD | 0x18 | (value & 7) ; - *(pads + group + 11) = wrVal ; - - if (wiringPiDebug) - { - printf ("setPadDrive: Group: %d, value: %d (%08X)\n", group, value, wrVal) ; - printf ("Read : %08X\n", *(pads + group + 11)) ; - } - } -} - - -/* - * getAlt: - * Returns the ALT bits for a given port. Only really of-use - * for the gpio readall command (I think) - ********************************************************************************* - */ - -int getAlt (int pin) -{ - int fSel, shift, alt ; - - pin &= 63 ; - - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return 0 ; - - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; - - alt = (*(gpio + fSel) >> shift) & 7 ; - - return alt ; -} - - -/* - * pwmSetMode: - * Select the native "balanced" mode, or standard mark:space mode - ********************************************************************************* - */ - -void pwmSetMode (int mode) -{ - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - if (mode == PWM_MODE_MS) - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; - else - *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; - } -} - - -/* - * pwmSetRange: - * Set the PWM range register. We set both range registers to the same - * value. If you want different in your own code, then write your own. - ********************************************************************************* - */ - -void pwmSetRange (unsigned int range) -{ - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; - *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; - } -} - - -/* - * pwmSetClock: - * Set/Change the PWM clock. Originally my code, but changed - * (for the better!) by Chris Hall, - * after further study of the manual and testing with a 'scope - ********************************************************************************* - */ - -void pwmSetClock (int divisor) -{ - uint32_t pwm_control ; - divisor &= 4095 ; - - if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) - { - if (wiringPiDebug) - printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; - - pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL - -// We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY -// stays high. - - *(pwm + PWM_CONTROL) = 0 ; // Stop PWM - -// Stop PWM clock before changing divisor. The delay after this does need to -// this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY -// flag is not working properly in balanced mode. Without the delay when DIV is -// adjusted the clock sometimes switches to very slow, once slow further DIV -// adjustments do nothing and it's difficult to get out of this mode. - - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock - delayMicroseconds (110) ; // prevents clock going sloooow - - while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY - delayMicroseconds (1) ; - - *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ; - - *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock - *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL - - if (wiringPiDebug) - printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; - } -} - - -/* - * gpioClockSet: - * Set the freuency on a GPIO clock pin - ********************************************************************************* - */ - -void gpioClockSet (int pin, int freq) -{ - int divi, divr, divf ; - - pin &= 63 ; - - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - divi = 19200000 / freq ; - divr = 19200000 % freq ; - divf = (int)((double)divr * 4096.0 / 19200000.0) ; - - if (divi > 4095) - divi = 4095 ; - - *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | GPIO_CLOCK_SOURCE ; // Stop GPIO Clock - while ((*(clk + gpioToClkCon [pin]) & 0x80) != 0) // ... and wait - ; - - *(clk + gpioToClkDiv [pin]) = BCM_PASSWORD | (divi << 12) | divf ; // Set dividers - *(clk + gpioToClkCon [pin]) = BCM_PASSWORD | 0x10 | GPIO_CLOCK_SOURCE ; // Start Clock -} - - -/* - * wiringPiFindNode: - * Locate our device node - ********************************************************************************* - */ - -struct wiringPiNodeStruct *wiringPiFindNode (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - while (node != NULL) - if ((pin >= node->pinBase) && (pin <= node->pinMax)) - return node ; - else - node = node->next ; - - return NULL ; -} - - -/* - * wiringPiNewNode: - * Create a new GPIO node into the wiringPi handling system - ********************************************************************************* - */ - -static void pinModeDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int mode) { return ; } -static void pullUpDnControlDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int pud) { return ; } -static unsigned int digitalRead8Dummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return 0 ; } -static void digitalWrite8Dummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static int digitalReadDummy (UNU struct wiringPiNodeStruct *node, UNU int UNU pin) { return LOW ; } -static void digitalWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static void pwmWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } -static int analogReadDummy (UNU struct wiringPiNodeStruct *node, UNU int pin) { return 0 ; } -static void analogWriteDummy (UNU struct wiringPiNodeStruct *node, UNU int pin, UNU int value) { return ; } - -struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) -{ - int pin ; - struct wiringPiNodeStruct *node ; - -// Minimum pin base is 64 - - if (pinBase < 64) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: pinBase of %d is < 64\n", pinBase) ; - -// Check all pins in-case there is overlap: - - for (pin = pinBase ; pin < (pinBase + numPins) ; ++pin) - if (wiringPiFindNode (pin) != NULL) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Pin %d overlaps with existing definition\n", pin) ; - - node = (struct wiringPiNodeStruct *)calloc (sizeof (struct wiringPiNodeStruct), 1) ; // calloc zeros - if (node == NULL) - (void)wiringPiFailure (WPI_FATAL, "wiringPiNewNode: Unable to allocate memory: %s\n", strerror (errno)) ; - - node->pinBase = pinBase ; - node->pinMax = pinBase + numPins - 1 ; - node->pinMode = pinModeDummy ; - node->pullUpDnControl = pullUpDnControlDummy ; - node->digitalRead = digitalReadDummy ; -//node->digitalRead8 = digitalRead8Dummy ; - node->digitalWrite = digitalWriteDummy ; -//node->digitalWrite8 = digitalWrite8Dummy ; - node->pwmWrite = pwmWriteDummy ; - node->analogRead = analogReadDummy ; - node->analogWrite = analogWriteDummy ; - node->next = wiringPiNodes ; - wiringPiNodes = node ; - - return node ; -} - - -#ifdef notYetReady -/* - * pinED01: - * pinED10: - * Enables edge-detect mode on a pin - from a 0 to a 1 or 1 to 0 - * Pin must already be in input mode with appropriate pull up/downs set. - ********************************************************************************* - */ - -void pinEnableED01Pi (int pin) -{ - pin = pinToGpio [pin & 63] ; -} -#endif - - -/* - ********************************************************************************* - * Core Functions - ********************************************************************************* - */ - -/* - * pinModeAlt: - * This is an un-documented special to let you set any pin to any mode - ********************************************************************************* - */ - -void pinModeAlt (int pin, int mode) -{ - int fSel, shift ; - - if ((pin & PI_GPIO_MASK) == 0) // On-board pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | ((mode & 0x7) << shift) ; - } -} - - -/* - * pinMode: - * Sets the mode of a pin to be input, output or PWM output - ********************************************************************************* - */ - -void pinMode (int pin, int mode) -{ - int fSel, shift, alt ; - struct wiringPiNodeStruct *node = wiringPiNodes ; - int origPin = pin ; - - if ((pin & PI_GPIO_MASK) == 0) // On-board pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - softPwmStop (origPin) ; - softToneStop (origPin) ; - - fSel = gpioToGPFSEL [pin] ; - shift = gpioToShift [pin] ; - - /**/ if (mode == INPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) ; // Sets bits to zero = input - else if (mode == OUTPUT) - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (1 << shift) ; - else if (mode == SOFT_PWM_OUTPUT) - softPwmCreate (origPin, 0, 100) ; - else if (mode == SOFT_TONE_OUTPUT) - softToneCreate (origPin) ; - else if (mode == PWM_TONE_OUTPUT) - { - pinMode (origPin, PWM_OUTPUT) ; // Call myself to enable PWM mode - pwmSetMode (PWM_MODE_MS) ; - } - else if (mode == PWM_OUTPUT) - { - if ((alt = gpioToPwmALT [pin]) == 0) // Not a hardware capable PWM pin - return ; - -// Set pin to PWM mode - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - delayMicroseconds (110) ; // See comments in pwmSetClockWPi - - pwmSetMode (PWM_MODE_BAL) ; // Pi default mode - pwmSetRange (1024) ; // Default range of 1024 - pwmSetClock (32) ; // 19.2 / 32 = 600KHz - Also starts the PWM - } - else if (mode == GPIO_CLOCK) - { - if ((alt = gpioToGpClkALT0 [pin]) == 0) // Not a GPIO_CLOCK pin - return ; - -// Set pin to GPIO_CLOCK mode and set the clock frequency to 100KHz - - *(gpio + fSel) = (*(gpio + fSel) & ~(7 << shift)) | (alt << shift) ; - delayMicroseconds (110) ; - gpioClockSet (pin, 100000) ; - } - } - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->pinMode (node, pin, mode) ; - return ; - } -} - - -/* - * pullUpDownCtrl: - * Control the internal pull-up/down resistors on a GPIO pin - * The Arduino only has pull-ups and these are enabled by writing 1 - * to a port when in input mode - this paradigm doesn't quite apply - * here though. - ********************************************************************************* - */ - -void pullUpDnControl (int pin, int pud) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - *(gpio + GPPUD) = pud & 3 ; delayMicroseconds (5) ; - *(gpio + gpioToPUDCLK [pin]) = 1 << (pin & 31) ; delayMicroseconds (5) ; - - *(gpio + GPPUD) = 0 ; delayMicroseconds (5) ; - *(gpio + gpioToPUDCLK [pin]) = 0 ; delayMicroseconds (5) ; - } - else // Extension module - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->pullUpDnControl (node, pin, pud) ; - return ; - } -} - - -/* - * digitalRead: - * Read the value of a given Pin, returning HIGH or LOW - ********************************************************************************* - */ - -int digitalRead (int pin) -{ - char c ; - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode - { - if (sysFds [pin] == -1) - return LOW ; - - lseek (sysFds [pin], 0L, SEEK_SET) ; - read (sysFds [pin], &c, 1) ; - return (c == '0') ? LOW : HIGH ; - } - else if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return LOW ; - - if ((*(gpio + gpioToGPLEV [pin]) & (1 << (pin & 31))) != 0) - return HIGH ; - else - return LOW ; - } - else - { - if ((node = wiringPiFindNode (pin)) == NULL) - return LOW ; - return node->digitalRead (node, pin) ; - } -} - - -/* - * digitalRead8: - * Read 8-bits (a byte) from given start pin. - ********************************************************************************* - -unsigned int digitalRead8 (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - return 0 ; - else - { - if ((node = wiringPiFindNode (pin)) == NULL) - return LOW ; - return node->digitalRead8 (node, pin) ; - } -} - */ - - -/* - * digitalWrite: - * Set an output bit - ********************************************************************************* - */ - -void digitalWrite (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) // Sys mode - { - if (sysFds [pin] != -1) - { - if (value == LOW) - write (sysFds [pin], "0\n", 2) ; - else - write (sysFds [pin], "1\n", 2) ; - } - return ; - } - else if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - if (value == LOW) - *(gpio + gpioToGPCLR [pin]) = 1 << (pin & 31) ; - else - *(gpio + gpioToGPSET [pin]) = 1 << (pin & 31) ; - } - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->digitalWrite (node, pin, value) ; - } -} - - -/* - * digitalWrite8: - * Set an output 8-bit byte on the device from the given pin number - ********************************************************************************* - -void digitalWrite8 (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - return ; - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->digitalWrite8 (node, pin, value) ; - } -} - */ - - -/* - * pwmWrite: - * Set an output PWM value - ********************************************************************************* - */ - -void pwmWrite (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((pin & PI_GPIO_MASK) == 0) // On-Board Pin - { - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - else if (wiringPiMode != WPI_MODE_GPIO) - return ; - - *(pwm + gpioToPwmPort [pin]) = value ; - } - else - { - if ((node = wiringPiFindNode (pin)) != NULL) - node->pwmWrite (node, pin, value) ; - } -} - - -/* - * analogRead: - * Read the analog value of a given Pin. - * There is no on-board Pi analog hardware, - * so this needs to go to a new node. - ********************************************************************************* - */ - -int analogRead (int pin) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((node = wiringPiFindNode (pin)) == NULL) - return 0 ; - else - return node->analogRead (node, pin) ; -} - - -/* - * analogWrite: - * Write the analog value to the given Pin. - * There is no on-board Pi analog hardware, - * so this needs to go to a new node. - ********************************************************************************* - */ - -void analogWrite (int pin, int value) -{ - struct wiringPiNodeStruct *node = wiringPiNodes ; - - if ((node = wiringPiFindNode (pin)) == NULL) - return ; - - node->analogWrite (node, pin, value) ; -} - - -/* - * pwmToneWrite: - * Pi Specific. - * Output the given frequency on the Pi's PWM pin - ********************************************************************************* - */ - -void pwmToneWrite (int pin, int freq) -{ - int range ; - - if (freq == 0) - pwmWrite (pin, 0) ; // Off - else - { - range = 600000 / freq ; - pwmSetRange (range) ; - pwmWrite (pin, freq / 2) ; - } -} - - - -/* - * digitalWriteByte: - * digitalReadByte: - * Pi Specific - * Write an 8-bit byte to the first 8 GPIO pins - try to do it as - * fast as possible. - * However it still needs 2 operations to set the bits, so any external - * hardware must not rely on seeing a change as there will be a change - * to set the outputs bits to zero, then another change to set the 1's - * Reading is just bit fiddling. - * These are wiringPi pin numbers 0..7, or BCM_GPIO pin numbers - * 17, 18, 22, 23, 24, 24, 4 on a Pi v1 rev 0-3 - * 17, 18, 27, 23, 24, 24, 4 on a Pi v1 rev 3 onwards or B+, 2, 3, zero - ********************************************************************************* - */ - -void digitalWriteByte (const int value) -{ - uint32_t pinSet = 0 ; - uint32_t pinClr = 0 ; - int mask = 1 ; - int pin ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 0 ; pin < 8 ; ++pin) - { - digitalWrite (pinToGpio [pin], value & mask) ; - mask <<= 1 ; - } - return ; - } - else - { - for (pin = 0 ; pin < 8 ; ++pin) - { - if ((value & mask) == 0) - pinClr |= (1 << pinToGpio [pin]) ; - else - pinSet |= (1 << pinToGpio [pin]) ; - - mask <<= 1 ; - } - - *(gpio + gpioToGPCLR [0]) = pinClr ; - *(gpio + gpioToGPSET [0]) = pinSet ; - } -} - -unsigned int digitalReadByte (void) -{ - int pin, x ; - uint32_t raw ; - uint32_t data = 0 ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 0 ; pin < 8 ; ++pin) - { - x = digitalRead (pinToGpio [pin]) ; - data = (data << 1) | x ; - } - } - else - { - raw = *(gpio + gpioToGPLEV [0]) ; // First bank for these pins - for (pin = 0 ; pin < 8 ; ++pin) - { - x = pinToGpio [pin] ; - data = (data << 1) | (((raw & (1 << x)) == 0) ? 0 : 1) ; - } - } - return data ; -} - - -/* - * digitalWriteByte2: - * digitalReadByte2: - * Pi Specific - * Write an 8-bit byte to the second set of 8 GPIO pins. This is marginally - * faster than the first lot as these are consecutive BCM_GPIO pin numbers. - * However they overlap with the original read/write bytes. - ********************************************************************************* - */ - -void digitalWriteByte2 (const int value) -{ - register int mask = 1 ; - register int pin ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 20 ; pin < 28 ; ++pin) - { - digitalWrite (pin, value & mask) ; - mask <<= 1 ; - } - return ; - } - else - { - *(gpio + gpioToGPCLR [0]) = (~value & 0xFF) << 20 ; // 0x0FF00000; ILJ > CHANGE: Old causes glitch - *(gpio + gpioToGPSET [0]) = ( value & 0xFF) << 20 ; - } -} - -unsigned int digitalReadByte2 (void) -{ - int pin, x ; - uint32_t data = 0 ; - - /**/ if (wiringPiMode == WPI_MODE_GPIO_SYS) - { - for (pin = 20 ; pin < 28 ; ++pin) - { - x = digitalRead (pin) ; - data = (data << 1) | x ; - } - } - else - data = ((*(gpio + gpioToGPLEV [0])) >> 20) & 0xFF ; // First bank for these pins - - return data ; -} - - -/* - * waitForInterrupt: - * Pi Specific. - * Wait for Interrupt on a GPIO pin. - * This is actually done via the /sys/class/gpio interface regardless of - * the wiringPi access mode in-use. Maybe sometime it might get a better - * way for a bit more efficiency. - ********************************************************************************* - */ - -int waitForInterrupt (int pin, int mS) -{ - int fd, x ; - uint8_t c ; - struct pollfd polls ; - - /**/ if (wiringPiMode == WPI_MODE_PINS) - pin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - pin = physToGpio [pin] ; - - if ((fd = sysFds [pin]) == -1) - return -2 ; - -// Setup poll structure - - polls.fd = fd ; - polls.events = POLLPRI | POLLERR ; - -// Wait for it ... - - x = poll (&polls, 1, mS) ; - -// If no error, do a dummy read to clear the interrupt -// A one character read appars to be enough. - - if (x > 0) - { - lseek (fd, 0, SEEK_SET) ; // Rewind - (void)read (fd, &c, 1) ; // Read & clear - } - - return x ; -} - - -/* - * interruptHandler: - * This is a thread and gets started to wait for the interrupt we're - * hoping to catch. It will call the user-function when the interrupt - * fires. - ********************************************************************************* - */ - -static void *interruptHandler (UNU void *arg) -{ - int myPin ; - - (void)piHiPri (55) ; // Only effective if we run as root - - myPin = pinPass ; - pinPass = -1 ; - - for (;;) - if (waitForInterrupt (myPin, -1) > 0) - isrFunctions [myPin] () ; - - return NULL ; -} - - -/* - * wiringPiISR: - * Pi Specific. - * Take the details and create an interrupt handler that will do a call- - * back to the user supplied function. - ********************************************************************************* - */ - -int wiringPiISR (int pin, int mode, void (*function)(void)) -{ - pthread_t threadId ; - const char *modeS ; - char fName [64] ; - char pinS [8] ; - pid_t pid ; - int count, i ; - char c ; - int bcmGpioPin ; - - if ((pin < 0) || (pin > 63)) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: pin must be 0-63 (%d)\n", pin) ; - - /**/ if (wiringPiMode == WPI_MODE_UNINITIALISED) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: wiringPi has not been initialised. Unable to continue.\n") ; - else if (wiringPiMode == WPI_MODE_PINS) - bcmGpioPin = pinToGpio [pin] ; - else if (wiringPiMode == WPI_MODE_PHYS) - bcmGpioPin = physToGpio [pin] ; - else - bcmGpioPin = pin ; - -// Now export the pin and set the right edge -// We're going to use the gpio program to do this, so it assumes -// a full installation of wiringPi. It's a bit 'clunky', but it -// is a way that will work when we're running in "Sys" mode, as -// a non-root user. (without sudo) - - if (mode != INT_EDGE_SETUP) - { - /**/ if (mode == INT_EDGE_FALLING) - modeS = "falling" ; - else if (mode == INT_EDGE_RISING) - modeS = "rising" ; - else - modeS = "both" ; - - sprintf (pinS, "%d", bcmGpioPin) ; - - if ((pid = fork ()) < 0) // Fail - return wiringPiFailure (WPI_FATAL, "wiringPiISR: fork failed: %s\n", strerror (errno)) ; - - if (pid == 0) // Child, exec - { - /**/ if (access ("/usr/local/bin/gpio", X_OK) == 0) - { - execl ("/usr/local/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; - } - else if (access ("/usr/bin/gpio", X_OK) == 0) - { - execl ("/usr/bin/gpio", "gpio", "edge", pinS, modeS, (char *)NULL) ; - return wiringPiFailure (WPI_FATAL, "wiringPiISR: execl failed: %s\n", strerror (errno)) ; - } - else - return wiringPiFailure (WPI_FATAL, "wiringPiISR: Can't find gpio program\n") ; - } - else // Parent, wait - wait (NULL) ; - } - -// Now pre-open the /sys/class node - but it may already be open if -// we are in Sys mode... - - if (sysFds [bcmGpioPin] == -1) - { - sprintf (fName, "/sys/class/gpio/gpio%d/value", bcmGpioPin) ; - if ((sysFds [bcmGpioPin] = open (fName, O_RDWR)) < 0) - return wiringPiFailure (WPI_FATAL, "wiringPiISR: unable to open %s: %s\n", fName, strerror (errno)) ; - } - -// Clear any initial pending interrupt - - ioctl (sysFds [bcmGpioPin], FIONREAD, &count) ; - for (i = 0 ; i < count ; ++i) - read (sysFds [bcmGpioPin], &c, 1) ; - - isrFunctions [pin] = function ; - - pthread_mutex_lock (&pinMutex) ; - pinPass = pin ; - pthread_create (&threadId, NULL, interruptHandler, NULL) ; - while (pinPass != -1) - delay (1) ; - pthread_mutex_unlock (&pinMutex) ; - - return 0 ; -} - - -/* - * initialiseEpoch: - * Initialise our start-of-time variable to be the current unix - * time in milliseconds and microseconds. - ********************************************************************************* - */ - -static void initialiseEpoch (void) -{ -#ifdef OLD_WAY - struct timeval tv ; - - gettimeofday (&tv, NULL) ; - epochMilli = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; - epochMicro = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)(tv.tv_usec) ; -#else - struct timespec ts ; - - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - epochMilli = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L) ; - epochMicro = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000L) ; -#endif -} - - -/* - * delay: - * Wait for some number of milliseconds - ********************************************************************************* - */ - -void delay (unsigned int howLong) -{ - struct timespec sleeper, dummy ; - - sleeper.tv_sec = (time_t)(howLong / 1000) ; - sleeper.tv_nsec = (long)(howLong % 1000) * 1000000 ; - - nanosleep (&sleeper, &dummy) ; -} - - -/* - * delayMicroseconds: - * This is somewhat intersting. It seems that on the Pi, a single call - * to nanosleep takes some 80 to 130 microseconds anyway, so while - * obeying the standards (may take longer), it's not always what we - * want! - * - * So what I'll do now is if the delay is less than 100uS we'll do it - * in a hard loop, watching a built-in counter on the ARM chip. This is - * somewhat sub-optimal in that it uses 100% CPU, something not an issue - * in a microcontroller, but under a multi-tasking, multi-user OS, it's - * wastefull, however we've no real choice )-: - * - * Plan B: It seems all might not be well with that plan, so changing it - * to use gettimeofday () and poll on that instead... - ********************************************************************************* - */ - -void delayMicrosecondsHard (unsigned int howLong) -{ - struct timeval tNow, tLong, tEnd ; - - gettimeofday (&tNow, NULL) ; - tLong.tv_sec = howLong / 1000000 ; - tLong.tv_usec = howLong % 1000000 ; - timeradd (&tNow, &tLong, &tEnd) ; - - while (timercmp (&tNow, &tEnd, <)) - gettimeofday (&tNow, NULL) ; -} - -void delayMicroseconds (unsigned int howLong) -{ - struct timespec sleeper ; - unsigned int uSecs = howLong % 1000000 ; - unsigned int wSecs = howLong / 1000000 ; - - /**/ if (howLong == 0) - return ; - else if (howLong < 100) - delayMicrosecondsHard (howLong) ; - else - { - sleeper.tv_sec = wSecs ; - sleeper.tv_nsec = (long)(uSecs * 1000L) ; - nanosleep (&sleeper, NULL) ; - } -} - - -/* - * millis: - * Return a number of milliseconds as an unsigned int. - * Wraps at 49 days. - ********************************************************************************* - */ - -unsigned int millis (void) -{ - uint64_t now ; - -#ifdef OLD_WAY - struct timeval tv ; - - gettimeofday (&tv, NULL) ; - now = (uint64_t)tv.tv_sec * (uint64_t)1000 + (uint64_t)(tv.tv_usec / 1000) ; - -#else - struct timespec ts ; - - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - now = (uint64_t)ts.tv_sec * (uint64_t)1000 + (uint64_t)(ts.tv_nsec / 1000000L) ; -#endif - - return (uint32_t)(now - epochMilli) ; -} - - -/* - * micros: - * Return a number of microseconds as an unsigned int. - * Wraps after 71 minutes. - ********************************************************************************* - */ - -unsigned int micros (void) -{ - uint64_t now ; -#ifdef OLD_WAY - struct timeval tv ; - - gettimeofday (&tv, NULL) ; - now = (uint64_t)tv.tv_sec * (uint64_t)1000000 + (uint64_t)tv.tv_usec ; -#else - struct timespec ts ; - - clock_gettime (CLOCK_MONOTONIC_RAW, &ts) ; - now = (uint64_t)ts.tv_sec * (uint64_t)1000000 + (uint64_t)(ts.tv_nsec / 1000) ; -#endif - - - return (uint32_t)(now - epochMicro) ; -} - -/* - * wiringPiVersion: - * Return our current version number - ********************************************************************************* - */ - -void wiringPiVersion (int *major, int *minor) -{ - *major = VERSION_MAJOR ; - *minor = VERSION_MINOR ; -} - - -/* - * wiringPiSetup: - * Must be called once at the start of your program execution. - * - * Default setup: Initialises the system into wiringPi Pin mode and uses the - * memory mapped hardware directly. - * - * Changed now to revert to "gpio" mode if we're running on a Compute Module. - ********************************************************************************* - */ - -int wiringPiSetup (void) -{ - int fd ; - int model, rev, mem, maker, overVolted ; - static int alreadyDoneThis = FALSE ; - -// It's actually a fatal error to call any of the wiringPiSetup routines more than once, -// (you run out of file handles!) but I'm fed-up with the useless twats who email -// me bleating that there is a bug in my code, so screw-em. - - if (alreadyDoneThis) - return 0 ; - - alreadyDoneThis = TRUE ; - - if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; - - if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetup called\n") ; - -// Get the board ID information. We're not really using the information here, -// but it will give us information like the GPIO layout scheme (2 variants -// on the older 26-pin Pi's) and the GPIO peripheral base address. -// and if we're running on a compute module, then wiringPi pin numbers -// don't really many anything, so force native BCM mode anyway. - - piBoardId (&model, &rev, &mem, &maker, &overVolted) ; - - if ((model == PI_MODEL_CM) || (model == PI_MODEL_CM3)) - wiringPiMode = WPI_MODE_GPIO ; - else - wiringPiMode = WPI_MODE_PINS ; - - /**/ if (piGpioLayout () == 1) // A, B, Rev 1, 1.1 - { - pinToGpio = pinToGpioR1 ; - physToGpio = physToGpioR1 ; - } - else // A2, B2, A+, B+, CM, Pi2, Pi3, Zero - { - pinToGpio = pinToGpioR2 ; - physToGpio = physToGpioR2 ; - } - -// ... - - switch (model) - { - case PI_MODEL_A: case PI_MODEL_B: - case PI_MODEL_AP: case PI_MODEL_BP: - case PI_ALPHA: case PI_MODEL_CM: - case PI_MODEL_ZERO: case PI_MODEL_ZERO_W: - piGpioBase = GPIO_PERI_BASE_OLD ; - break ; - - default: - piGpioBase = GPIO_PERI_BASE_NEW ; - break ; - } - -// Open the master /dev/ memory control device -// Device strategy: December 2016: -// Try /dev/mem. If that fails, then -// try /dev/gpiomem. If that fails then game over. - - if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) - { - if ((fd = open ("/dev/gpiomem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: %s.\n Try running with sudo?\n", strerror (errno)) ; - piGpioBase = 0 ; - } - -// Set the offsets into the memory interface. - - GPIO_PADS = piGpioBase + 0x00100000 ; - GPIO_CLOCK_BASE = piGpioBase + 0x00101000 ; - GPIO_BASE = piGpioBase + 0x00200000 ; - GPIO_TIMER = piGpioBase + 0x0000B000 ; - GPIO_PWM = piGpioBase + 0x0020C000 ; - -// Map the individual hardware components - -// GPIO: - - gpio = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_BASE) ; - if (gpio == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (GPIO) failed: %s\n", strerror (errno)) ; - -// PWM - - pwm = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PWM) ; - if (pwm == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PWM) failed: %s\n", strerror (errno)) ; - -// Clock control (needed for PWM) - - clk = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_CLOCK_BASE) ; - if (clk == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (CLOCK) failed: %s\n", strerror (errno)) ; - -// The drive pads - - pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ; - if (pads == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (PADS) failed: %s\n", strerror (errno)) ; - -#ifdef USE_TIMER -// The system timer - - timer = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_TIMER) ; - if (timer == MAP_FAILED) - return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: mmap (TIMER) failed: %s\n", strerror (errno)) ; - -// Set the timer to free-running, 1MHz. -// 0xF9 is 249, the timer divide is base clock / (divide+1) -// so base clock is 250MHz / 250 = 1MHz. - - *(timer + TIMER_CONTROL) = 0x0000280 ; - *(timer + TIMER_PRE_DIV) = 0x00000F9 ; - timerIrqRaw = timer + TIMER_IRQ_RAW ; -#endif - - initialiseEpoch () ; - - return 0 ; -} - - -/* - * wiringPiSetupGpio: - * Must be called once at the start of your program execution. - * - * GPIO setup: Initialises the system into GPIO Pin mode and uses the - * memory mapped hardware directly. - ********************************************************************************* - */ - -int wiringPiSetupGpio (void) -{ - (void)wiringPiSetup () ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupGpio called\n") ; - - wiringPiMode = WPI_MODE_GPIO ; - - return 0 ; -} - - -/* - * wiringPiSetupPhys: - * Must be called once at the start of your program execution. - * - * Phys setup: Initialises the system into Physical Pin mode and uses the - * memory mapped hardware directly. - ********************************************************************************* - */ - -int wiringPiSetupPhys (void) -{ - (void)wiringPiSetup () ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupPhys called\n") ; - - wiringPiMode = WPI_MODE_PHYS ; - - return 0 ; -} - - -/* - * wiringPiSetupSys: - * Must be called once at the start of your program execution. - * - * Initialisation (again), however this time we are using the /sys/class/gpio - * interface to the GPIO systems - slightly slower, but always usable as - * a non-root user, assuming the devices are already exported and setup correctly. - */ - -int wiringPiSetupSys (void) -{ - int pin ; - char fName [128] ; - - static int alreadyDoneThis = FALSE ; - -// It's actually a fatal error to call any of the wiringPiSetup routines more than once, -// (you run out of file handles!) but I'm fed-up with the useless twats who email -// me bleating that there is a bug in my code, so screw-em. - - if (alreadyDoneThis) - return 0 ; - - alreadyDoneThis = TRUE ; - - if (getenv (ENV_DEBUG) != NULL) - wiringPiDebug = TRUE ; - - if (getenv (ENV_CODES) != NULL) - wiringPiReturnCodes = TRUE ; - - if (wiringPiDebug) - printf ("wiringPi: wiringPiSetupSys called\n") ; - - if (piGpioLayout () == 1) - { - pinToGpio = pinToGpioR1 ; - physToGpio = physToGpioR1 ; - } - else - { - pinToGpio = pinToGpioR2 ; - physToGpio = physToGpioR2 ; - } - -// Open and scan the directory, looking for exported GPIOs, and pre-open -// the 'value' interface to speed things up for later - - for (pin = 0 ; pin < 64 ; ++pin) - { - sprintf (fName, "/sys/class/gpio/gpio%d/value", pin) ; - sysFds [pin] = open (fName, O_RDWR) ; - } - - initialiseEpoch () ; - - wiringPiMode = WPI_MODE_GPIO_SYS ; - - return 0 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPi.h b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPi.h deleted file mode 100644 index f601f131d..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPi.h +++ /dev/null @@ -1,254 +0,0 @@ -/* - * wiringPi.h: - * Arduino like Wiring library for the Raspberry Pi. - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#ifndef __WIRING_PI_H__ -#define __WIRING_PI_H__ - -// C doesn't have true/false by default and I can never remember which -// way round they are, so ... -// (and yes, I know about stdbool.h but I like capitals for these and I'm old) - -#ifndef TRUE -# define TRUE (1==1) -# define FALSE (!TRUE) -#endif - -// GCC warning suppressor - -#define UNU __attribute__((unused)) - -// Mask for the bottom 64 pins which belong to the Raspberry Pi -// The others are available for the other devices - -#define PI_GPIO_MASK (0xFFFFFFC0) - -// Handy defines - -// wiringPi modes - -#define WPI_MODE_PINS 0 -#define WPI_MODE_GPIO 1 -#define WPI_MODE_GPIO_SYS 2 -#define WPI_MODE_PHYS 3 -#define WPI_MODE_PIFACE 4 -#define WPI_MODE_UNINITIALISED -1 - -// Pin modes - -#define INPUT 0 -#define OUTPUT 1 -#define PWM_OUTPUT 2 -#define GPIO_CLOCK 3 -#define SOFT_PWM_OUTPUT 4 -#define SOFT_TONE_OUTPUT 5 -#define PWM_TONE_OUTPUT 6 - -#define LOW 0 -#define HIGH 1 - -// Pull up/down/none - -#define PUD_OFF 0 -#define PUD_DOWN 1 -#define PUD_UP 2 - -// PWM - -#define PWM_MODE_MS 0 -#define PWM_MODE_BAL 1 - -// Interrupt levels - -#define INT_EDGE_SETUP 0 -#define INT_EDGE_FALLING 1 -#define INT_EDGE_RISING 2 -#define INT_EDGE_BOTH 3 - -// Pi model types and version numbers -// Intended for the GPIO program Use at your own risk. - -#define PI_MODEL_A 0 -#define PI_MODEL_B 1 -#define PI_MODEL_AP 2 -#define PI_MODEL_BP 3 -#define PI_MODEL_2 4 -#define PI_ALPHA 5 -#define PI_MODEL_CM 6 -#define PI_MODEL_07 7 -#define PI_MODEL_3 8 -#define PI_MODEL_ZERO 9 -#define PI_MODEL_CM3 10 -#define PI_MODEL_ZERO_W 12 - -#define PI_VERSION_1 0 -#define PI_VERSION_1_1 1 -#define PI_VERSION_1_2 2 -#define PI_VERSION_2 3 - -#define PI_MAKER_SONY 0 -#define PI_MAKER_EGOMAN 1 -#define PI_MAKER_EMBEST 2 -#define PI_MAKER_UNKNOWN 3 - -extern const char *piModelNames [16] ; -extern const char *piRevisionNames [16] ; -extern const char *piMakerNames [16] ; -extern const int piMemorySize [ 8] ; - - -// Intended for the GPIO program Use at your own risk. - -// Threads - -#define PI_THREAD(X) void *X (UNU void *dummy) - -// Failure modes - -#define WPI_FATAL (1==1) -#define WPI_ALMOST (1==2) - - -// wiringPiNodeStruct: -// This describes additional device nodes in the extended wiringPi -// 2.0 scheme of things. -// It's a simple linked list for now, but will hopefully migrate to -// a binary tree for efficiency reasons - but then again, the chances -// of more than 1 or 2 devices being added are fairly slim, so who -// knows.... - -struct wiringPiNodeStruct -{ - int pinBase ; - int pinMax ; - - int fd ; // Node specific - unsigned int data0 ; // ditto - unsigned int data1 ; // ditto - unsigned int data2 ; // ditto - unsigned int data3 ; // ditto - - void (*pinMode) (struct wiringPiNodeStruct *node, int pin, int mode) ; - void (*pullUpDnControl) (struct wiringPiNodeStruct *node, int pin, int mode) ; - int (*digitalRead) (struct wiringPiNodeStruct *node, int pin) ; -//unsigned int (*digitalRead8) (struct wiringPiNodeStruct *node, int pin) ; - void (*digitalWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; -// void (*digitalWrite8) (struct wiringPiNodeStruct *node, int pin, int value) ; - void (*pwmWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; - int (*analogRead) (struct wiringPiNodeStruct *node, int pin) ; - void (*analogWrite) (struct wiringPiNodeStruct *node, int pin, int value) ; - - struct wiringPiNodeStruct *next ; -} ; - -extern struct wiringPiNodeStruct *wiringPiNodes ; - - -// Function prototypes -// c++ wrappers thanks to a comment by Nick Lott -// (and others on the Raspberry Pi forums) - -#ifdef __cplusplus -extern "C" { -#endif - -// Data - -// Internal - -extern int wiringPiFailure (int fatal, const char *message, ...) ; - -// Core wiringPi functions - -extern struct wiringPiNodeStruct *wiringPiFindNode (int pin) ; -extern struct wiringPiNodeStruct *wiringPiNewNode (int pinBase, int numPins) ; - -extern void wiringPiVersion (int *major, int *minor) ; -extern int wiringPiSetup (void) ; -extern int wiringPiSetupSys (void) ; -extern int wiringPiSetupGpio (void) ; -extern int wiringPiSetupPhys (void) ; - -extern void pinModeAlt (int pin, int mode) ; -extern void pinMode (int pin, int mode) ; -extern void pullUpDnControl (int pin, int pud) ; -extern int digitalRead (int pin) ; -extern void digitalWrite (int pin, int value) ; -extern unsigned int digitalRead8 (int pin) ; -extern void digitalWrite8 (int pin, int value) ; -extern void pwmWrite (int pin, int value) ; -extern int analogRead (int pin) ; -extern void analogWrite (int pin, int value) ; - -// PiFace specifics -// (Deprecated) - -extern int wiringPiSetupPiFace (void) ; -extern int wiringPiSetupPiFaceForGpioProg (void) ; // Don't use this - for gpio program only - -// On-Board Raspberry Pi hardware specific stuff - -extern int piGpioLayout (void) ; -extern int piBoardRev (void) ; // Deprecated -extern void piBoardId (int *model, int *rev, int *mem, int *maker, int *overVolted) ; -extern int wpiPinToGpio (int wpiPin) ; -extern int physPinToGpio (int physPin) ; -extern void setPadDrive (int group, int value) ; -extern int getAlt (int pin) ; -extern void pwmToneWrite (int pin, int freq) ; -extern void pwmSetMode (int mode) ; -extern void pwmSetRange (unsigned int range) ; -extern void pwmSetClock (int divisor) ; -extern void gpioClockSet (int pin, int freq) ; -extern unsigned int digitalReadByte (void) ; -extern unsigned int digitalReadByte2 (void) ; -extern void digitalWriteByte (int value) ; -extern void digitalWriteByte2 (int value) ; - -// Interrupts -// (Also Pi hardware specific) - -extern int waitForInterrupt (int pin, int mS) ; -extern int wiringPiISR (int pin, int mode, void (*function)(void)) ; - -// Threads - -extern int piThreadCreate (void *(*fn)(void *)) ; -extern void piLock (int key) ; -extern void piUnlock (int key) ; - -// Schedulling priority - -extern int piHiPri (const int pri) ; - -// Extras from arduino land - -extern void delay (unsigned int howLong) ; -extern void delayMicroseconds (unsigned int howLong) ; -extern unsigned int millis (void) ; -extern unsigned int micros (void) ; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiI2C.c b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiI2C.c deleted file mode 100644 index b0ee5d30c..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiI2C.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * wiringPiI2C.c: - * Simplified I2C access routines - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -/* - * Notes: - * The Linux I2C code is actually the same (almost) as the SMBus code. - * SMBus is System Management Bus - and in essentially I2C with some - * additional functionality added, and stricter controls on the electrical - * specifications, etc. however I2C does work well with it and the - * protocols work over both. - * - * I'm directly including the SMBus functions here as some Linux distros - * lack the correct header files, and also some header files are GPLv2 - * rather than the LGPL that wiringPi is released under - presumably because - * originally no-one expected I2C/SMBus to be used outside the kernel - - * however enter the Raspberry Pi with people now taking directly to I2C - * devices without going via the kernel... - * - * This may ultimately reduce the flexibility of this code, but it won't be - * hard to maintain it and keep it current, should things change. - * - * Information here gained from: kernel/Documentation/i2c/dev-interface - * as well as other online resources. - ********************************************************************************* - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wiringPi.h" -#include "wiringPiI2C.h" - -// I2C definitions - -#define I2C_SLAVE 0x0703 -#define I2C_SMBUS 0x0720 /* SMBus-level access */ - -#define I2C_SMBUS_READ 1 -#define I2C_SMBUS_WRITE 0 - -// SMBus transaction types - -#define I2C_SMBUS_QUICK 0 -#define I2C_SMBUS_BYTE 1 -#define I2C_SMBUS_BYTE_DATA 2 -#define I2C_SMBUS_WORD_DATA 3 -#define I2C_SMBUS_PROC_CALL 4 -#define I2C_SMBUS_BLOCK_DATA 5 -#define I2C_SMBUS_I2C_BLOCK_BROKEN 6 -#define I2C_SMBUS_BLOCK_PROC_CALL 7 /* SMBus 2.0 */ -#define I2C_SMBUS_I2C_BLOCK_DATA 8 - -// SMBus messages - -#define I2C_SMBUS_BLOCK_MAX 32 /* As specified in SMBus standard */ -#define I2C_SMBUS_I2C_BLOCK_MAX 32 /* Not specified but we use same structure */ - -// Structures used in the ioctl() calls - -union i2c_smbus_data -{ - uint8_t byte ; - uint16_t word ; - uint8_t block [I2C_SMBUS_BLOCK_MAX + 2] ; // block [0] is used for length + one more for PEC -} ; - -struct i2c_smbus_ioctl_data -{ - char read_write ; - uint8_t command ; - int size ; - union i2c_smbus_data *data ; -} ; - -static inline int i2c_smbus_access (int fd, char rw, uint8_t command, int size, union i2c_smbus_data *data) -{ - struct i2c_smbus_ioctl_data args ; - - args.read_write = rw ; - args.command = command ; - args.size = size ; - args.data = data ; - return ioctl (fd, I2C_SMBUS, &args) ; -} - - -/* - * wiringPiI2CRead: - * Simple device read - ********************************************************************************* - */ - -int wiringPiI2CRead (int fd) -{ - union i2c_smbus_data data ; - - if (i2c_smbus_access (fd, I2C_SMBUS_READ, 0, I2C_SMBUS_BYTE, &data)) - return -1 ; - else - return data.byte & 0xFF ; -} - - -/* - * wiringPiI2CReadReg8: wiringPiI2CReadReg16: - * Read an 8 or 16-bit value from a regsiter on the device - ********************************************************************************* - */ - -int wiringPiI2CReadReg8 (int fd, int reg) -{ - union i2c_smbus_data data; - - if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_BYTE_DATA, &data)) - return -1 ; - else - return data.byte & 0xFF ; -} - -int wiringPiI2CReadReg16 (int fd, int reg) -{ - union i2c_smbus_data data; - - if (i2c_smbus_access (fd, I2C_SMBUS_READ, reg, I2C_SMBUS_WORD_DATA, &data)) - return -1 ; - else - return data.word & 0xFFFF ; -} - - -/* - * wiringPiI2CWrite: - * Simple device write - ********************************************************************************* - */ - -int wiringPiI2CWrite (int fd, int data) -{ - return i2c_smbus_access (fd, I2C_SMBUS_WRITE, data, I2C_SMBUS_BYTE, NULL) ; -} - - -/* - * wiringPiI2CWriteReg8: wiringPiI2CWriteReg16: - * Write an 8 or 16-bit value to the given register - ********************************************************************************* - */ - -int wiringPiI2CWriteReg8 (int fd, int reg, int value) -{ - union i2c_smbus_data data ; - - data.byte = value ; - return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_BYTE_DATA, &data) ; -} - -int wiringPiI2CWriteReg16 (int fd, int reg, int value) -{ - union i2c_smbus_data data ; - - data.word = value ; - return i2c_smbus_access (fd, I2C_SMBUS_WRITE, reg, I2C_SMBUS_WORD_DATA, &data) ; -} - - -/* - * wiringPiI2CSetupInterface: - * Undocumented access to set the interface explicitly - might be used - * for the Pi's 2nd I2C interface... - ********************************************************************************* - */ - -int wiringPiI2CSetupInterface (const char *device, int devId) -{ - int fd ; - - if ((fd = open (device, O_RDWR)) < 0) - return wiringPiFailure (WPI_ALMOST, "Unable to open I2C device: %s\n", strerror (errno)) ; - - if (ioctl (fd, I2C_SLAVE, devId) < 0) - return wiringPiFailure (WPI_ALMOST, "Unable to select I2C device: %s\n", strerror (errno)) ; - - return fd ; -} - - -/* - * wiringPiI2CSetup: - * Open the I2C device, and regsiter the target device - ********************************************************************************* - */ - -int wiringPiI2CSetup (const int devId) -{ - int rev ; - const char *device ; - - rev = piGpioLayout () ; - - if (rev == 1) - device = "/dev/i2c-0" ; - else - device = "/dev/i2c-1" ; - - return wiringPiI2CSetupInterface (device, devId) ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiI2C.h b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiI2C.h deleted file mode 100644 index 6db8c688e..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiI2C.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * wiringPiI2C.h: - * Simplified I2C access routines - * Copyright (c) 2013 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int wiringPiI2CRead (int fd) ; -extern int wiringPiI2CReadReg8 (int fd, int reg) ; -extern int wiringPiI2CReadReg16 (int fd, int reg) ; - -extern int wiringPiI2CWrite (int fd, int data) ; -extern int wiringPiI2CWriteReg8 (int fd, int reg, int data) ; -extern int wiringPiI2CWriteReg16 (int fd, int reg, int data) ; - -extern int wiringPiI2CSetupInterface (const char *device, int devId) ; -extern int wiringPiI2CSetup (const int devId) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiSPI.c b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiSPI.c deleted file mode 100644 index 022b99fc0..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiSPI.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * wiringPiSPI.c: - * Simplified SPI access routines - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - - -#include -#include -#include -#include -#include -#include -#include - -#include "wiringPi.h" - -#include "wiringPiSPI.h" - - -// The SPI bus parameters -// Variables as they need to be passed as pointers later on - -static const char *spiDev0 = "/dev/spidev0.0" ; -static const char *spiDev1 = "/dev/spidev0.1" ; -static const uint8_t spiBPW = 8 ; -static const uint16_t spiDelay = 0 ; - -static uint32_t spiSpeeds [2] ; -static int spiFds [2] ; - - -/* - * wiringPiSPIGetFd: - * Return the file-descriptor for the given channel - ********************************************************************************* - */ - -int wiringPiSPIGetFd (int channel) -{ - return spiFds [channel & 1] ; -} - - -/* - * wiringPiSPIDataRW: - * Write and Read a block of data over the SPI bus. - * Note the data ia being read into the transmit buffer, so will - * overwrite it! - * This is also a full-duplex operation. - ********************************************************************************* - */ - -int wiringPiSPIDataRW (int channel, unsigned char *data, int len) -{ - struct spi_ioc_transfer spi ; - - channel &= 1 ; - -// Mentioned in spidev.h but not used in the original kernel documentation -// test program )-: - - memset (&spi, 0, sizeof (spi)) ; - - spi.tx_buf = (unsigned long)data ; - spi.rx_buf = (unsigned long)data ; - spi.len = len ; - spi.delay_usecs = spiDelay ; - spi.speed_hz = spiSpeeds [channel] ; - spi.bits_per_word = spiBPW ; - - return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ; -} - - -/* - * wiringPiSPISetupMode: - * Open the SPI device, and set it up, with the mode, etc. - ********************************************************************************* - */ - -int wiringPiSPISetupMode (int channel, int speed, int mode) -{ - int fd ; - - mode &= 3 ; // Mode is 0, 1, 2 or 3 - channel &= 1 ; // Channel is 0 or 1 - - if ((fd = open (channel == 0 ? spiDev0 : spiDev1, O_RDWR)) < 0) - return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; - - spiSpeeds [channel] = speed ; - spiFds [channel] = fd ; - -// Set SPI parameters. - - if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; - - if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; - - if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ; - - return fd ; -} - - -/* - * wiringPiSPISetup: - * Open the SPI device, and set it up, etc. in the default MODE 0 - ********************************************************************************* - */ - -int wiringPiSPISetup (int channel, int speed) -{ - return wiringPiSPISetupMode (channel, speed, 0) ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiSPI.h b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiSPI.h deleted file mode 100644 index 398032199..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringPiSPI.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * wiringPiSPI.h: - * Simplified SPI access routines - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with wiringPi. - * If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -int wiringPiSPIGetFd (int channel) ; -int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; -int wiringPiSPISetupMode (int channel, int speed, int mode) ; -int wiringPiSPISetup (int channel, int speed) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringSerial.c b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringSerial.c deleted file mode 100644 index e1587ad81..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringSerial.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * wiringSerial.c: - * Handle a serial port - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "wiringSerial.h" - -/* - * serialOpen: - * Open and initialise the serial port, setting all the right - * port parameters - or as many as are required - hopefully! - ********************************************************************************* - */ - -int serialOpen (const char *device, const int baud) -{ - struct termios options ; - speed_t myBaud ; - int status, fd ; - - switch (baud) - { - case 50: myBaud = B50 ; break ; - case 75: myBaud = B75 ; break ; - case 110: myBaud = B110 ; break ; - case 134: myBaud = B134 ; break ; - case 150: myBaud = B150 ; break ; - case 200: myBaud = B200 ; break ; - case 300: myBaud = B300 ; break ; - case 600: myBaud = B600 ; break ; - case 1200: myBaud = B1200 ; break ; - case 1800: myBaud = B1800 ; break ; - case 2400: myBaud = B2400 ; break ; - case 4800: myBaud = B4800 ; break ; - case 9600: myBaud = B9600 ; break ; - case 19200: myBaud = B19200 ; break ; - case 38400: myBaud = B38400 ; break ; - case 57600: myBaud = B57600 ; break ; - case 115200: myBaud = B115200 ; break ; - case 230400: myBaud = B230400 ; break ; - case 460800: myBaud = B460800 ; break ; - case 500000: myBaud = B500000 ; break ; - case 576000: myBaud = B576000 ; break ; - case 921600: myBaud = B921600 ; break ; - case 1000000: myBaud = B1000000 ; break ; - case 1152000: myBaud = B1152000 ; break ; - case 1500000: myBaud = B1500000 ; break ; - case 2000000: myBaud = B2000000 ; break ; - case 2500000: myBaud = B2500000 ; break ; - case 3000000: myBaud = B3000000 ; break ; - case 3500000: myBaud = B3500000 ; break ; - case 4000000: myBaud = B4000000 ; break ; - - default: - return -2 ; - } - - if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1) - return -1 ; - - fcntl (fd, F_SETFL, O_RDWR) ; - -// Get and modify current options: - - tcgetattr (fd, &options) ; - - cfmakeraw (&options) ; - cfsetispeed (&options, myBaud) ; - cfsetospeed (&options, myBaud) ; - - options.c_cflag |= (CLOCAL | CREAD) ; - options.c_cflag &= ~PARENB ; - options.c_cflag &= ~CSTOPB ; - options.c_cflag &= ~CSIZE ; - options.c_cflag |= CS8 ; - options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ; - options.c_oflag &= ~OPOST ; - - options.c_cc [VMIN] = 0 ; - options.c_cc [VTIME] = 100 ; // Ten seconds (100 deciseconds) - - tcsetattr (fd, TCSANOW, &options) ; - - ioctl (fd, TIOCMGET, &status); - - status |= TIOCM_DTR ; - status |= TIOCM_RTS ; - - ioctl (fd, TIOCMSET, &status); - - usleep (10000) ; // 10mS - - return fd ; -} - - -/* - * serialFlush: - * Flush the serial buffers (both tx & rx) - ********************************************************************************* - */ - -void serialFlush (const int fd) -{ - tcflush (fd, TCIOFLUSH) ; -} - - -/* - * serialClose: - * Release the serial port - ********************************************************************************* - */ - -void serialClose (const int fd) -{ - close (fd) ; -} - - -/* - * serialPutchar: - * Send a single character to the serial port - ********************************************************************************* - */ - -void serialPutchar (const int fd, const unsigned char c) -{ - write (fd, &c, 1) ; -} - - -/* - * serialPuts: - * Send a string to the serial port - ********************************************************************************* - */ - -void serialPuts (const int fd, const char *s) -{ - write (fd, s, strlen (s)) ; -} - -/* - * serialPrintf: - * Printf over Serial - ********************************************************************************* - */ - -void serialPrintf (const int fd, const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - serialPuts (fd, buffer) ; -} - - -/* - * serialDataAvail: - * Return the number of bytes of data avalable to be read in the serial port - ********************************************************************************* - */ - -int serialDataAvail (const int fd) -{ - int result ; - - if (ioctl (fd, FIONREAD, &result) == -1) - return -1 ; - - return result ; -} - - -/* - * serialGetchar: - * Get a single character from the serial device. - * Note: Zero is a valid character and this function will time-out after - * 10 seconds. - ********************************************************************************* - */ - -int serialGetchar (const int fd) -{ - uint8_t x ; - - if (read (fd, &x, 1) != 1) - return -1 ; - - return ((int)x) & 0xFF ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringSerial.h b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringSerial.h deleted file mode 100644 index 430dc7311..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringSerial.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * wiringSerial.h: - * Handle a serial port - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#ifdef __cplusplus -extern "C" { -#endif - -extern int serialOpen (const char *device, const int baud) ; -extern void serialClose (const int fd) ; -extern void serialFlush (const int fd) ; -extern void serialPutchar (const int fd, const unsigned char c) ; -extern void serialPuts (const int fd, const char *s) ; -extern void serialPrintf (const int fd, const char *message, ...) ; -extern int serialDataAvail (const int fd) ; -extern int serialGetchar (const int fd) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringShift.c b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringShift.c deleted file mode 100644 index 3df94e8ae..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringShift.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * wiringShift.c: - * Emulate some of the Arduino wiring functionality. - * - * Copyright (c) 2009-2012 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include - -#include "wiringPi.h" -#include "wiringShift.h" - -/* - * shiftIn: - * Shift data in from a clocked source - ********************************************************************************* - */ - -uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) -{ - uint8_t value = 0 ; - int8_t i ; - - if (order == MSBFIRST) - for (i = 7 ; i >= 0 ; --i) - { - digitalWrite (cPin, HIGH) ; - value |= digitalRead (dPin) << i ; - digitalWrite (cPin, LOW) ; - } - else - for (i = 0 ; i < 8 ; ++i) - { - digitalWrite (cPin, HIGH) ; - value |= digitalRead (dPin) << i ; - digitalWrite (cPin, LOW) ; - } - - return value; -} - -/* - * shiftOut: - * Shift data out to a clocked source - ********************************************************************************* - */ - -void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) -{ - int8_t i; - - if (order == MSBFIRST) - for (i = 7 ; i >= 0 ; --i) - { - digitalWrite (dPin, val & (1 << i)) ; - digitalWrite (cPin, HIGH) ; - digitalWrite (cPin, LOW) ; - } - else - for (i = 0 ; i < 8 ; ++i) - { - digitalWrite (dPin, val & (1 << i)) ; - digitalWrite (cPin, HIGH) ; - digitalWrite (cPin, LOW) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringShift.h b/other/wiringpi/wiringPi-96344ff/wiringPi/wiringShift.h deleted file mode 100644 index 419ade411..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wiringShift.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * wiringShift.h: - * Emulate some of the Arduino wiring functionality. - * - * Copyright (c) 2009-2012 Gordon Henderson. - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#define LSBFIRST 0 -#define MSBFIRST 1 - -#ifndef _STDINT_H -# include -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -extern uint8_t shiftIn (uint8_t dPin, uint8_t cPin, uint8_t order) ; -extern void shiftOut (uint8_t dPin, uint8_t cPin, uint8_t order, uint8_t val) ; - -#ifdef __cplusplus -} -#endif diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wpiExtensions.c b/other/wiringpi/wiringPi-96344ff/wiringPi/wpiExtensions.c deleted file mode 100644 index 53fafc0d5..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wpiExtensions.c +++ /dev/null @@ -1,928 +0,0 @@ -/* - * extensions.c: - * Originally part of the GPIO program to test, peek, poke and otherwise - * noodle with the GPIO hardware on the Raspberry Pi. - * Now used as a general purpose library to allow systems to dynamically - * add in new devices into wiringPi at program run-time. - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "mcp23008.h" -#include "mcp23016.h" -#include "mcp23017.h" -#include "mcp23s08.h" -#include "mcp23s17.h" -#include "sr595.h" -#include "pcf8574.h" -#include "pcf8591.h" -#include "mcp3002.h" -#include "mcp3004.h" -#include "mcp4802.h" -#include "mcp3422.h" -#include "max31855.h" -#include "max5322.h" -#include "ads1115.h" -#include "sn3218.h" -#include "drcSerial.h" -#include "drcNet.h" -#include "../wiringPiD/drcNetCmd.h" -#include "pseudoPins.h" -#include "bmp180.h" -#include "htu21d.h" -#include "ds18b20.h" -#include "rht03.h" - -#include "wpiExtensions.h" - -extern int wiringPiDebug ; - -static int verbose ; -static char errorMessage [1024] ; - - -// Local structure to hold details - -struct extensionFunctionStruct -{ - const char *name ; - int (*function)(char *progName, int pinBase, char *params) ; -} ; - - -/* - * verbError: - * Convenient error handling - ********************************************************************************* - */ - -static void verbError (const char *message, ...) -{ - va_list argp ; - va_start (argp, message) ; - vsnprintf (errorMessage, 1023, message, argp) ; - va_end (argp) ; - - if (verbose) - fprintf (stderr, "%s\n", errorMessage) ; -} - - -/* - * extractInt: - * Check & return an integer at the given location (prefixed by a :) - ********************************************************************************* - */ - -static char *extractInt (char *progName, char *p, int *num) -{ - if (*p != ':') - { - verbError ("%s: colon expected", progName) ; - return NULL ; - } - - ++p ; - - if (!isdigit (*p)) - { - verbError ("%s: digit expected", progName) ; - return NULL ; - } - - *num = strtol (p, NULL, 0) ; - -// Increment p, but we need to check for hex 0x - - if ((*p == '0') && (*(p + 1) == 'x')) - p +=2 ; - - while (isxdigit (*p)) - ++p ; - - return p ; -} - - -/* - * extractStr: - * Check & return a string at the given location (prefixed by a :) - * Note: The string can be enclosed in []'s to escape colons. This is - * so we can handle IPv6 addresses which contain colons and the []'s is - * a common way to prepresent them. - ********************************************************************************* - */ - -static char *extractStr (char *progName, char *p, char **str) -{ - char *q, *r ; - int quoted = FALSE ; - - if (*p != ':') - { - verbError ("%s: colon expected", progName) ; - return NULL ; - } - - ++p ; - - if (*p == '[') - { - quoted = TRUE ; - ++p ; - } - - if (!isprint (*p)) // Is this needed? - { - verbError ("%s: character expected", progName) ; - return NULL ; - } - - q = p ; - if (quoted) - { - while ((*q != 0) && (*q != ']')) - ++q ; - } - else - { - while ((*q != 0) && (*q != ':')) - ++q ; - } - - *str = r = calloc (q - p + 2, 1) ; // Zeros it - - while (p != q) - *r++ = *p++ ; - - if (quoted) // Skip over the ] to the : - ++p ; - - return p ; -} - - - -/* - * doExtensionMcp23008: - * MCP23008 - 8-bit I2C GPIO expansion chip - * mcp23002:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionMcp23008 (char *progName, int pinBase, char *params) -{ - int i2c ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x01) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - mcp23008Setup (pinBase, i2c) ; - - return TRUE ; -} - - -/* - * doExtensionMcp23016: - * MCP230016- 16-bit I2C GPIO expansion chip - * mcp23016:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionMcp23016 (char *progName, int pinBase, char *params) -{ - int i2c ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x03) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - mcp23016Setup (pinBase, i2c) ; - - return TRUE ; -} - - -/* - * doExtensionMcp23017: - * MCP230017- 16-bit I2C GPIO expansion chip - * mcp23017:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionMcp23017 (char *progName, int pinBase, char *params) -{ - int i2c ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x03) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - mcp23017Setup (pinBase, i2c) ; - - return TRUE ; -} - - -/* - * doExtensionMcp23s08: - * MCP23s08 - 8-bit SPI GPIO expansion chip - * mcp23s08:base:spi:port - ********************************************************************************* - */ - -static int doExtensionMcp23s08 (char *progName, int pinBase, char *params) -{ - int spi, port ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI address (%d) out of range", progName, spi) ; - return FALSE ; - } - - if ((params = extractInt (progName, params, &port)) == NULL) - return FALSE ; - - if ((port < 0) || (port > 7)) - { - verbError ("%s: port address (%d) out of range", progName, port) ; - return FALSE ; - } - - mcp23s08Setup (pinBase, spi, port) ; - - return TRUE ; -} - - -/* - * doExtensionMcp23s17: - * MCP23s17 - 16-bit SPI GPIO expansion chip - * mcp23s17:base:spi:port - ********************************************************************************* - */ - -static int doExtensionMcp23s17 (char *progName, int pinBase, char *params) -{ - int spi, port ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI address (%d) out of range", progName, spi) ; - return FALSE ; - } - - if ((params = extractInt (progName, params, &port)) == NULL) - return FALSE ; - - if ((port < 0) || (port > 7)) - { - verbError ("%s: port address (%d) out of range", progName, port) ; - return FALSE ; - } - - mcp23s17Setup (pinBase, spi, port) ; - - return TRUE ; -} - - -/* - * doExtensionSr595: - * Shift Register 74x595 - * sr595:base:pins:data:clock:latch - ********************************************************************************* - */ - -static int doExtensionSr595 (char *progName, int pinBase, char *params) -{ - int pins, data, clock, latch ; - -// Extract pins - - if ((params = extractInt (progName, params, &pins)) == NULL) - return FALSE ; - - if ((pins < 8) || (pins > 32)) - { - verbError ("%s: pin count (%d) out of range - 8-32 expected.", progName, pins) ; - return FALSE ; - } - - if ((params = extractInt (progName, params, &data)) == NULL) - return FALSE ; - - if ((params = extractInt (progName, params, &clock)) == NULL) - return FALSE ; - - if ((params = extractInt (progName, params, &latch)) == NULL) - return FALSE ; - - sr595Setup (pinBase, pins, data, clock, latch) ; - - return TRUE ; -} - - -/* - * doExtensionPcf8574: - * Digital IO (Crude!) - * pcf8574:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionPcf8574 (char *progName, int pinBase, char *params) -{ - int i2c ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x03) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - pcf8574Setup (pinBase, i2c) ; - - return TRUE ; -} - - -/* - * doExtensionAds1115: - * Analog Input - * ads1115:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionAds1115 (char *progName, int pinBase, char *params) -{ - int i2c ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x03) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - ads1115Setup (pinBase, i2c) ; - - return TRUE ; -} - - -/* - * doExtensionPcf8591: - * Analog IO - * pcf8591:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionPcf8591 (char *progName, int pinBase, char *params) -{ - int i2c ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x03) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - pcf8591Setup (pinBase, i2c) ; - - return TRUE ; -} - - -/* - * doExtensionPseudoPins: - * 64 Memory resident pseudo pins - * pseudoPins:base - ********************************************************************************* - */ - -static int doExtensionPseudoPins (UNU char *progName, int pinBase, UNU char *params) -{ - pseudoPinsSetup (pinBase) ; - - return TRUE ; -} - - -/* - * doExtensionBmp180: - * Analog Temp + Pressure - * bmp180:base - ********************************************************************************* - */ - -static int doExtensionBmp180 (UNU char *progName, int pinBase, UNU char *params) -{ - bmp180Setup (pinBase) ; - - return TRUE ; -} - - -/* - * doExtensionHtu21d: - * Analog humidity + Pressure - * htu21d:base - ********************************************************************************* - */ - -static int doExtensionHtu21d (UNU char *progName, int pinBase, UNU char *params) -{ - htu21dSetup (pinBase) ; - - return TRUE ; -} - - -/* - * doExtensionDs18b20: - * 1-Wire Temperature - * htu21d:base:serialNum - ********************************************************************************* - */ - -static int doExtensionDs18b20 (char *progName, int pinBase, char *params) -{ - char *serialNum ; - - if ((params = extractStr (progName, params, &serialNum)) == NULL) - return FALSE ; - - return ds18b20Setup (pinBase, serialNum) ; -} - - -/* - * doExtensionRht03: - * Maxdetect 1-Wire Temperature & Humidity - * rht03:base:piPin - ********************************************************************************* - */ - -static int doExtensionRht03 (char *progName, int pinBase, char *params) -{ - int piPin ; - - if ((params = extractInt (progName, params, &piPin)) == NULL) - return FALSE ; - - return rht03Setup (pinBase, piPin) ; -} - - -/* - * doExtensionMax31855: - * Analog IO - * max31855:base:spiChan - ********************************************************************************* - */ - -static int doExtensionMax31855 (char *progName, int pinBase, char *params) -{ - int spi ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; - } - - max31855Setup (pinBase, spi) ; - - return TRUE ; -} - - -/* - * doExtensionMcp3002: - * Analog IO - * mcp3002:base:spiChan - ********************************************************************************* - */ - -static int doExtensionMcp3002 (char *progName, int pinBase, char *params) -{ - int spi ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; - } - - mcp3002Setup (pinBase, spi) ; - - return TRUE ; -} - - -/* - * doExtensionMcp3004: - * Analog IO - * mcp3004:base:spiChan - ********************************************************************************* - */ - -static int doExtensionMcp3004 (char *progName, int pinBase, char *params) -{ - int spi ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; - } - - mcp3004Setup (pinBase, spi) ; - - return TRUE ; -} - - -/* - * doExtensionMax5322: - * Analog O - * max5322:base:spiChan - ********************************************************************************* - */ - -static int doExtensionMax5322 (char *progName, int pinBase, char *params) -{ - int spi ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; - } - - max5322Setup (pinBase, spi) ; - - return TRUE ; -} - - -/* - * doExtensionMcp4802: - * Analog IO - * mcp4802:base:spiChan - ********************************************************************************* - */ - -static int doExtensionMcp4802 (char *progName, int pinBase, char *params) -{ - int spi ; - - if ((params = extractInt (progName, params, &spi)) == NULL) - return FALSE ; - - if ((spi < 0) || (spi > 1)) - { - verbError ("%s: SPI channel (%d) out of range", progName, spi) ; - return FALSE ; - } - - mcp4802Setup (pinBase, spi) ; - - return TRUE ; -} - - -/* - * doExtensionSn3218: - * Analog Output (LED Driver) - * sn3218:base - ********************************************************************************* - */ - -static int doExtensionSn3218 (UNU char *progName, int pinBase, UNU char *params) -{ - sn3218Setup (pinBase) ; - return TRUE ; -} - - -/* - * doExtensionMcp3422: - * Analog IO - * mcp3422:base:i2cAddr - ********************************************************************************* - */ - -static int doExtensionMcp3422 (char *progName, int pinBase, char *params) -{ - int i2c, sampleRate, gain ; - - if ((params = extractInt (progName, params, &i2c)) == NULL) - return FALSE ; - - if ((i2c < 0x03) || (i2c > 0x77)) - { - verbError ("%s: i2c address (0x%X) out of range", progName, i2c) ; - return FALSE ; - } - - if ((params = extractInt (progName, params, &sampleRate)) == NULL) - return FALSE ; - - if ((sampleRate < 0) || (sampleRate > 3)) - { - verbError ("%s: sample rate (%d) out of range", progName, sampleRate) ; - return FALSE ; - } - - if ((params = extractInt (progName, params, &gain)) == NULL) - return FALSE ; - - if ((gain < 0) || (gain > 3)) - { - verbError ("%s: gain (%d) out of range", progName, gain) ; - return FALSE ; - } - - mcp3422Setup (pinBase, i2c, sampleRate, gain) ; - - return TRUE ; -} - - -/* - * doExtensionDrcS: - * Interface to a DRC Serial system - * drcs:base:pins:serialPort:baud - ********************************************************************************* - */ - -static int doExtensionDrcS (char *progName, int pinBase, char *params) -{ - char *port ; - int pins, baud ; - - if ((params = extractInt (progName, params, &pins)) == NULL) - return FALSE ; - - if ((pins < 1) || (pins > 1000)) - { - verbError ("%s: pins (%d) out of range (2-1000)", progName, pins) ; - return FALSE ; - } - - if ((params = extractStr (progName, params, &port)) == NULL) - return FALSE ; - - if (strlen (port) == 0) - { - verbError ("%s: serial port device name required", progName) ; - return FALSE ; - } - - if ((params = extractInt (progName, params, &baud)) == NULL) - return FALSE ; - - if ((baud < 1) || (baud > 4000000)) - { - verbError ("%s: baud rate (%d) out of range", progName, baud) ; - return FALSE ; - } - - drcSetupSerial (pinBase, pins, port, baud) ; - - return TRUE ; -} - - -/* - * doExtensionDrcNet: - * Interface to a DRC Network system - * drcn:base:pins:ipAddress:port:password - ********************************************************************************* - */ - -static int doExtensionDrcNet (char *progName, int pinBase, char *params) -{ - int pins ; - char *ipAddress, *port, *password ; - char pPort [1024] ; - - if ((params = extractInt (progName, params, &pins)) == NULL) - return FALSE ; - - if ((pins < 1) || (pins > 1000)) - { - verbError ("%s: pins (%d) out of range (2-1000)", progName, pins) ; - return FALSE ; - } - - if ((params = extractStr (progName, params, &ipAddress)) == NULL) - return FALSE ; - - if (strlen (ipAddress) == 0) - { - verbError ("%s: ipAddress required", progName) ; - return FALSE ; - } - - if ((params = extractStr (progName, params, &port)) == NULL) - return FALSE ; - - if (strlen (port) == 0) - { - sprintf (pPort, "%d", DEFAULT_SERVER_PORT) ; - port = pPort ; - } - - if ((params = extractStr (progName, params, &password)) == NULL) - return FALSE ; - - if (strlen (password) == 0) - { - verbError ("%s: password required", progName) ; - return FALSE ; - } - - return drcSetupNet (pinBase, pins, ipAddress, port, password) ; -} - - - -/* - * Function list - ********************************************************************************* - */ - -static struct extensionFunctionStruct extensionFunctions [] = -{ - { "mcp23008", &doExtensionMcp23008 }, - { "mcp23016", &doExtensionMcp23016 }, - { "mcp23017", &doExtensionMcp23017 }, - { "mcp23s08", &doExtensionMcp23s08 }, - { "mcp23s17", &doExtensionMcp23s17 }, - { "sr595", &doExtensionSr595 }, - { "pcf8574", &doExtensionPcf8574 }, - { "pcf8591", &doExtensionPcf8591 }, - { "bmp180", &doExtensionBmp180 }, - { "pseudoPins", &doExtensionPseudoPins }, - { "htu21d", &doExtensionHtu21d }, - { "ds18b20", &doExtensionDs18b20 }, - { "rht03", &doExtensionRht03 }, - { "mcp3002", &doExtensionMcp3002 }, - { "mcp3004", &doExtensionMcp3004 }, - { "mcp4802", &doExtensionMcp4802 }, - { "mcp3422", &doExtensionMcp3422 }, - { "max31855", &doExtensionMax31855 }, - { "ads1115", &doExtensionAds1115 }, - { "max5322", &doExtensionMax5322 }, - { "sn3218", &doExtensionSn3218 }, - { "drcs", &doExtensionDrcS }, - { "drcn", &doExtensionDrcNet }, - { NULL, NULL }, -} ; - - -/* - * loadWPiExtension: - * Load in a wiringPi extension - * The extensionData always starts with the name, a colon then the pinBase - * number. Other parameters after that are decoded by the module in question. - ********************************************************************************* - */ - -int loadWPiExtension (char *progName, char *extensionData, int printErrors) -{ - char *p ; - char *extension = extensionData ; - struct extensionFunctionStruct *extensionFn ; - unsigned pinBase = 0 ; - - verbose = printErrors ; - -// Get the extension name by finding the first colon - - p = extension ; - while (*p != ':') - { - if (!*p) // ran out of characters - { - verbError ("%s: extension name not terminated by a colon", progName) ; - return FALSE ; - } - ++p ; - } - *p++ = 0 ; - -// Simple ATOI code - - if (!isdigit (*p)) - { - verbError ("%s: decimal pinBase number expected after extension name", progName) ; - return FALSE ; - } - - while (isdigit (*p)) - { - if (pinBase > 2147483647) // 2^31-1 ... Lets be realistic here... - { - verbError ("%s: pinBase too large", progName) ; - return FALSE ; - } - - pinBase = pinBase * 10 + (*p - '0') ; - ++p ; - } - - if (pinBase < 64) - { - verbError ("%s: pinBase (%d) too small. Minimum is 64.", progName, pinBase) ; - return FALSE ; - } - -// Search for extensions: - - for (extensionFn = extensionFunctions ; extensionFn->name != NULL ; ++extensionFn) - { - if (strcmp (extensionFn->name, extension) == 0) - return extensionFn->function (progName, pinBase, p) ; - } - - fprintf (stderr, "%s: extension %s not found", progName, extension) ; - return FALSE ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPi/wpiExtensions.h b/other/wiringpi/wiringPi-96344ff/wiringPi/wpiExtensions.h deleted file mode 100644 index fcaec96e4..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPi/wpiExtensions.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * extensions.h: - * Part of the GPIO program to test, peek, poke and otherwise - * noodle with the GPIO hardware on the Raspberry Pi. - * Copyright (c) 2012-2015 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - - -extern int loadWPiExtension (char *progName, char *extensionData, int verbose) ; diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/Makefile b/other/wiringpi/wiringPi-96344ff/wiringPiD/Makefile deleted file mode 100644 index 6b2cc9e37..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/Makefile +++ /dev/null @@ -1,100 +0,0 @@ -# -# Makefile: -# The wiringPiD utility: -# https://projects.drogon.net/wiring-pi -# -# Copyright (c) 2012-2017 Gordon Henderson -################################################################################# -# This file is part of wiringPi: -# A "wiring" library for the Raspberry Pi -# -# wiringPi is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# wiringPi 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 Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with wiringPi. If not, see . -################################################################################# - -DESTDIR?=/usr -PREFIX?=/local - -ifneq ($V,1) -Q ?= @ -endif - -#DEBUG = -g -O0 -DEBUG = -O2 -CC = gcc -INCLUDE = -I$(DESTDIR)$(PREFIX)/include -CFLAGS = $(DEBUG) -Wall -Wextra $(INCLUDE) -Winline -pipe - -LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib -LIBS = -lwiringPi -lwiringPiDev -lpthread -lrt -lm -lcrypt - -# May not need to alter anything below this line -############################################################################### - -SRC = wiringpid.c network.c runRemote.c daemonise.c - -OBJ = $(SRC:.c=.o) - -all: wiringpid - -wiringpid: $(OBJ) - $Q echo [Link] - $Q $(CC) -o $@ $(OBJ) $(LDFLAGS) $(LIBS) - -.c.o: - $Q echo [Compile] $< - $Q $(CC) -c $(CFLAGS) $< -o $@ - -.PHONY: clean -clean: - $Q echo "[Clean]" - $Q rm -f $(OBJ) wiringpid *~ core tags *.bak - -.PHONY: tags -tags: $(SRC) - $Q echo [ctags] - $Q ctags $(SRC) - -.PHONY: install -install: wiringpid - $Q echo "[Install]" - $Q mkdir -p $(DESTDIR)$(PREFIX)/sbin - $Q cp wiringpid $(DESTDIR)$(PREFIX)/sbin - $Q chown root.root $(DESTDIR)$(PREFIX)/sbin/wiringpid - -# $Q mkdir -p $(DESTDIR)$(PREFIX)/man/man8 -# $Q cp gpio.1 $(DESTDIR)$(PREFIX)/man/man8 - -.PHONY: install-deb -install-deb: gpio - $Q echo "[Install: deb]" - $Q install -m 0755 -d ~/wiringPi/debian-template/wiringPi/usr/bin - $Q install -m 0755 gpio ~/wiringPi/debian-template/wiringPi/usr/bin - $Q install -m 0755 -d ~/wiringPi/debian-template/wiringPi/man/man1 - $Q install -m 0644 gpio.1 ~/wiringPi/debian-template/wiringPi/man/man1 - -.PHONY: uninstall -uninstall: - $Q echo "[UnInstall]" - $Q rm -f $(DESTDIR)$(PREFIX)/sbin/wiringpid - $Q rm -f $(DESTDIR)$(PREFIX)/man/man8/wiringpid.8 - -.PHONY: depend -depend: - makedepend -Y $(SRC) -# DO NOT DELETE - -wiringpid.o: drcNetCmd.h network.h runRemote.h daemonise.h -network.o: network.h -runRemote.o: drcNetCmd.h network.h runRemote.h -daemonise.o: daemonise.h diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/daemonise.c b/other/wiringpi/wiringPi-96344ff/wiringPiD/daemonise.c deleted file mode 100644 index 134a6bb04..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/daemonise.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * daemonise.c: - * Fairly generic "Turn the current process into a daemon" code. - * - * Copyright (c) 2016-2017 Gordon Henderson. - ********************************************************************************* - */ - -#include -#include -#include -#include -#include -#include - -#include "daemonise.h" - -void daemonise (const char *pidFile) -{ - pid_t pid ; - int i ; - FILE *fd ; - - syslog (LOG_DAEMON | LOG_INFO, "Becoming daemon") ; - -// Fork from the parent - - if ((pid = fork ()) < 0) - { - syslog (LOG_DAEMON | LOG_ALERT, "Fork no. 1 failed: %m") ; - exit (EXIT_FAILURE) ; - } - - if (pid > 0) // Parent - terminate - exit (EXIT_SUCCESS) ; - -// Now running on the child - become session leader - - if (setsid() < 0) - { - syslog (LOG_DAEMON | LOG_ALERT, "setsid failed: %m") ; - exit (EXIT_FAILURE) ; - } - -// Ignore a few signals - - signal (SIGCHLD, SIG_IGN) ; - signal (SIGHUP, SIG_IGN) ; - -// Fork again - - if ((pid = fork ()) < 0) - { - syslog (LOG_DAEMON | LOG_ALERT, "Fork no. 2 failed: %m") ; - exit (EXIT_FAILURE) ; - } - - if (pid > 0) // parent - terminate - exit (EXIT_SUCCESS) ; - -// Tidying up - reset umask, change to / and close all files - - umask (0) ; - chdir ("/") ; - - for (i = 0 ; i < sysconf (_SC_OPEN_MAX) ; ++i) - close (i) ; - -// Write PID into /var/run - - if (pidFile != NULL) - { - if ((fd = fopen (pidFile, "w")) == NULL) - { - syslog (LOG_DAEMON | LOG_ALERT, "Unable to write PID file: %m") ; - exit (EXIT_FAILURE) ; - } - - fprintf (fd, "%d\n", getpid ()) ; - fclose (fd) ; - } -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/daemonise.h b/other/wiringpi/wiringPi-96344ff/wiringPiD/daemonise.h deleted file mode 100644 index 8d13319f3..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/daemonise.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * daemonise.h: - * Fairly generic "Turn the current process into a daemon" code. - * - * Copyright (c) 2016-2017 Gordon Henderson. - ********************************************************************************* - */ - -extern void daemonise (const char *pidFile) ; diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/drcNetCmd.h b/other/wiringpi/wiringPi-96344ff/wiringPiD/drcNetCmd.h deleted file mode 100644 index 23f7dc1da..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/drcNetCmd.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * drcNetCmd.c: - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#define DEFAULT_SERVER_PORT 6124 - -#define DRCN_PIN_MODE 1 -#define DRCN_PULL_UP_DN 2 - -#define DRCN_DIGITAL_WRITE 3 -#define DRCN_DIGITAL_WRITE8 4 -#define DRCN_ANALOG_WRITE 5 -#define DRCN_PWM_WRITE 6 - -#define DRCN_DIGITAL_READ 7 -#define DRCN_DIGITAL_READ8 8 -#define DRCN_ANALOG_READ 9 - - -struct drcNetComStruct -{ - uint32_t pin ; - uint32_t cmd ; - uint32_t data ; -} comDat ; - diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/network.c b/other/wiringpi/wiringPi-96344ff/wiringPiD/network.c deleted file mode 100644 index 9f6bb882b..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/network.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * network.c: - * Part of wiringPiD - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "network.h" - -#define TRUE (1==1) -#define FALSE (!TRUE) - -// Local data - -#define SALT_LEN 16 - -static char salt [SALT_LEN + 1] ; -static char *returnedHash = NULL ; -static int serverFd = -1 ; - -// Union for the server Socket Address - -static union -{ - struct sockaddr_in sin ; - struct sockaddr_in6 sin6 ; -} serverSockAddr ; - -// and client address - -static union -{ - struct sockaddr_in sin ; - struct sockaddr_in6 sin6 ; -} clientSockAddr ; - - -/* - * getClientIP: - * Returns a pointer to a static string containing the clients IP address - ********************************************************************************* - */ - -char *getClientIP (void) -{ - char buf [INET6_ADDRSTRLEN] ; - static char ipAddress [1024] ; - - if (clientSockAddr.sin.sin_family == AF_INET) // IPv4 - { - if (snprintf (ipAddress, 1024, "IPv4: %s", - inet_ntop (clientSockAddr.sin.sin_family, (void *)&clientSockAddr.sin.sin_addr, buf, sizeof (buf))) == 1024) - strcpy (ipAddress, "Too long") ; - } - else // IPv6 - { - if (clientSockAddr.sin.sin_family == AF_INET6 && IN6_IS_ADDR_V4MAPPED (&clientSockAddr.sin6.sin6_addr)) - { - if (snprintf (ipAddress, 1024, "IPv4in6: %s", - inet_ntop (clientSockAddr.sin.sin_family, (char *)&clientSockAddr.sin6.sin6_addr, buf, sizeof(buf))) == 1024) - strcpy (ipAddress, "Too long") ; - } - else - { - if (snprintf (ipAddress, 1024, "IPv6: %s", - inet_ntop (clientSockAddr.sin.sin_family, (char *)&clientSockAddr.sin6.sin6_addr, buf, sizeof(buf))) == 1024) - strcpy (ipAddress, "Too long") ; - } - } - - return ipAddress ; -} - - - -/* - * clientPstr: clientPrintf: - * Print over a network socket - ********************************************************************************* - */ - -static int clientPstr (int fd, char *s) -{ - int len = strlen (s) ; - return (write (fd, s, len) == len) ? 0 : -1 ; -} - -static int clientPrintf (const int fd, const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - return clientPstr (fd, buffer) ; -} - - -/* - * sendGreeting: - * Send some text to the client device - ********************************************************************************* - */ - -int sendGreeting (int clientFd) -{ - if (clientPrintf (clientFd, "200 Welcome to wiringPiD - http://wiringpi.com/\n") < 0) - return -1 ; - - return clientPrintf (clientFd, "200 Connecting from: %s\n", getClientIP ()) ; -} - - -/* - * getSalt: - * Create a random 'salt' value for the password encryption process - ********************************************************************************* - */ - -static int getSalt (char drySalt []) -{ - static const char *seaDog = "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789/." ; - - unsigned char wetSalt [SALT_LEN] ; - int i, fd ; - - if ((fd = open ("/dev/urandom", O_RDONLY)) < 0) - return fd ; - - if (read (fd, wetSalt, SALT_LEN) != SALT_LEN) - return -1 ; - - close (fd) ; - - for (i = 0 ; i < SALT_LEN ; ++i) - drySalt [i] = seaDog [wetSalt [i] & 63] ; - - drySalt [SALT_LEN] = 0 ; - - return 0 ; -} - - -/* - * sendChallenge: - * Create and send our salt (aka nonce) to the remote device - ********************************************************************************* - */ - -int sendChallenge (int clientFd) -{ - if (getSalt (salt) < 0) - return -1 ; - - return clientPrintf (clientFd, "Challenge %s\n", salt) ; -} - - -/* - * getResponse: - * Read the encrypted password from the remote device. - ********************************************************************************* - */ - - -int getResponse (int clientFd) -{ - char reply [1024] ; - int len ; - -// Being sort of lazy about this. I'm expecting an SHA-512 hash back and these -// are exactly 86 characters long, so no reason not to, I guess... - - len = 86 ; - - if (setsockopt (clientFd, SOL_SOCKET, SO_RCVLOWAT, (void *)&len, sizeof (len)) < 0) - return -1 ; - - len = recv (clientFd, reply, 86, 0) ; - if (len != 86) - return -1 ; - - reply [len] = 0 ; - - if ((returnedHash = malloc (len + 1)) == NULL) - return -1 ; - - strcpy (returnedHash, reply) ; - - return 0 ; -} - - -/* - * passwordMatch: - * See if there's a match. If not, we simply dump them. - ********************************************************************************* - */ - -int passwordMatch (const char *password) -{ - char *encrypted ; - char salted [1024] ; - - sprintf (salted, "$6$%s$", salt) ; - - encrypted = crypt (password, salted) ; - -// 20: $6$ then 16 characters of salt, then $ -// 86 is the length of an SHA-512 hash - - return strncmp (encrypted + 20, returnedHash, 86) == 0 ; -} - - -/* - * setupServer: - * Do what's needed to create a local server socket instance that can listen - * on both IPv4 and IPv6 interfaces. - ********************************************************************************* - */ - -int setupServer (int serverPort) -{ - socklen_t clientSockAddrSize = sizeof (clientSockAddr) ; - - int on = 1 ; - int family ; - socklen_t serverSockAddrSize ; - int clientFd ; - -// Try to create an IPv6 socket - - serverFd = socket (PF_INET6, SOCK_STREAM, 0) ; - -// If it didn't work, then fall-back to IPv4. - - if (serverFd < 0) - { - if ((serverFd = socket (PF_INET, SOCK_STREAM, 0)) < 0) - return -1 ; - - family = AF_INET ; - serverSockAddrSize = sizeof (struct sockaddr_in) ; - } - else // We got an IPv6 socket - { - family = AF_INET6 ; - serverSockAddrSize = sizeof (struct sockaddr_in6) ; - } - - if (setsockopt (serverFd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) < 0) - return -1 ; - -// Setup the servers socket address - cope with IPv4 and v6. - - memset (&serverSockAddr, 0, sizeof (serverSockAddr)) ; - switch (family) - { - case AF_INET: - serverSockAddr.sin.sin_family = AF_INET ; - serverSockAddr.sin.sin_addr.s_addr = htonl (INADDR_ANY) ; - serverSockAddr.sin.sin_port = htons (serverPort) ; - break; - - case AF_INET6: - serverSockAddr.sin6.sin6_family = AF_INET6 ; - serverSockAddr.sin6.sin6_addr = in6addr_any ; - serverSockAddr.sin6.sin6_port = htons (serverPort) ; - } - -// Bind, listen and accept - - if (bind (serverFd, (struct sockaddr *)&serverSockAddr, serverSockAddrSize) < 0) - return -1 ; - - if (listen (serverFd, 4) < 0) // Really only going to talk to one client at a time... - return -1 ; - - if ((clientFd = accept (serverFd, (struct sockaddr *)&clientSockAddr, &clientSockAddrSize)) < 0) - return -1 ; - - return clientFd ; -} - - -/* - * closeServer: - ********************************************************************************* - */ - -void closeServer (int clientFd) -{ - if (serverFd != -1) close (serverFd) ; - if (clientFd != -1) close (clientFd) ; - serverFd = clientFd = -1 ; -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/network.h b/other/wiringpi/wiringPi-96344ff/wiringPiD/network.h deleted file mode 100644 index 94c3380d4..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/network.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * network.h: - * Part of wiringPiD - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -extern char *getClientIP (void) ; -extern int getResponce (int clientFd) ; -extern int setupServer (int serverPort) ; -extern int sendGreeting (int clientFd) ; -extern int sendChallenge (int clientFd) ; -extern int getResponse (int clientFd) ; -extern int passwordMatch (const char *password) ; -extern void closeServer (int clientFd) ; diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/runRemote.c b/other/wiringpi/wiringPi-96344ff/wiringPiD/runRemote.c deleted file mode 100644 index cd7432ba3..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/runRemote.c +++ /dev/null @@ -1,126 +0,0 @@ -/* - * runRemote.c: - * Run the remote commands passed over the network link. - * - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -//#include - -#include -#include - -#include "drcNetCmd.h" -#include "network.h" -#include "runRemote.h" - - - -int noLocalPins = FALSE ; - - -void runRemoteCommands (int fd) -{ - register uint32_t pin ; - int len ; - struct drcNetComStruct cmd ; - - len = sizeof (struct drcNetComStruct) ; - - if (setsockopt (fd, SOL_SOCKET, SO_RCVLOWAT, (void *)&len, sizeof (len)) < 0) - return ; - - for (;;) - { - if (recv (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) // Probably remote hangup - return ; - - pin = cmd.pin ; - if (noLocalPins && ((pin & PI_GPIO_MASK) == 0)) - { - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - continue ; - } - - switch (cmd.cmd) - { - case DRCN_PIN_MODE: - pinMode (pin, cmd.data) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_PULL_UP_DN: - pullUpDnControl (pin, cmd.data) ; - break ; - - case DRCN_PWM_WRITE: - pwmWrite (pin, cmd.data) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_DIGITAL_WRITE: - digitalWrite (pin, cmd.data) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_DIGITAL_WRITE8: - //digitalWrite8 (pin, cmd.data) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_DIGITAL_READ: - cmd.data = digitalRead (pin) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_DIGITAL_READ8: - //cmd.data = digitalRead8 (pin) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_ANALOG_WRITE: - analogWrite (pin, cmd.data) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - - case DRCN_ANALOG_READ: - cmd.data = analogRead (pin) ; - if (send (fd, &cmd, sizeof (cmd), 0) != sizeof (cmd)) - return ; - break ; - } - } - -} diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/runRemote.h b/other/wiringpi/wiringPi-96344ff/wiringPiD/runRemote.h deleted file mode 100644 index 57d50187d..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/runRemote.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * runRemote.h: - * Run the remote commands passed over the network link. - * - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -// Globals - -extern int noLocalPins ; - -extern void runRemoteCommands (int fd) ; diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/wiringpid b/other/wiringpi/wiringPi-96344ff/wiringPiD/wiringpid deleted file mode 100755 index b21232e76..000000000 Binary files a/other/wiringpi/wiringPi-96344ff/wiringPiD/wiringpid and /dev/null differ diff --git a/other/wiringpi/wiringPi-96344ff/wiringPiD/wiringpid.c b/other/wiringpi/wiringPi-96344ff/wiringPiD/wiringpid.c deleted file mode 100644 index 8dde1cdf4..000000000 --- a/other/wiringpi/wiringPi-96344ff/wiringPiD/wiringpid.c +++ /dev/null @@ -1,382 +0,0 @@ -/* - * wiringPiD.c: - * Copyright (c) 2012-2017 Gordon Henderson - *********************************************************************** - * This file is part of wiringPi: - * https://projects.drogon.net/raspberry-pi/wiringpi/ - * - * wiringPi is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * wiringPi 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with wiringPi. If not, see . - *********************************************************************** - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "drcNetCmd.h" -#include "network.h" -#include "runRemote.h" -#include "daemonise.h" - - -#define PIDFILE "/var/run/wiringPiD.pid" - - -// Globals - -static const char *usage = "[-h] [-d] [-g | -1 | -z] [[-x extension:pin:params] ...] password" ; -static int doDaemon = FALSE ; - -// - -static void logMsg (const char *message, ...) -{ - va_list argp ; - char buffer [1024] ; - - va_start (argp, message) ; - vsnprintf (buffer, 1023, message, argp) ; - va_end (argp) ; - - if (doDaemon) - syslog (LOG_DAEMON | LOG_INFO, "%s", buffer) ; - else - printf ("%s\n", buffer) ; -} - - -/* - * sigHandler: - * setupSigHandler: - * Somehing has happened that would normally terminate the program so try - * to close down nicely. - ********************************************************************************* - */ - -void sigHandler (int sig) -{ - logMsg ("Exiting on signal %d: %s", sig, strsignal (sig)) ; - (void)unlink (PIDFILE) ; - exit (EXIT_FAILURE) ; -} - -void setupSigHandler (void) -{ - struct sigaction action ; - - sigemptyset (&action.sa_mask) ; - action.sa_flags = 0 ; - -// Ignore what we can - - action.sa_handler = SIG_IGN ; - - sigaction (SIGHUP, &action, NULL) ; - sigaction (SIGTTIN, &action, NULL) ; - sigaction (SIGTTOU, &action, NULL) ; - -// Trap what we can to exit gracefully - - action.sa_handler = sigHandler ; - - sigaction (SIGINT, &action, NULL) ; - sigaction (SIGQUIT, &action, NULL) ; - sigaction (SIGILL, &action, NULL) ; - sigaction (SIGABRT, &action, NULL) ; - sigaction (SIGFPE, &action, NULL) ; - sigaction (SIGSEGV, &action, NULL) ; - sigaction (SIGPIPE, &action, NULL) ; - sigaction (SIGALRM, &action, NULL) ; - sigaction (SIGTERM, &action, NULL) ; - sigaction (SIGUSR1, &action, NULL) ; - sigaction (SIGUSR2, &action, NULL) ; - sigaction (SIGCHLD, &action, NULL) ; - sigaction (SIGTSTP, &action, NULL) ; - sigaction (SIGBUS, &action, NULL) ; -} - - -/* - * The works... - ********************************************************************************* - */ - -int main (int argc, char *argv []) -{ - int clientFd ; - char *p, *password ; - int i ; - int port = DEFAULT_SERVER_PORT ; - int wpiSetup = 0 ; - - if (argc < 2) - { - fprintf (stderr, "Usage: %s %s\n", argv [0], usage) ; - exit (EXIT_FAILURE) ; - } - -// Help? - - if (strcasecmp (argv [1], "-h") == 0) - { - printf ("Usage: %s %s\n", argv [0], usage) ; - return 0 ; - } - -// Daemonize? -// Must come before the other args as e.g. some extensions -// open files which get closed on daemonise... - - if (strcasecmp (argv [1], "-d") == 0) - { - if (geteuid () != 0) - { - fprintf (stderr, "%s: Must be root to run as a daemon.\n", argv [0]) ; - exit (EXIT_FAILURE) ; - } - - doDaemon = TRUE ; - daemonise (PIDFILE) ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - } - -// Scan all other arguments - - while (*argv [1] == '-') - { - -// Look for wiringPi setup arguments: -// Same as the gpio command and rtb. - -// -g - bcm_gpio - - if (strcasecmp (argv [1], "-g") == 0) - { - if (wpiSetup == 0) - { - logMsg ("BCM_GPIO mode selected") ; - wiringPiSetupGpio () ; - } - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - ++wpiSetup ; - continue ; - } - -// -1 - physical pins - - if (strcasecmp (argv [1], "-1") == 0) - { - if (wpiSetup == 0) - { - logMsg ("GPIO-PHYS mode selected") ; - wiringPiSetupPhys () ; - } - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - ++wpiSetup ; - continue ; - } - -// -z - no wiringPi - blocks remotes accessing local pins - - if (strcasecmp (argv [1], "-z") == 0) - { - if (wpiSetup == 0) - logMsg ("No GPIO mode selected") ; - - for (i = 2 ; i < argc ; ++i) - argv [i - 1] = argv [i] ; - --argc ; - noLocalPins = TRUE ; - ++wpiSetup ; - continue ; - } - -// -p to select the port - - if (strcasecmp (argv [1], "-p") == 0) - { - if (argc < 3) - { - logMsg ("-p missing extension port") ; - exit (EXIT_FAILURE) ; - } - - logMsg ("Setting port to: %s", argv [2]) ; - - port = atoi (argv [2]) ; - if ((port < 1) || (port > 65535)) - { - logMsg ("Invalid server port: %d", port) ; - exit (EXIT_FAILURE) ; - } - -// Shift args down by 2 - - for (i = 3 ; i < argc ; ++i) - argv [i - 2] = argv [i] ; - argc -= 2 ; - - continue ; - } - -// Check for -x argument to load in a new extension -// -x extension:base:args -// Can load many modules to extend the daemon. - - if (strcasecmp (argv [1], "-x") == 0) - { - if (argc < 3) - { - logMsg ("-x missing extension name:data:etc.") ; - exit (EXIT_FAILURE) ; - } - - logMsg ("Loading extension: %s", argv [2]) ; - - if (!loadWPiExtension (argv [0], argv [2], TRUE)) - { - logMsg ("Extension load failed: %s", strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - -// Shift args down by 2 - - for (i = 3 ; i < argc ; ++i) - argv [i - 2] = argv [i] ; - argc -= 2 ; - - continue ; - } - - logMsg ("Invalid parameter: %s", argv [1]) ; - exit (EXIT_FAILURE) ; - } - -// Default to wiringPi mode - - if (wpiSetup == 0) - { - logMsg ("WiringPi GPIO mode selected") ; - wiringPiSetup () ; - } - -// Finally, should just be one arg left - the password... - - if (argc != 2) - { - logMsg ("No password supplied") ; - exit (EXIT_FAILURE) ; - } - - if (strlen (argv [1]) < 6) - { - logMsg ("Password too short - at least 6 chars, not %d", strlen (argv [1])) ; - exit (EXIT_FAILURE) ; - } - - if ((password = malloc (strlen (argv [1]) + 1)) == NULL) - { - logMsg ("Out of memory") ; - exit (EXIT_FAILURE) ; - } - strcpy (password, argv [1]) ; - -// Wipe out the password on the command-line in a vague attempt to try to -// hide it from snoopers - - for (p = argv [1] ; *p ; ++p) - *p = ' ' ; - - setupSigHandler () ; - -// Enter our big loop - - for (;;) - { - - if (!doDaemon) - printf ("-=-\nWaiting for a new connection...\n") ; - - if ((clientFd = setupServer (port)) < 0) - { - logMsg ("Unable to setup server: %s", strerror (errno)) ; - exit (EXIT_FAILURE) ; - } - - logMsg ("New connection from: %s.", getClientIP ()) ; - - if (!doDaemon) - printf ("Sending Greeting.\n") ; - - if (sendGreeting (clientFd) < 0) - { - logMsg ("Unable to send greeting message: %s", strerror (errno)) ; - closeServer (clientFd) ; - continue ; - } - - if (!doDaemon) - printf ("Sending Challenge.\n") ; - - if (sendChallenge (clientFd) < 0) - { - logMsg ("Unable to send challenge message: %s", strerror (errno)) ; - closeServer (clientFd) ; - continue ; - } - - if (!doDaemon) - printf ("Waiting for response.\n") ; - - if (getResponse (clientFd) < 0) - { - logMsg ("Connection closed waiting for response: %s", strerror (errno)) ; - closeServer (clientFd) ; - continue ; - } - - if (!passwordMatch (password)) - { - logMsg ("Password failure") ; - closeServer (clientFd) ; - continue ; - } - - logMsg ("Password OK - Starting") ; - - runRemoteCommands (clientFd) ; - closeServer (clientFd) ; - } - - return 0 ; -} diff --git a/usr/lib/tmpfiles.d/mpd.conf b/usr/lib/tmpfiles.d/mpd.conf index b50a83d47..571fd47c0 100755 --- a/usr/lib/tmpfiles.d/mpd.conf +++ b/usr/lib/tmpfiles.d/mpd.conf @@ -1 +1 @@ -d /run/mpd 0755 mpd audio - \ No newline at end of file +d /run/mpd 0755 mpd audio - diff --git a/usr/share/alsa/alsa.conf.d/20-bluealsa-dmix.conf b/usr/share/alsa/alsa.conf.d/20-bluealsa-dmix.conf index a1975af49..17e8013a1 100755 --- a/usr/share/alsa/alsa.conf.d/20-bluealsa-dmix.conf +++ b/usr/share/alsa/alsa.conf.d/20-bluealsa-dmix.conf @@ -10,7 +10,7 @@ pcm.btaplay_dmix { pcm.plug_btaplay_dmix { type dmix ipc_key 321456 - slave { + slave { pcm { type hw card 0 diff --git a/var/local/www/db/moode-sqlite3.db.default b/var/local/www/db/moode-sqlite3.db.default index e4da260e6..c3c6ef954 100755 Binary files a/var/local/www/db/moode-sqlite3.db.default and b/var/local/www/db/moode-sqlite3.db.default differ diff --git a/var/local/www/header.php b/var/local/www/header.php index 61c805962..d7648be8a 100644 --- a/var/local/www/header.php +++ b/var/local/www/header.php @@ -20,6 +20,9 @@ * along with this program. If not, see . * * 2018-01-26 TC moOde 4.0 + * 2018-04-02 TC moOde 4.1 + * - minor cleanup + * - remove accumulated code * */ --> @@ -27,8 +30,9 @@ - moOde Player + + @@ -57,13 +61,11 @@