diff --git a/LICENSE b/LICENSE deleted file mode 100644 index e142a52..0000000 --- a/LICENSE +++ /dev/null @@ -1,625 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - -Version 3, 29 June 2007 - -Copyright © 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/OSC2MIDI.ino b/OSC2MIDI.ino deleted file mode 100644 index 88c3da4..0000000 --- a/OSC2MIDI.ino +++ /dev/null @@ -1,367 +0,0 @@ -// Use from 0 to 4. Higher number, more debugging messages and memory usage. -#define _WIFIMGR_LOGLEVEL_ 1 -#define DEBUG 1 - -#include -#include -#include -#include "debug.h" -#include -#include -#include -#include -#include -#include -#include "OSC2Midi.h" -#include -#include -#include -#include - -#define MDNS_NAME "osc2midi" -#define AP_SSID_NAME "OSC2MIDI" -#define AP_PASSWORD "osc2midi" -#define AP_SSID_CONFIG_NAME "OSC2MIDI-Config" -#define AP_CONFIG_PASSWORD "osc2midi" -#define SOFT_SERIAL_RX 18 -#define SOFT_SERIAL_TX 19 -#define AP_DATA_RESET_PIN 35 -#define AP_MODE_PIN 34 -#define LCD_I2C_ADDR 0x27 -#define LCD_COL 16 -#define LCD_ROW 2 -#define UDP_RECV_PORT 8000 -#define UDP_SEND_PORT 9000 -#define KRATE_MODE 200 -#define KRATE_STATE 2000 - -void OSCToMidiCC(OSCMessage &msg, int offset); -void MidiCCToOSC(uint8_t channel, uint8_t number, uint8_t value); -void change_midi_state(uint8_t midichannel, uint8_t cc, uint8_t value); -void show_midi_state(void); -void set_midi_state(void); -void check_mode(void); - -WiFiUDP udp; -IPAddress clientIP; -LiquidCrystal_I2C lcd(LCD_I2C_ADDR, LCD_COL, LCD_ROW); -HardwareSerial midi1(2); // RX: 16, TX: 17 -#ifndef D5 -#define D5 (SOFT_SERIAL_RX) -#define D6 (SOFT_SERIAL_TX) -//#define D7 (23) -//#define D8 (5) -//#define TX (1) -#endif -SoftwareSerial midi2; -bool ap_mode_state = digitalRead(AP_MODE_PIN); -int8_t state[16][128]; - -looper sched; - -MIDI_CREATE_INSTANCE(HardwareSerial, midi1, MIDI1); - -void setup() -{ - pinMode(AP_DATA_RESET_PIN, INPUT_PULLUP); - pinMode(AP_MODE_PIN, INPUT_PULLUP); - - Serial.begin(115200); - Serial.setDebugOutput(true); - Serial.println(F("OSC2MIDI (c)2020 H. Wirtz ")); - - lcd.init(); - lcd.backlight(); - lcd.clear(); - lcd.noCursor(); - lcd.setCursor(2, 0); - lcd.print(F("* OSC2MIDI *")); - lcd.setCursor(0, 1); - lcd.print(F("(c)parasiTstudio")); - delay(1000); - - if (ap_mode_state == LOW) - { - DEBUG_MSG("Mode Access-Point\n"); - - if (!WiFi.softAPConfig(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0))) { - DEBUG_MSG("AP Config Failed\n"); - } - - if (!WiFi.softAP(AP_SSID_NAME, AP_PASSWORD)) - { - DEBUG_MSG("Failed to start AP\n"); - lcd.print(F("Failed ")); - delay(1000); - lcd.print(F("- restart")); - delay(1000); - ESP.restart(); - } - - lcd.clear(); - lcd.setCursor(0, 0); - lcd.print(F("Mode AP")); - lcd.setCursor(0, 1); - lcd.print(WiFi.softAPIP()); - } - else - { - DEBUG_MSG("Mode Client\n"); - - WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP - - WiFiManager wm; - - if (digitalRead(AP_DATA_RESET_PIN) != LOW) - { - wm.resetSettings(); - DEBUG_MSG("Resetting AP data\n"); - lcd.clear(); - lcd.setCursor(0, 0); - lcd.print(F("Resetting AP data")); - delay(2000); - } - - // Automatically connect using saved credentials, - // if connection fails, it starts an access point with the specified name ( "AutoConnectAP"), - // if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect()) - // then goes into a blocking loop awaiting configuration and will return success result - - lcd.clear(); - lcd.setCursor(0, 0); - lcd.print(F("Mode Config-AP")); - lcd.setCursor(0, 1); - lcd.print(F("192.168.4.1")); - - if (!wm.autoConnect(AP_SSID_CONFIG_NAME, AP_CONFIG_PASSWORD)) - { - DEBUG_MSG("Failed to connect\n"); - lcd.print(F("Failed")); - delay(1000); - lcd.print(F("- restart")); - delay(1000); - ESP.restart(); - } - else { - //if you get here you have connected to the WiFi - DEBUG_MSG("Connected\n"); - - if (!MDNS.begin(MDNS_NAME)) - { - DEBUG_MSG("Error setting up MDNS responder!\n"); - } - else - { - DEBUG_MSG("mDNS started.\n"); - } - } - - lcd.clear(); - lcd.setCursor(0, 0); - lcd.print(F("Mode WiFi client")); - lcd.setCursor(0, 1); - lcd.print(WiFi.localIP()); - } - - memset(state, -1, 16 * 128); - - udp.begin(UDP_RECV_PORT); - DEBUG_MSG("Listening for UDP packets on port %d\n", UDP_RECV_PORT); - - midi1.begin(31250); // 16,17 - midi2.begin(31250, SWSERIAL_8N1, D5, D6, false, 95, 11); - midi2.enableIntTx(false); - - MIDI1.begin(MIDI_CHANNEL_OMNI); - MIDI1.setHandleControlChange(MidiCCToOSC); - MIDI1.turnThruOff(); - - //set_midi_state(); - - sched.addJob(check_mode, KRATE_MODE); - sched.addJob(show_midi_state, KRATE_STATE); -} - -void loop() -{ - OSCMessage msg; - uint8_t buffer[1024]; - uint16_t outPort; - - size_t size = udp.parsePacket(); - - while (udp.available()) - { - IPAddress tmpIP = udp.remoteIP(); - - // Check if there are any OSC packets to handle - udp.read(buffer, size); - msg.fill(buffer, size); - - if (!msg.hasError()) - { - DEBUG_OSC_MESSAGE(msg); - msg.route("/midi/cc", OSCToMidiCC); - //msg.route("/midi/sysex", OSCToMidiSYSEX); - //msg.route("/midi/note", OSCToMidiNote); - } - else - { - DEBUG_MSG("Error parsing OSC message: %d\n", msg.getError()); - } - - // Keep track of the client IP address for "talking back" - if (clientIP == tmpIP) - { - clientIP = tmpIP; - DEBUG_MSG("Connection from: %s", clientIP); - } - } - - // Check if there are any CC messages from synth itself - if (MIDI1.read()) - { - DEBUG_MSG("MIDI-IN[1] Type: "); - DEBUG_MSG("%3d", MIDI1.getType()); - DEBUG_MSG(" Data1: "); - DEBUG_MSG("%3d", MIDI1.getData1()); - DEBUG_MSG(" Data2: "); - DEBUG_MSG("%3d", MIDI1.getData2()); - DEBUG_MSG(" Channel: "); - DEBUG_MSG("%0d", MIDI1.getChannel()); - DEBUG_MSG("\n"); - } - - // MIDI-Merger from (Soft-)MIDI2 to MIDI1 - if (midi2.available() > 0) - { - while (midi2.available() > 0) - { - DEBUG_MSG("MIDI-IN[2]: %03d\n", midi2.peek()); - midi1.write(midi2.read()); - } - } - - sched.scheduler(); -} - -void OSCToMidiCC(OSCMessage & msg, int offset) -{ - char address[100] = { 0 }; - uint8_t cc, value; - uint8_t midichannel; - - msg.getAddress(address, offset, sizeof(address)); - midichannel = getMIDIChannel(address); - - if (msg.size() == 1 && msg.isFloat(0)) - { - // Single or multi control with sending one value - cc = getCC(address); - value = round(msg.getFloat(0)); - value = value > 127 ? 127 : value; - DEBUG_MSG("MSG: % s\tChannel: % u\t\tCC: % u\tValue: % u\n", address, midichannel, cc, value); - MIDI1.sendControlChange(cc, value, midichannel); - change_midi_state(midichannel, cc, value); - } - else if (msg.size() == 2 && msg.isFloat(0) && msg.isFloat(1)) - { - // XY pad, two values - cc = getVar(address, 1); - value = round(msg.getFloat(0)); - value = value > 127 ? 127 : value; - DEBUG_MSG("MSG: % s\tChannel: % u\t\tCC: % u\tValue: % u\n", address, midichannel, cc, value); - MIDI1.sendControlChange(cc, value, midichannel); - change_midi_state(midichannel, cc, value); - cc = getVar(address, 2); - value = round(msg.getFloat(1)); - value = value > 127 ? 127 : value; - DEBUG_MSG("MSG: % s\tChannel: % u\t\tCC: % u\tValue: % u\n", address, midichannel, cc, value); - MIDI1.sendControlChange(cc, value, midichannel); - change_midi_state(midichannel, cc, value); - } - else - { - DEBUG_MSG("Cannot handle: % s\n", address); - } -} - -void MidiCCToOSC(uint8_t channel, uint8_t number, uint8_t val) -{ - char buffer[1024]; - - snprintf(buffer, sizeof(buffer), " / midi / cc / % u / % u", channel, number); - - DEBUG_MSG("MidiCCToOsc: % s % f\n", buffer, val * 1.0); - - if (clientIP) - { - OSCMessage msg = OSCMessage(buffer); - msg.add(val); - - udp.beginPacket(clientIP, UDP_SEND_PORT); - msg.send(udp); - udp.endPacket(); - } -} - -void change_midi_state(uint8_t midichannel, uint8_t cc, uint8_t value) -{ - state[midichannel - 1][cc - 1] = value; -} - -void show_midi_state(void) -{ - uint8_t m, c; - - DEBUG_MSG("Current MIDI state:\n"); - - for (m = 0; m < 16; m++) - { - DEBUG_MSG("MIDI-Channel %d\n", m + 1); - for (c = 0; c < 128; c++) - { - if (state[m][c] >= 0) - { - DEBUG_MSG("\tCC: %03d = %03d\n", c, state[m][c]); - } - } - } -} - -/* - void set_midi_state(void) - { - uint8_t tmp; - uint8_t m; - uint16_t i; - - DEBUG_MSG("Send MIDI state:\n"); - - for (m = 0; m < 16; m++); - { - if (state[m].size() > 0) - { - DEBUG_MSG("MIDI-Channel %d\n"); - for (i = 0; i < state[m].size(); i++) - { - tmp = state[m].get(i); - MIDI1.sendControlChange(tmp >> 4, tmp & 0x0f, m); - DEBUG_MSG("\tSet state of CC: %03d = %03d\n", tmp >> 4, tmp & 0x0f); - } - } - } - } -*/ - -void check_mode(void) -{ - if (ap_mode_state != digitalRead(AP_MODE_PIN)) - { - lcd.clear(); - lcd.setCursor(0, 0); - lcd.print("Changing mode..."); - delay(500); - ESP.restart(); - } -} diff --git a/OSC2Midi.cpp b/OSC2Midi.cpp deleted file mode 100644 index 167c74b..0000000 --- a/OSC2Midi.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "OSC2Midi.h" -#include -#include - -/* - TODO: this will return rather unpredictable numbers when - given strings with numbers > 255. -*/ -uint8_t getVar(const char *str, int index) -{ - const char *offset = str; - - // skip the first / - if (strncmp(str, "/", strlen("/")) == 0) - { - offset++; - } - - if (index == -1) - { - return atoi(offset); - } - - while (index > 0) - { - const char *new_offset = strstr(offset, "/"); - if (new_offset) { - offset = new_offset + 1; - } else { - return 0; - } - - index--; - } - - return atoi(offset); -} - -uint8_t getCC(const char *str) -{ - return getVar(str, 1); -} - -uint8_t getMIDIChannel(const char *str) -{ - return getVar(str, 0); -} diff --git a/OSC2Midi.h b/OSC2Midi.h deleted file mode 100644 index c6552cb..0000000 --- a/OSC2Midi.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef OSC2MIDI_H -#define OSC2MIDI_H - -#include - -uint8_t getVar(const char *str, int index); -uint8_t getCC(const char *str); -uint8_t getMIDIChannel(const char *str); - -#endif diff --git a/WLAN_Thermometer.ino b/WLAN_Thermometer.ino new file mode 100644 index 0000000..03405e8 --- /dev/null +++ b/WLAN_Thermometer.ino @@ -0,0 +1,167 @@ +// Use from 0 to 4. Higher number, more debugging messages and memory usage. +#define _WIFIMGR_LOGLEVEL_ 1 +#define DEBUG 1 + +#include +#include +#include "debug.h" +#include +#include +#include +#include +#include +#include + +#define MDNS_NAME "wlanthermometer" +#define AP_SSID_CONFIG_NAME "WLANTHERMOMETER-Config" +#define AP_CONFIG_PASSWORD "wlanthermometer" +#define AP_DATA_RESET_PIN 35 +#define TEMP_SENS_PIN 34 +#define LCD_I2C_ADDR 0x3f +#define LCD_COL 20 +#define LCD_ROW 4 +#define KRATE_TEMP 5000 +#define KRATE_TIME 500 +#define MEDIAN_SAMPLES 60 + +void check_mode(void); + +LiquidCrystal_I2C lcd(LCD_I2C_ADDR, LCD_COL, LCD_ROW); +looper sched; +RunningMedian samples = RunningMedian(MEDIAN_SAMPLES); +float temp_min = (analogRead(TEMP_SENS_PIN) / 2048.0) * 330.0; +float temp_max = temp_min; + +void setup() +{ + pinMode(AP_DATA_RESET_PIN, INPUT_PULLUP); + + Serial.begin(115200); + Serial.println(F("WLANThermometer (c)2020 H. Wirtz ")); + + lcd.init(); + lcd.backlight(); + lcd.clear(); + lcd.noCursor(); + lcd.setCursor(0, 0); + lcd.print(F("WLAN THERMOMETER")); + lcd.setCursor(0, 1); + lcd.print(F("(c)parasiTstudio")); + delay(1000); + + DEBUG_MSG("Mode Client\n"); + + WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP + + WiFiManager wm; + + if (digitalRead(AP_DATA_RESET_PIN) != LOW) + { + wm.resetSettings(); + DEBUG_MSG("Resetting AP data\n"); + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print(F("Resetting AP data")); + delay(2000); + } + + // Automatically connect using saved credentials, + // if connection fails, it starts an access point with the specified name ( "AutoConnectAP"), + // if empty will auto generate SSID, if password is blank it will be anonymous AP (wm.autoConnect()) + // then goes into a blocking loop awaiting configuration and will return success result + + lcd.clear(); + lcd.setCursor(0, 3); + lcd.print(F("Mode Config-AP")); + lcd.setCursor(0, 4); + lcd.print(F("192.168.4.1")); + + if (!wm.autoConnect(AP_SSID_CONFIG_NAME, AP_CONFIG_PASSWORD)) + { + DEBUG_MSG("Failed to connect\n"); + lcd.setCursor(0, 4); + lcd.print(F("Failed ")); + delay(1000); + lcd.setCursor(8, 4); + lcd.print(F("- restart")); + delay(1000); + ESP.restart(); + } + else { + //if you get here you have connected to the WiFi + DEBUG_MSG("Connected\n"); + + + if (!MDNS.begin(MDNS_NAME)) + { + DEBUG_MSG("Error setting up MDNS responder!\n"); + } + else + { + DEBUG_MSG("mDNS started.\n"); + } + + lcd.clear(); + lcd.setCursor(0, 0); + lcd.print(F("Mode WiFi client")); + lcd.setCursor(0, 1); + lcd.print(WiFi.localIP()); + + delay(500); + } + + DateTime.setTimeZone(2); + DateTime.begin(); + if (!DateTime.isTimeValid()) { + Serial.println("Failed to get time from server."); + } + + sched.addJob(show_temperature, KRATE_TEMP); + sched.addJob(show_time, KRATE_TIME); + + lcd.clear(); + show_time(); + show_temperature(); +} + +void loop() +{ + sched.scheduler(); +} + +void show_time(void) +{ + DateTimeParts p = DateTime.getParts(); + char dt[21]; + + Serial.println(DateTime.format(DateFormatter::DATE_ONLY)); + Serial.println(DateTime.format(DateFormatter::TIME_ONLY)); + + sprintf(dt, "%02d.%02d.%4d %02d:%02d:%02d", p.getMonthDay(), p.getMonth() + 1, p.getYear(), p.getHours(), p.getMinutes(), p.getSeconds()); + lcd.setCursor(0, 0); + lcd.print(dt); +} + +void show_temperature(void) +{ + float temp = (analogRead(TEMP_SENS_PIN) / 2048.0) * 330.0; + + Serial.println(temp, 1); + + samples.add(temp); + + if (samples.getLowest() < temp_min) + temp_min = samples.getLowest(); + if (samples.getHighest() > temp_max) + temp_max = samples.getHighest(); + + lcd.setCursor(0, 1); + lcd.print("Temperatur: "); + lcd.print(temp); + lcd.setCursor(0, 2); + lcd.print("Minimum: "); + lcd.print(temp_min); + lcd.setCursor(0, 3); + lcd.print("Maximum: "); + lcd.print(temp_max); +} diff --git a/doc/midi_message_types.txt b/doc/midi_message_types.txt deleted file mode 100644 index 3ec42cf..0000000 --- a/doc/midi_message_types.txt +++ /dev/null @@ -1,90 +0,0 @@ -MIDI message types - -(hex) -8 = note_off -9 = note_on -A = aftertouch (ie, key pressure) -B = controller_change -C = program_change -D = channel_pressure -E = pitch_wheel - - -** additions ** -sysex -start -stop -continue -mode -file - -control_change messages - -(dec) -0 bank_select (coarse) -1 modulation_wheel (coarse) -2 breath_controller (coarse) -4 foot_pedal (coarse) -5 portamento Time (coarse) -6 data_entry (coarse) -7 volume (coarse) -8 balance (coarse) -10 pan position (coarse) -11 expression (coarse) -12 effect_control_1 (coarse) -13 effect_control_2 (coarse) -16 general_purpose_slider_1 -17 general_purpose_slider_2 -18 general_purpose_slider_3 -19 general_purpose_slider_4 -32 bank_select (fine) -33 modulation_wheel (fine) -34 breath_controller (fine) -36 foot_pedal (fine) -37 Portamento Time (fine) -38 Data Entry (fine) -39 Volume (fine) -40 Balance (fine) -42 Pan position (fine) -43 Expression (fine) -44 Effect Control 1 (fine) -45 Effect Control 2 (fine) -64 Hold Pedal (on/off) -65 Portamento (on/off) -66 Sustenuto Pedal (on/off) -67 Soft Pedal (on/off) -68 Legato Pedal (on/off) -69 Hold 2 Pedal (on/off) -70 Sound Variation -71 Sound Timbre -72 Sound Release Time -73 Sound Attack Time -74 Sound Brightness -75 Sound Control 6 -76 Sound Control 7 -77 Sound Control 8 -78 Sound Control 9 -79 Sound Control 10 -80 General Purpose Button 1 (on/off) -81 General Purpose Button 2 (on/off) -82 General Purpose Button 3 (on/off) -83 General Purpose Button 4 (on/off) -91 Effects Level -92 Tremulo Level -93 Chorus Level -94 Celeste Level -95 Phaser Level -96 Data Button increment -97 Data Button decrement -98 Non-registered Parameter (fine) -99 Non-registered Parameter (coarse) -100 Registered Parameter (fine) -101 Registered Parameter (coarse) -120 All Sound Off -121 All Controllers Off -122 Local Keyboard (on/off) -123 All Notes Off -124 Omni Mode Off -125 Omni Mode On -126 Mono Operation -127 Poly Operation