Init
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
/kicad/*-backups
|
||||
/kicad/*-bak
|
||||
/kicad/gerber/*
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "kicad/lib"]
|
||||
path = kicad/lib
|
||||
url = git@github.com:necroware/kicad-library.git
|
||||
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
@@ -0,0 +1,244 @@
|
||||
# Necroware's GamePort Adapter
|
||||
|
||||

|
||||
|
||||
Many people from the retro community still have their beloved joysticks and
|
||||
gamepads from the early days. These devices often live their lives somewhere in
|
||||
the dark corners of our basements and we don't dare to throw them away, because
|
||||
of nostalgic reasons. They remind us so much of our childhoods, where we played
|
||||
our Wing Commanders, X-Wings, Descents and many other games. These old joysticks
|
||||
were all made to be connected to the game port, usually on a sound card. But
|
||||
by the end of 90's and beginning of 2000's game ports vanished from our
|
||||
computers and were replaced by USB and our old joysticks disappeared into the
|
||||
past. Today not everybody has a full retro PC and many people are using their
|
||||
modern computer with DOSBox to play the old games, sometimes with a modern
|
||||
USB joystick. But wouldn't it be great to play the old games with the same
|
||||
joystick which we used back then? And this is where this adapter comes into
|
||||
play. It can be used to connect gameport joysticks to a USB port.
|
||||
|
||||
GamePort Adapter Videos:
|
||||
* [Part 1: Introduction](https://youtu.be/tSJLgCD8jeM)
|
||||
* [Part 2: Updates](https://youtu.be/947DewHwbsE)
|
||||
|
||||
## How does it work?
|
||||
|
||||
The adapter is built around Arduino Pro Micro, which uses the same ATmega32U4
|
||||
microcontroller as Leonardo. This microcontroller has built-in USB HID
|
||||
capabilities and can be used to build HID input devices, like joysticks. The
|
||||
adapter itself is super simple, the main brainwork was invested into the
|
||||
software. Very much simplified, it reads the joystick states and sends the data,
|
||||
via USB, to the computer, which thinks that it is communicating with a USB
|
||||
joystick.
|
||||
|
||||
## What is special about this one?
|
||||
|
||||
There are already plenty of gameport to USB adapters for basic analog joysticks
|
||||
and, as far as I know, there were some efforts to communicate with Sidewinder
|
||||
joysticks by Microsoft as well. But there is no universal adapter, which would
|
||||
work with different types of joysticks. This adapter implements multiple drivers
|
||||
for various analog and digital joysticks, with an option to add more, in the
|
||||
future.
|
||||
|
||||
Features overview:
|
||||
* Support for generic analog joysticks with 2/4 buttons and 2/4 axes
|
||||
* Four switches to select joystick type
|
||||
* Autodetection for various digital protocol joysticks
|
||||
* Auto-Calibration
|
||||
* Very low input lag
|
||||
|
||||
## What is the difference between analog and digital joystick?
|
||||
|
||||
Many people call button-only joysticks or gamepads digital. This is kind of
|
||||
right, because a button is either pressed or not. You can't have an analog
|
||||
values in between. However by digital, in this case, we mean something different.
|
||||
A gameport contains 15 pins, 8 of which are used for joystick communication. 4
|
||||
pins are for buttons and carry digital values in sense of on/off and 4 pins are
|
||||
for analog axes, which deliver voltage somewhere between 0V and 5V. Joysticks
|
||||
which were made in the early days used this pinout. They could have a
|
||||
maximum of 4 buttons and 4 axes and were DOS compatible. Later, in the time of
|
||||
Windows 95/98 many joysticks were made to be plugged into a gameport as well,
|
||||
but they were not limited to 4 buttons and 4 axes. They had a lot more exciting
|
||||
features, like hat switches and throttle controls. But how did this work? Well
|
||||
the manufacturers implemented their drivers to communicate with the joystick via
|
||||
gameport using a proprietary communication protocol. For example, by using one
|
||||
pin of the gameport as clock and another one as data, the possibilities were
|
||||
almost limitless. Such joysticks are called digital as well, because they used
|
||||
digital protocols to communicate with the PC. And suddenly, many features were
|
||||
possible, but the price of these features was the lost compatibility to DOS. You
|
||||
couldn't just plug such a joystick into the gameport and expect it to work in
|
||||
old DOS games. The plug was the same, but the signaling was completely different.
|
||||
|
||||
## Which joysticks does this adapter support?
|
||||
|
||||
Currently, the following drivers are implemented. To select the right driver, you
|
||||
have to use four switches, as shown in the table. The switches may be changed or
|
||||
extended in the future, so please pay attention to the updates.
|
||||
|
||||
Joystick Model | Buttons | Axes | Hat | SW1-4 | Protocol | Comments
|
||||
-----------------------------|---------|-------|------|-------|------------|------------------------------------
|
||||
Generic Analog | 2 | 2 | 0 | 0000 | Analogue |
|
||||
Generic Analog | 4 | 2 | 0 | 1000 | Analogue |
|
||||
Generic Analog | 4 | 3 | 0 | 0100 | Analogue | 3rd Axis is throttle
|
||||
Generic Analog | 4 | 4 | 0 | 1100 | Analogue |
|
||||
CH FlightStick | 4 | 4 | 1 | 0010 | Analogue |
|
||||
CH F16 Combat Stick | 10 | 3 | 1 | 0110 | Analogue |
|
||||
ThrustMaster | 4 | 3 | 1 | 1010 | Analogue | FCS MARK I/II & PFCS
|
||||
Sidewinder GamePad | 10 | 2 | 0 | 1110 | Sidewinder |
|
||||
Sidewinder 3D Pro | 8 | 4 | 1 | 1110 | Sidewinder |
|
||||
Sidewinder 3D Pro Plus | 9 | 4 | 1 | 1110 | Sidewinder | First version of Precision Pro
|
||||
Sidewinder Precision Pro | 9 | 4 | 1 | 1110 | Sidewinder |
|
||||
Sidewinder FFB Pro | 9 | 4 | 1 | 1110 | Sidewinder | FFB not yet implemented
|
||||
Sidewinder FFB Wheel | 8 | 3 | 0 | 1110 | Sidewinder | FFB not yet implemented
|
||||
Gravis GamePad Pro | 10 | 2 | 0 | 0001 | GrIP |
|
||||
Logitech WingMan Extreme | 6 | 3 | 1 | 1001 | ADI |
|
||||
Logitech CyberMan 2 | 8 | 6 | 0 | 1001 | ADI |
|
||||
Logitech WingMan Interceptor | 9 | 3 | 3 | 1001 | ADI | 2 hats are mapped as 4 axes
|
||||
Logitech ThunderPad Digital | 8 | 2 | 0 | 1001 | ADI | Directional buttons mapped as 2 axes
|
||||
Logitech WingMan Gamepad | 11 | 2 | 0 | 1001 | ADI | Directional buttons mapped as 2 axes
|
||||
Logitech WingMan Light | 2 | 2 | 0 | 0000 | Analogue |
|
||||
|
||||
*Remarks:*
|
||||
|
||||
- Please pay attention to how the same switches are used for different families
|
||||
of digital devices. This is possible due to fully digital communication. Using
|
||||
this method, the adapter implements autodetection as soon as it knows, that it
|
||||
is connected to a digital joystick.
|
||||
- Currently, only the drivers for the listed Sidewinder devices are implemented,
|
||||
since I have no other models at hand. The Precision Pro works natively on USB
|
||||
as well, but was still implemented, because we can.
|
||||
- Gravis used their GrIP protocol, which is currently implemented only for the
|
||||
Gravis GamePad Pro, but without daisy chaining possibility so far.
|
||||
- The implementation of the ADI protocol used by Logitech should work with all
|
||||
the devices which support that protocol. However only the listed Logitech devices
|
||||
were tested so far.
|
||||
|
||||
## Which joysticks were tested?
|
||||
|
||||
Many joysticks in the wild are using the same digital protocol or are backwards
|
||||
compatible to the analog joysticks as they were used back in the days in DOS.
|
||||
Following list contains all the devices which were reported by others as working
|
||||
so far:
|
||||
|
||||
* CH Mach I+ (analog, 2-axes, 2-buttons)
|
||||
* Gravis Analog Pro (analog)
|
||||
* Gravis GamePad Pro
|
||||
* Gravis PC GamePad (analog)
|
||||
* InterAct UltraRacer PC (analog)
|
||||
* Logitech CyberMan 2
|
||||
* Logitech WingMan Extreme Digital
|
||||
* Logitech WingMan Interceptor
|
||||
* Logitech WingMan Light
|
||||
* Logitech ThunderPad Digital
|
||||
* Logitech WingMan Gamepad
|
||||
* Medion Joypad MD9823 (analog, 4-axes, 4-buttons)
|
||||
* QuickShot QS-123E "Warrior 5" (analog)
|
||||
* Quickshot QS-146 "Intruder 5" (analog)
|
||||
* Quickshot QS-151 "Aviator" (analog)
|
||||
* QuickShot QS-201 "Super Warrior" (analog)
|
||||
* QuickShot QS-203 "Avenger" (analog)
|
||||
* Sidewinder 3D Pro
|
||||
* Sidewinder 3D Pro Plus
|
||||
* Sidewinder ForceFeedBack Pro
|
||||
* Sidewinder ForceFeedBack Wheel
|
||||
* Sidewinder GamePad
|
||||
* Sidewinder Precision Pro
|
||||
|
||||
Sidewinder 3D Pro can be switched between analog and digital mode and in analog
|
||||
mode it can emulate the ThrustMaster and CH FlightStick. That's why you see them in
|
||||
the table above. Unfortunately I don't possess those joysticks in reality, so it may
|
||||
be that the implementation is not quite correct.
|
||||
|
||||
## What is auto calibration?
|
||||
|
||||
Old analog joysticks have resistors inside, which are specified to be 100 kOhm.
|
||||
Unfortunately, these resistors are either worn out, bad quality or were wrong from
|
||||
the beginning. Therefore most of the generic analog joysticks had adjustment
|
||||
screws to correct the center point of the joystick. Also many games had
|
||||
calibration options in their settings to readjust the joystick. With USB and new
|
||||
digital solutions the calibration was not required anymore and was completely
|
||||
implemented in the joysticks and/or drivers. Many modern games have no option
|
||||
to re-calibrate the joystick anymore. If we try to play such newer games with
|
||||
an old analog joystick through this adapter, the joystick center point would be
|
||||
totally offset. That's why the adapter implements auto calibration internally and
|
||||
presents already corrected values to the operation system.
|
||||
|
||||
__ATTENTION__: a hard requirement for using the analog joysticks is that during
|
||||
plugging into the USB port all axes must be in their middle state, because all
|
||||
the subsequent calibration happens based on the initial state.
|
||||
|
||||
## Technical insights into implementation
|
||||
|
||||
The code is well documented, so if you are interested in the details, feel free
|
||||
to take a look into the driver implementation. All the analog joysticks were
|
||||
actually a straight forward task, but the Sidewinder digital protocol was kind
|
||||
of tough. There are already some implementations of Sidewinder protocol made for
|
||||
Arduino. However, they are mostly only for the Sidewinder GamePad and not really
|
||||
universally made. In the end I was heavily inspired by the Linux Sidewinder
|
||||
driver implementation. The code you can see in this project is a complete rewrite,
|
||||
I just took the Linux driver implementation as a reference to understand how it
|
||||
works. Also the Sidewinder patent US#5628686A helped a lot, especially with
|
||||
switching between digital and analog mode for Sidewinder 3D Pro.
|
||||
|
||||
In opposition to the already mentioned Sidewinder for Arduino implementations,
|
||||
this one doesn't rely on interrupts. This implementation is from a similar idea
|
||||
to what the Linux driver does. It polls the port and makes a lot of things
|
||||
simpler due to synchronous process. The biggest problem was that the Sidwinder
|
||||
devices send the data incredibly fast, with a clock pulse of only 5us. It was
|
||||
not possible to use Arduino's digitalRead(...) function for that. It was too
|
||||
slow with about 2.7us per call on an Arduino Pro Micro of 16MHz. It simply
|
||||
made it impossible to poll 5us pulses, with such a slow function, not even
|
||||
considering doing something with the data in between. So out of that need, my
|
||||
own implementation came about, which is up to 50% faster and needs only about
|
||||
1.6us per call, on the same hardware. The custom I/O functions made it possible
|
||||
to read the data with the speed which a Sidewinder joystick requires. The best
|
||||
part is that the code is written in pure C++. It is very simple to read and to
|
||||
use. There are no macros, no assembler or any dirty hacks, just a lot of
|
||||
optimization.
|
||||
|
||||
## Bill of materials (BOM)
|
||||
|
||||
The hardware is super simple. To build an adapter you'll need the PCB from this
|
||||
project and following parts:
|
||||
|
||||
Part | Qty | [LCSC](https://lcsc.com/) # | [Digikey](https://www.digikey.com/) # | [Mouser Electronics](https://www.mouser.com/) # | Comment
|
||||
--------|-------|---------|--------------------------|----------------------|------------------------------------------
|
||||
CONN1 | 1 | C77835 | 609-5371-ND | 523-L77SDA15SA4CH4F | DB15 female connector
|
||||
R1..R4 | 4 | C172965 | 13-MFR-25FTE52-100KCT-ND | 603-MFR-25FTE52-100K | 100 kOhm resistors
|
||||
SW1 | 1 | C15781 | 2449-KG04ET-ND | 642-DS04T | DIP-4 switch
|
||||
U1 | 1 | C72120 | ED3051-5-ND | 649-DILB24P-223TLF | DIP24 Socket (optional)
|
||||
U1 | 1 | N/A | 1568-1060-ND | 474-DEV-12640 | Arduino Pro Micro (ATmega32U4 16MHz, 5V), including two 12 pin header connectors, MicroUSB version (see "Known issues")
|
||||
|
||||
## Known issues
|
||||
|
||||
* *Some axes on an analog joystick are offset*
|
||||
|
||||
Auto calibration requires all the axes to be in the center position during
|
||||
initialization. Please see the paragraph about auto calibration.
|
||||
|
||||
* *Joystick doesn't work*
|
||||
|
||||
Make sure that you are using one of supported joysticks or a joystick which can
|
||||
work in legacy analog mode
|
||||
|
||||
* *MicroUSB port on the Arduino is not stable enough*
|
||||
|
||||
Use the USB-C version of the Arduino instead.
|
||||
Or always keep the MicroUSB cable attached to the Arduino MicroUSB version to avoid further wear and apply plug/unplug operations only on the remote side of the cable.
|
||||
|
||||
## How to help the project?
|
||||
|
||||
The best way is to implement more drivers. Since I have only the joysticks
|
||||
mentioned above, I can't contribute more than what is currently included.
|
||||
|
||||
## Special thanks
|
||||
|
||||
I would like to give some special thanks to *Creopard* from the German
|
||||
dosreloaded.de community for providing me the mentioned joysticks. Without that
|
||||
donation this project wouldn't be possible. Especially dealing with Sidewinder
|
||||
3D Pro was a very exciting task.
|
||||
|
||||
## Links
|
||||
* [Linux Sidewinder Driver](https://github.com/torvalds/linux/blob/master/drivers/input/joystick/sidewinder.c)
|
||||
* [Sidewinder patent](https://patents.google.com/patent/US5628686A/en)
|
||||
* [Creopard Retro Site](https://www.creopard.de/)
|
||||
|
||||
@@ -0,0 +1,149 @@
|
||||
---
|
||||
Language: Cpp
|
||||
# BasedOnStyle: LLVM
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveMacros: false
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveBitFields: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlines: Right
|
||||
AlignOperands: Align
|
||||
AlignTrailingComments: true
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowAllConstructorInitializersOnNextLine: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowShortEnumsOnASingleLine: true
|
||||
AllowShortBlocksOnASingleLine: Never
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: false
|
||||
AllowShortLambdasOnASingleLine: All
|
||||
AllowShortIfStatementsOnASingleLine: Never
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: true
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
BraceWrapping:
|
||||
AfterCaseLabel: false
|
||||
AfterClass: false
|
||||
AfterControlStatement: Never
|
||||
AfterEnum: false
|
||||
AfterFunction: false
|
||||
AfterNamespace: false
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
AfterExternBlock: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
BeforeLambdaBody: false
|
||||
BeforeWhile: false
|
||||
IndentBraces: false
|
||||
SplitEmptyFunction: true
|
||||
SplitEmptyRecord: true
|
||||
SplitEmptyNamespace: true
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeBraces: Attach
|
||||
BreakBeforeInheritanceComma: false
|
||||
BreakInheritanceList: BeforeColon
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: true
|
||||
BreakConstructorInitializers: BeforeColon
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 120
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 0
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DeriveLineEnding: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
FixNamespaceComments: true
|
||||
ForEachMacros:
|
||||
- foreach
|
||||
- Q_FOREACH
|
||||
- BOOST_FOREACH
|
||||
IncludeBlocks: Preserve
|
||||
IncludeCategories:
|
||||
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
|
||||
Priority: 2
|
||||
SortPriority: 0
|
||||
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||
Priority: 3
|
||||
SortPriority: 0
|
||||
- Regex: '.*'
|
||||
Priority: 1
|
||||
SortPriority: 0
|
||||
IncludeIsMainRegex: '(Test)?$'
|
||||
IncludeIsMainSourceRegex: ''
|
||||
IndentCaseLabels: true
|
||||
IndentCaseBlocks: false
|
||||
IndentGotoLabels: true
|
||||
IndentPPDirectives: None
|
||||
IndentExternBlock: AfterExternBlock
|
||||
IndentWidth: 2
|
||||
IndentWrappedFunctionNames: false
|
||||
InsertTrailingCommas: None
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
ObjCBinPackProtocolList: Auto
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCBreakBeforeNestedBlockParam: true
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakAssignment: 2
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyBreakTemplateDeclaration: 10
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerAlignment: Right
|
||||
ReflowComments: true
|
||||
SortIncludes: true
|
||||
SortUsingDeclarations: true
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceAfterLogicalNot: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceBeforeCtorInitializerColon: true
|
||||
SpaceBeforeInheritanceColon: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
SpaceInEmptyBlock: false
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInConditionalStatement: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
SpaceBeforeSquareBrackets: false
|
||||
Standard: Latest
|
||||
StatementMacros:
|
||||
- Q_UNUSED
|
||||
- QT_REQUIRE_VERSION
|
||||
TabWidth: 8
|
||||
UseCRLF: false
|
||||
UseTab: Never
|
||||
WhitespaceSensitiveMacros:
|
||||
- STRINGIZE
|
||||
- PP_STRINGIZE
|
||||
- BOOST_PP_STRINGIZE
|
||||
...
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
/// Class to read analog axis.
|
||||
///
|
||||
/// Usually PC joystick axes are specified to have 100 Ohm resistance, but
|
||||
/// many analog joysticks have old, bad, or just wrong resistors. This ends
|
||||
/// up in incorrect positions and is especially bad for games, which don't
|
||||
/// have calibration features. This class takes care of this issue and
|
||||
/// applies automatic calibration on every read.
|
||||
template <int ID>
|
||||
class AnalogAxis {
|
||||
public:
|
||||
/// Constructor.
|
||||
///
|
||||
/// The initial state of the joystick is considered as middle
|
||||
/// which is used for autocalibration.
|
||||
AnalogAxis() {
|
||||
pinMode(ID, INPUT);
|
||||
m_mid = analogRead(ID);
|
||||
m_min = m_mid - 100;
|
||||
m_max = m_mid + 100;
|
||||
}
|
||||
|
||||
/// Gets the axis state.
|
||||
///
|
||||
/// This function automatically recalculates the outer limits and
|
||||
/// readjusts the position of the joystick.
|
||||
/// @returns a value between 0 and 1023
|
||||
uint16_t get() {
|
||||
const auto value = analogRead(ID);
|
||||
if (value < m_min) {
|
||||
m_min = value;
|
||||
} else if (value > m_max) {
|
||||
m_max = value;
|
||||
}
|
||||
|
||||
if (value < m_mid) {
|
||||
return map(value, m_min, m_mid, 1023, 512);
|
||||
}
|
||||
return map(value, m_mid, m_max, 511, 0);
|
||||
}
|
||||
|
||||
private:
|
||||
int m_mid;
|
||||
int m_min;
|
||||
int m_max;
|
||||
};
|
||||
@@ -0,0 +1,61 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "AnalogAxis.h"
|
||||
#include "DigitalPin.h"
|
||||
#include "GamePort.h"
|
||||
|
||||
/// A common class for all analog joysticks.
|
||||
class AnalogJoystick {
|
||||
public:
|
||||
/// Gets axis value.
|
||||
///
|
||||
/// @param[in] id is the axes ID
|
||||
/// @returns a value between 0 and 255
|
||||
uint16_t getAxis(int id) {
|
||||
switch (id) {
|
||||
case 0:
|
||||
return m_axis1.get();
|
||||
case 1:
|
||||
return m_axis2.get();
|
||||
case 2:
|
||||
return m_axis3.get();
|
||||
case 3:
|
||||
return m_axis4.get();
|
||||
default:
|
||||
return 0u;
|
||||
}
|
||||
}
|
||||
|
||||
/// Gets the buttons state as one byte.
|
||||
///
|
||||
/// @returns a byte every bit represents a button
|
||||
byte getButtons() {
|
||||
return m_button1.isLow() | m_button2.isLow() << 1 | m_button3.isLow() << 2 | m_button4.isLow() << 3;
|
||||
}
|
||||
|
||||
private:
|
||||
DigitalInput<GamePort<2>::pin> m_button1;
|
||||
DigitalInput<GamePort<7>::pin> m_button2;
|
||||
DigitalInput<GamePort<10>::pin> m_button3;
|
||||
DigitalInput<GamePort<14>::pin> m_button4;
|
||||
AnalogAxis<GamePort<3>::pin> m_axis1;
|
||||
AnalogAxis<GamePort<6>::pin> m_axis2;
|
||||
AnalogAxis<GamePort<11>::pin> m_axis3;
|
||||
AnalogAxis<GamePort<13>::pin> m_axis4;
|
||||
};
|
||||
@@ -0,0 +1,104 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
template <size_t Size>
|
||||
struct Buffer {
|
||||
static const uint8_t MAX_SIZE{Size};
|
||||
uint8_t data[MAX_SIZE]{};
|
||||
uint8_t size{};
|
||||
};
|
||||
|
||||
template <size_t S>
|
||||
class BufferFillerImpl {
|
||||
public:
|
||||
using BufferType = Buffer<S>;
|
||||
|
||||
explicit BufferFillerImpl(BufferType& buffer)
|
||||
: m_buffer(buffer) {}
|
||||
|
||||
~BufferFillerImpl() = default;
|
||||
BufferFillerImpl(const BufferFillerImpl&) = delete;
|
||||
BufferFillerImpl(BufferFillerImpl&&) = default;
|
||||
BufferFillerImpl& operator=(const BufferFillerImpl&) = delete;
|
||||
BufferFillerImpl& operator=(BufferFillerImpl&&) = default;
|
||||
|
||||
template <typename T>
|
||||
BufferFillerImpl& push(const T& bits) {
|
||||
return push(uint32_t(bits), sizeof(bits) * BITS_PER_BYTE);
|
||||
}
|
||||
|
||||
BufferFillerImpl& push(uint32_t bits, size_t count) {
|
||||
while(count) {
|
||||
const auto pushed = fillup(bits, count);
|
||||
bits >>= pushed;
|
||||
count -= pushed;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
BufferFillerImpl& align() {
|
||||
if (m_bitsUsed) {
|
||||
m_buffer.size++;
|
||||
m_bitsUsed = 0u;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
static constexpr auto BITS_PER_BYTE{8u};
|
||||
|
||||
BufferType& m_buffer;
|
||||
size_t m_bitsUsed{};
|
||||
|
||||
size_t fillup(byte bits, size_t count) {
|
||||
|
||||
const auto freeBits = BITS_PER_BYTE - m_bitsUsed;
|
||||
if (freeBits == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// If the total count is above the free bits available in the current
|
||||
// byte, then push just a chunk to fill up the current byte
|
||||
if (freeBits < count) {
|
||||
return fillup(bits, freeBits);
|
||||
}
|
||||
|
||||
if (m_bitsUsed == 0u) {
|
||||
m_buffer.data[m_buffer.size] = 0u;
|
||||
}
|
||||
|
||||
// Obviously the total count is less, than the amount of free bits
|
||||
// available in the current byte, so the following block will simply
|
||||
// add the bits to the current byte and return
|
||||
const auto mask = uint32_t(1u << count) - 1u;
|
||||
m_buffer.data[m_buffer.size] |= byte(bits & mask) << m_bitsUsed;
|
||||
m_bitsUsed += count;
|
||||
if (m_bitsUsed == BITS_PER_BYTE) {
|
||||
m_buffer.size++;
|
||||
m_bitsUsed = 0u;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
};
|
||||
|
||||
template <size_t S>
|
||||
BufferFillerImpl<S> BufferFiller(Buffer<S>& buffer) {
|
||||
return BufferFillerImpl<S>(buffer);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "AnalogJoystick.h"
|
||||
#include "Joystick.h"
|
||||
|
||||
class CHF16CombatStick : public Joystick {
|
||||
public:
|
||||
const Description &getDescription() const override {
|
||||
// CH F16 Combat Stick from 1995
|
||||
static const Description description{"CH F16 Combat Stick", 3, 10, 1};
|
||||
return description;
|
||||
}
|
||||
|
||||
const State &getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
bool init() override {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool update() override {
|
||||
const auto decodeHat = [](byte code) -> byte {
|
||||
// Same as CH Flight Stick Pro. But the F16 stick has 4 positions on the hat only.
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||
static constexpr byte table[16] = {0, 0, 0, 7, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 1};
|
||||
return (code < sizeof(table)) ? table[code] : 0u;
|
||||
};
|
||||
|
||||
const auto decodeButtons = [](byte code) -> uint16_t {
|
||||
// Map to 10 buttons: 5 real ones, one hat with 4 positions. Thus we need uint16 instead of byte
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
||||
static constexpr uint16_t table[16] = {0, 1, 8, 0, 4, 32, 256, 0, 16, 2, 128, 0, 512, 0, 64, 0};
|
||||
static constexpr auto tableSize = sizeof(table) / sizeof(table[0]);
|
||||
return (code < tableSize) ? table[code] : 0u;
|
||||
};
|
||||
|
||||
// The 4th axis (index 2) is ignored, because there is a big jitter
|
||||
// and it reacts on movement of the other axes too. So you can not
|
||||
// assign the axes to a function in your game.
|
||||
m_state.axes[0] = m_joystick.getAxis(0);
|
||||
m_state.axes[1] = m_joystick.getAxis(1);
|
||||
m_state.axes[2] = m_joystick.getAxis(3); // Throttle
|
||||
|
||||
const auto code = m_joystick.getButtons();
|
||||
|
||||
m_state.hat = decodeHat(code);
|
||||
m_state.buttons = decodeButtons(code);
|
||||
|
||||
log("Code %d : %d , A2 %d", code, m_state.buttons, m_state.axes[2] );
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
AnalogJoystick m_joystick;
|
||||
State m_state;
|
||||
};
|
||||
@@ -0,0 +1,68 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "AnalogJoystick.h"
|
||||
#include "Joystick.h"
|
||||
|
||||
class CHFlightstickPro : public Joystick {
|
||||
public:
|
||||
const Description &getDescription() const override {
|
||||
static const Description description{"CH FlightStick Pro", 4, 4, 1};
|
||||
return description;
|
||||
}
|
||||
|
||||
const State &getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
bool init() override {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool update() override {
|
||||
|
||||
// Unfortunately I had no real CHFlighstickPro joystick to test, but
|
||||
// Sidewinder 3D Pro has an emulation for CHFlighstickPro. So, this
|
||||
// implementation was made using that emulation and could be wrong.
|
||||
// CHFlighstickPro seems to be a very interesting joystick. It doesn't
|
||||
// allow the user to press multiple buttons simultaneously and uses
|
||||
// combined buttons invocations as hat switch codes instead. So, every
|
||||
// time a multiple buttons seem to be pressed, means that the user is
|
||||
// actually using the hat switch.
|
||||
|
||||
const auto decode = [](byte code) -> byte {
|
||||
static const byte table[16] = {0, 0, 0, 7, 0, 6, 0, 5, 0, 4, 0, 3, 0, 2, 0, 1};
|
||||
return (code < sizeof(table)) ? table[code] : 0u;
|
||||
};
|
||||
|
||||
for (auto i = 0u; i < 4; i++) {
|
||||
m_state.axes[i] = m_joystick.getAxis(i);
|
||||
}
|
||||
|
||||
const auto code = m_joystick.getButtons();
|
||||
m_state.hat = decode(code);
|
||||
m_state.buttons = m_state.hat ? 0u : code;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
AnalogJoystick m_joystick;
|
||||
State m_state;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
/// Digital signal edge types.
|
||||
enum class Edge { any, falling, rising };
|
||||
|
||||
/// Digital pin base constants.
|
||||
///
|
||||
/// This implementation was born out of the need for faster digital I/O. The
|
||||
/// original digitalRead(...) function of Arduino suite needs about 2.7us per
|
||||
/// call on a 16MHz MCU. Which makes it impossible to poll 5us pulses, not
|
||||
/// talking about doing with the data something in between. This was a hard
|
||||
/// requirement for this project, so following solution is up to 50% faster
|
||||
/// and needs about 1.6us per call on the same hardware.
|
||||
|
||||
template <int Id>
|
||||
struct DigitalPin {
|
||||
using RegType = uint8_t;
|
||||
const RegType mask;
|
||||
const RegType port;
|
||||
DigitalPin()
|
||||
: mask(digitalPinToBitMask(Id))
|
||||
, port(digitalPinToPort(Id)) {
|
||||
}
|
||||
};
|
||||
|
||||
/// Digital Output class.
|
||||
template <int Id>
|
||||
class DigitalOutput {
|
||||
public:
|
||||
/// Constructor.
|
||||
DigitalOutput()
|
||||
: m_output(*portOutputRegister(m_pin.port)) {
|
||||
*portModeRegister(m_pin.port) |= m_pin.mask;
|
||||
}
|
||||
|
||||
/// Sets output high.
|
||||
void setHigh() const {
|
||||
m_output |= m_pin.mask;
|
||||
}
|
||||
|
||||
/// Sets output low.
|
||||
void setLow() const {
|
||||
m_output &= ~m_pin.mask;
|
||||
}
|
||||
|
||||
/// Sets output to the given value.
|
||||
void set(bool value) const {
|
||||
value ? setHigh() : setLow();
|
||||
}
|
||||
|
||||
/// Toggles the output.
|
||||
void toggle() const {
|
||||
m_output ^= m_pin.mask;
|
||||
}
|
||||
|
||||
/// Triggers a pulse of given duration.
|
||||
/// @param[in] duration is the duration in microseconds
|
||||
void pulse(uint16_t duration = 0) const {
|
||||
toggle();
|
||||
if (duration) {
|
||||
delayMicroseconds(duration);
|
||||
}
|
||||
toggle();
|
||||
}
|
||||
|
||||
private:
|
||||
const DigitalPin<Id> m_pin;
|
||||
volatile typename DigitalPin<Id>::RegType &m_output;
|
||||
};
|
||||
|
||||
/// Digital input class.
|
||||
template <int Id, bool Pullup = true>
|
||||
class DigitalInput {
|
||||
public:
|
||||
/// Constructor.
|
||||
DigitalInput()
|
||||
: m_input(*portInputRegister(m_pin.port)) {
|
||||
*portModeRegister(m_pin.port) &= ~m_pin.mask;
|
||||
if (Pullup) {
|
||||
*portOutputRegister(m_pin.port) |= m_pin.mask;
|
||||
}
|
||||
}
|
||||
|
||||
operator bool() const {
|
||||
return isHigh();
|
||||
}
|
||||
|
||||
/// Read raw bit data
|
||||
uint8_t read() const {
|
||||
return m_input & m_pin.mask;
|
||||
}
|
||||
|
||||
/// Checks if the input is high.
|
||||
bool isHigh() const {
|
||||
return read();
|
||||
}
|
||||
|
||||
/// Checks if the input is low
|
||||
bool isLow() const {
|
||||
return !read();
|
||||
}
|
||||
|
||||
/// Waits for an edge with given timeout.
|
||||
/// @param[in] edge is the type of edge to wait for
|
||||
/// @param[in] timeount is the timeout in microseconds
|
||||
uint16_t wait(Edge edge, uint16_t timeout) const {
|
||||
if (edge == Edge::falling) {
|
||||
return waitImpl(timeout, [](uint8_t a, uint8_t) {return a;});
|
||||
}
|
||||
if (edge == Edge::rising) {
|
||||
return waitImpl(timeout, [](uint8_t, uint8_t b) {return b;});
|
||||
}
|
||||
// edge == Edge::rising
|
||||
return waitImpl(timeout, [](uint8_t a, uint8_t b) {return a|b;});
|
||||
}
|
||||
|
||||
/// Waits for a state with given timeout.
|
||||
/// @param[in] state is the state to wait for
|
||||
/// @param[in] timeount is the timeout in microseconds
|
||||
uint16_t wait(bool state, uint16_t timeout) const {
|
||||
for (; state != isHigh() && timeout; timeout--)
|
||||
;
|
||||
return timeout;
|
||||
}
|
||||
|
||||
private:
|
||||
DigitalPin<Id> m_pin;
|
||||
volatile typename DigitalPin<Id>::RegType &m_input;
|
||||
|
||||
template <typename T>
|
||||
uint16_t waitImpl(uint16_t timeout, T compare) const {
|
||||
auto last = read();
|
||||
for (; timeout; timeout--) {
|
||||
const auto next = read();
|
||||
if (last != next) {
|
||||
if (compare(last, next)) {
|
||||
return timeout;
|
||||
}
|
||||
last = next;
|
||||
}
|
||||
}
|
||||
return 0u;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,89 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
// Simple GamePort pins to Arduino pins mapper.
|
||||
// GamePort pins <1>, <8>, <9> are already connected to "VCC" via the PCB
|
||||
template <int I>
|
||||
struct GamePort {
|
||||
enum { pin = -1 };
|
||||
};
|
||||
|
||||
// Analog: Button #1
|
||||
// Digital (e.g. SW3D): Clock
|
||||
template <>
|
||||
struct GamePort<2> {
|
||||
enum { pin = 10 };
|
||||
};
|
||||
|
||||
// Analog: Joystick1 X-Axis
|
||||
// Digital (e.g. SW3D): Trigger
|
||||
template <>
|
||||
struct GamePort<3> {
|
||||
enum { pin = A0 };
|
||||
};
|
||||
|
||||
// Analog: Joystick1 Y-Axis
|
||||
template <>
|
||||
struct GamePort<6> {
|
||||
enum { pin = A7 };
|
||||
};
|
||||
|
||||
// Analog: Button #2
|
||||
// Digital (e.g. SW3D): Data 0
|
||||
template <>
|
||||
struct GamePort<7> {
|
||||
enum { pin = 8 };
|
||||
};
|
||||
|
||||
// Analog: Button #3
|
||||
// Digital (e.g. SW3D): Data 1
|
||||
template <>
|
||||
struct GamePort<10> {
|
||||
enum { pin = 16 };
|
||||
};
|
||||
|
||||
// Analog: Joystick2 X-Axis
|
||||
template <>
|
||||
struct GamePort<11> {
|
||||
enum { pin = A1 };
|
||||
};
|
||||
|
||||
// Analog: Midi OUT
|
||||
template <>
|
||||
struct GamePort<12> {
|
||||
enum { pin = 5 };
|
||||
};
|
||||
|
||||
// Analog: Joystick2 Y-Axis
|
||||
template <>
|
||||
struct GamePort<13> {
|
||||
enum { pin = A6 };
|
||||
};
|
||||
|
||||
// Analog: Button #4
|
||||
// Digital (e.g. SW3D): Data 2
|
||||
template <>
|
||||
struct GamePort<14> {
|
||||
enum { pin = 7 };
|
||||
};
|
||||
|
||||
// Analog: Midi IN
|
||||
template <>
|
||||
struct GamePort<15> {
|
||||
enum { pin = 9 };
|
||||
};
|
||||
@@ -0,0 +1,54 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Joystick.h"
|
||||
#include "AnalogJoystick.h"
|
||||
|
||||
template <size_t Axes, size_t Buttons>
|
||||
class GenericJoystick : public Joystick {
|
||||
public:
|
||||
|
||||
static_assert(Axes > 0 && Axes <= 4);
|
||||
|
||||
bool init() override {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool update() override {
|
||||
for (auto i = 0u; i < Axes; i++) {
|
||||
m_state.axes[i] = m_joystick.getAxis(i);
|
||||
}
|
||||
m_state.buttons = m_joystick.getButtons();
|
||||
return true;
|
||||
}
|
||||
|
||||
const State& getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
const Description& getDescription() const override {
|
||||
static const Description description {
|
||||
"Generic Joystick", Axes, Buttons, 0
|
||||
};
|
||||
return description;
|
||||
}
|
||||
|
||||
private:
|
||||
AnalogJoystick m_joystick;
|
||||
State m_state;
|
||||
};
|
||||
@@ -0,0 +1,120 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "DigitalPin.h"
|
||||
#include "Joystick.h"
|
||||
|
||||
/// Class to communicate with Gravis joysticks using GrIP.
|
||||
/// @remark This is a green field implementation, but it was heavily
|
||||
/// inspired by Linux Gravis/Kensington GrIP driver
|
||||
/// implementation. See
|
||||
class GrIP : public Joystick {
|
||||
/// https://github.com/torvalds/linux/blob/master/drivers/input/joystick/grip.c
|
||||
public:
|
||||
/// Resets the joystick and tries to detect the model.
|
||||
bool init() override {
|
||||
while (!readPacket())
|
||||
;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Reads the joystick state.
|
||||
/// @returns the state of axis, buttons etc.
|
||||
/// @remark if reading the state fails, the last known state is
|
||||
/// returned and the joystick reset is executed.
|
||||
bool update() override {
|
||||
|
||||
const auto packet = readPacket();
|
||||
if (packet == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto getBit = [&](uint8_t pos) { return uint8_t(packet >> pos) & 1; };
|
||||
|
||||
m_state.axes[0] = map(1 + getBit(15) - getBit(16), 0, 2, 0, 1023);
|
||||
m_state.axes[1] = map(1 + getBit(13) - getBit(12), 0, 2, 0, 1023);
|
||||
|
||||
m_state.buttons = getBit(8);
|
||||
m_state.buttons |= getBit(3) << 1;
|
||||
m_state.buttons |= getBit(7) << 2;
|
||||
m_state.buttons |= getBit(6) << 3;
|
||||
m_state.buttons |= getBit(10) << 4;
|
||||
m_state.buttons |= getBit(11) << 5;
|
||||
m_state.buttons |= getBit(5) << 6;
|
||||
m_state.buttons |= getBit(2) << 7;
|
||||
m_state.buttons |= getBit(0) << 8;
|
||||
m_state.buttons |= getBit(1) << 9;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
const State &getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
const Description &getDescription() const override {
|
||||
static Description desc{"Gravis GamePad Pro", 2, 10, 0};
|
||||
return desc;
|
||||
}
|
||||
|
||||
private:
|
||||
/// Supported Gravis model types.
|
||||
///
|
||||
/// @remark currently only GamePad Pro is supported and
|
||||
// this enum is not used yet
|
||||
enum class Model {
|
||||
|
||||
/// Unknown model
|
||||
GRIP_UNKNOWN,
|
||||
|
||||
/// GamePad Pro
|
||||
GRIP_GAMEPAD_PRO,
|
||||
};
|
||||
|
||||
DigitalInput<GamePort<2>::pin, true> m_clock;
|
||||
DigitalInput<GamePort<7>::pin, true> m_data;
|
||||
State m_state;
|
||||
|
||||
/// Read bits packet from the joystick.
|
||||
uint32_t readPacket() const {
|
||||
|
||||
// Gravis GamePad Pro sends 24 bits long packages of data all the
|
||||
// time. Every package starts with a binary tag sequence 011111.
|
||||
|
||||
static const auto length = 24u;
|
||||
uint32_t result = 0u;
|
||||
|
||||
// read a package of 24 bits
|
||||
for (auto i = 0u; i < length; i++) {
|
||||
if (!m_clock.wait(Edge::falling, 100)) {
|
||||
return 0u;
|
||||
}
|
||||
result |= uint32_t(m_data.isHigh()) << i;
|
||||
}
|
||||
|
||||
// alighn the bits to have the binary tag in front. This code
|
||||
// was taken almost unchanged from the linux kernel.
|
||||
for (auto i = 0u; i < length; i++) {
|
||||
result = (result >> 1) | (result & 1) << (length - 1u);
|
||||
if ((result & 0xfe4210) == 0x7c0000) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return 0u;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,165 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <HID.h>
|
||||
|
||||
class HidDevice : public PluggableUSBModule {
|
||||
public:
|
||||
|
||||
explicit HidDevice()
|
||||
: PluggableUSBModule(1, 1, epType) {
|
||||
PluggableUSB().plug(this);
|
||||
}
|
||||
|
||||
void AppendDescriptor(HIDSubDescriptor *node) {
|
||||
|
||||
if (rootNode == nullptr) {
|
||||
rootNode = node;
|
||||
} else {
|
||||
auto current = rootNode;
|
||||
while (current->next) {
|
||||
current = current->next;
|
||||
}
|
||||
current->next = node;
|
||||
}
|
||||
descriptorSize += node->length;
|
||||
}
|
||||
|
||||
int SendReport(uint8_t id, const void *data, int len) const {
|
||||
|
||||
const auto ret = USB_Send(pluggedEndpoint, &id, 1);
|
||||
if (ret < 0) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
const auto ret2 = USB_Send(pluggedEndpoint | TRANSFER_RELEASE, data, len);
|
||||
if (ret2 < 0) {
|
||||
return ret2;
|
||||
}
|
||||
|
||||
return ret + ret2;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
int getInterface(uint8_t *interfaceCount) override {
|
||||
*interfaceCount += 1; // uses 1
|
||||
HIDDescriptor hidInterface {
|
||||
D_INTERFACE(pluggedInterface, 1, USB_DEVICE_CLASS_HUMAN_INTERFACE, HID_SUBCLASS_NONE, HID_PROTOCOL_NONE),
|
||||
D_HIDREPORT(descriptorSize),
|
||||
D_ENDPOINT(USB_ENDPOINT_IN(pluggedEndpoint), USB_ENDPOINT_TYPE_INTERRUPT, USB_EP_SIZE, 0x01)
|
||||
};
|
||||
return USB_SendControl(0, &hidInterface, sizeof(hidInterface));
|
||||
}
|
||||
|
||||
int getDescriptor(USBSetup &setup) override {
|
||||
|
||||
// Check if this is a HID Class Descriptor request
|
||||
if (setup.bmRequestType != REQUEST_DEVICETOHOST_STANDARD_INTERFACE) {
|
||||
return 0;
|
||||
}
|
||||
if (setup.wValueH != HID_REPORT_DESCRIPTOR_TYPE) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// In a HID Class Descriptor wIndex contains the interface number
|
||||
if (setup.wIndex != pluggedInterface) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int total = 0;
|
||||
for (auto node = rootNode; node; node = node->next) {
|
||||
const auto res = USB_SendControl(0, node->data, node->length);
|
||||
if (res < 0) {
|
||||
return -1;
|
||||
}
|
||||
total += res;
|
||||
}
|
||||
|
||||
// Reset the protocol on reenumeration. Normally the host should not
|
||||
// assume the state of the protocol due to the USB specs, but Windows
|
||||
// and Linux just assumes its in report mode.
|
||||
protocol = HID_REPORT_PROTOCOL;
|
||||
|
||||
return total;
|
||||
}
|
||||
|
||||
uint8_t getShortName(char *name) override {
|
||||
name[0] = 'H';
|
||||
name[1] = 'I';
|
||||
name[2] = 'D';
|
||||
name[3] = 'A' + (descriptorSize & 0x0F);
|
||||
name[4] = 'A' + ((descriptorSize >> 4) & 0x0F);
|
||||
return 5;
|
||||
}
|
||||
|
||||
bool setup(USBSetup &setup) override {
|
||||
|
||||
if (pluggedInterface != setup.wIndex) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto request = setup.bRequest;
|
||||
const auto requestType = setup.bmRequestType;
|
||||
|
||||
if (requestType == REQUEST_DEVICETOHOST_CLASS_INTERFACE) {
|
||||
if (request == HID_GET_REPORT) {
|
||||
// TODO: HID_GetReport();
|
||||
return true;
|
||||
}
|
||||
if (request == HID_GET_PROTOCOL) {
|
||||
// TODO: Send8(protocol);
|
||||
return true;
|
||||
}
|
||||
if (request == HID_GET_IDLE) {
|
||||
// TODO: Send8(idle);
|
||||
}
|
||||
}
|
||||
|
||||
if (requestType == REQUEST_HOSTTODEVICE_CLASS_INTERFACE) {
|
||||
if (request == HID_SET_PROTOCOL) {
|
||||
// The USB Host tells us if we are in boot or report mode.
|
||||
// This only works with a real boot compatible device.
|
||||
protocol = setup.wValueL;
|
||||
return true;
|
||||
}
|
||||
if (request == HID_SET_IDLE) {
|
||||
idle = setup.wValueL;
|
||||
return true;
|
||||
}
|
||||
if (request == HID_SET_REPORT) {
|
||||
// uint8_t reportID = setup.wValueL;
|
||||
// uint16_t length = setup.wLength;
|
||||
// uint8_t data[length];
|
||||
// Make sure to not read more data than USB_EP_SIZE.
|
||||
// You can read multiple times through a loop.
|
||||
// The first byte (may!) contain the reportID on a multreport.
|
||||
// USB_RecvControl(data, length);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
uint8_t epType[1]{EP_TYPE_INTERRUPT_IN};
|
||||
HIDSubDescriptor *rootNode{nullptr};
|
||||
uint16_t descriptorSize{0};
|
||||
uint8_t protocol{HID_REPORT_PROTOCOL};
|
||||
uint8_t idle{1};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Buffer.h"
|
||||
#include "HidDevice.h"
|
||||
#include "Joystick.h"
|
||||
#include "Utilities.h"
|
||||
#include <Arduino.h>
|
||||
|
||||
class HidJoystick {
|
||||
public:
|
||||
bool init(Joystick *joystick) {
|
||||
if (!joystick || !joystick->init()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_joystick = joystick;
|
||||
m_hidDescription = createDescription(*m_joystick);
|
||||
m_subDescriptor = new HIDSubDescriptor{m_hidDescription.data, m_hidDescription.size};
|
||||
m_hidDevice.AppendDescriptor(m_subDescriptor);
|
||||
|
||||
log("Detected device: %s", joystick->getDescription().name);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool update() {
|
||||
if (!m_joystick || !m_joystick->update()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto packet = createPacket(*m_joystick);
|
||||
m_hidDevice.SendReport(DEVICE_ID, packet.data, packet.size);
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
using BufferType = Buffer<255>;
|
||||
static const uint8_t DEVICE_ID{3};
|
||||
|
||||
static BufferType createDescription(const Joystick &joystick) {
|
||||
|
||||
enum class ID : uint8_t {
|
||||
application = 0x01,
|
||||
button = 0x09,
|
||||
collection = 0xa1,
|
||||
end_collection = 0xc0,
|
||||
generic_desktop = 0x01,
|
||||
hat_switch = 0x39,
|
||||
input = 0x81,
|
||||
input_const = 0x03,
|
||||
input_data = 0x02,
|
||||
joystick = 0x04,
|
||||
logical_max = 0x26,
|
||||
logical_min = 0x15,
|
||||
report_count = 0x95,
|
||||
report_id = 0x85,
|
||||
report_size = 0x75,
|
||||
simulation_controls = 0x02,
|
||||
throttle = 0xbb,
|
||||
usage = 0x09,
|
||||
usage_max = 0x29,
|
||||
usage_min = 0x19,
|
||||
usage_page = 0x05,
|
||||
};
|
||||
|
||||
const auto &desc = joystick.getDescription();
|
||||
BufferType buffer;
|
||||
auto filler = BufferFiller(buffer);
|
||||
|
||||
auto pushData = [&filler](uint8_t size, uint8_t count) {
|
||||
filler.push(ID::report_size).push(size);
|
||||
filler.push(ID::report_count).push(count);
|
||||
filler.push(ID::input).push(ID::input_data);
|
||||
const auto padding = (size * count) % 8u;
|
||||
if (padding) {
|
||||
filler.push(ID::report_size).push<uint8_t>(8u - padding);
|
||||
filler.push(ID::report_count).push<uint8_t>(1);
|
||||
filler.push(ID::input).push(ID::input_const);
|
||||
}
|
||||
};
|
||||
|
||||
filler.push(ID::usage_page).push(ID::generic_desktop);
|
||||
filler.push(ID::usage).push(ID::joystick);
|
||||
filler.push(ID::collection).push(ID::application);
|
||||
filler.push(ID::report_id).push<uint8_t>(DEVICE_ID);
|
||||
|
||||
// Push axes
|
||||
if (desc.numAxes > 0) {
|
||||
filler.push(ID::usage_page).push(ID::generic_desktop);
|
||||
for (auto i = 0u; i < desc.numAxes; i++) {
|
||||
static constexpr uint8_t x_axis = 0x30;
|
||||
filler.push(ID::usage).push<uint8_t>(x_axis + i);
|
||||
}
|
||||
filler.push(ID::logical_min).push<uint8_t>(0);
|
||||
filler.push(ID::logical_max).push<uint16_t>(1023);
|
||||
pushData(10, desc.numAxes);
|
||||
}
|
||||
|
||||
// Push hat
|
||||
if (desc.hasHat) {
|
||||
filler.push(ID::usage).push(ID::hat_switch);
|
||||
filler.push(ID::logical_min).push<uint8_t>(1);
|
||||
filler.push(ID::logical_max).push<uint16_t>(8);
|
||||
pushData(4, 1);
|
||||
}
|
||||
|
||||
// Push buttons
|
||||
if (desc.numButtons > 0) {
|
||||
filler.push(ID::usage_page).push(ID::button);
|
||||
filler.push(ID::usage_min).push<uint8_t>(1);
|
||||
filler.push(ID::usage_max).push<uint8_t>(desc.numButtons);
|
||||
filler.push(ID::logical_min).push<uint8_t>(0);
|
||||
filler.push(ID::logical_max).push<uint16_t>(1);
|
||||
pushData(1, desc.numButtons);
|
||||
}
|
||||
|
||||
filler.push(ID::end_collection);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static BufferType createPacket(const Joystick &joystick) {
|
||||
|
||||
const auto &state = joystick.getState();
|
||||
const auto &description = joystick.getDescription();
|
||||
BufferType buffer;
|
||||
auto filler = BufferFiller(buffer);
|
||||
|
||||
for (auto i = 0u; i < description.numAxes; i++) {
|
||||
filler.push(state.axes[i], 10);
|
||||
}
|
||||
filler.align();
|
||||
|
||||
if (description.hasHat) {
|
||||
filler.push(state.hat, 4);
|
||||
filler.align();
|
||||
}
|
||||
|
||||
if (description.numButtons) {
|
||||
filler.push(state.buttons, description.numButtons);
|
||||
filler.align();
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
Joystick *m_joystick{};
|
||||
BufferType m_hidDescription{};
|
||||
HIDSubDescriptor *m_subDescriptor{};
|
||||
HidDevice m_hidDevice;
|
||||
};
|
||||
@@ -0,0 +1,94 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
/// Base class for all joysticks.
|
||||
class Joystick {
|
||||
public:
|
||||
static const auto MAX_AXES{16u};
|
||||
|
||||
/// Device description.
|
||||
///
|
||||
/// This structure is used to generate the HID description
|
||||
/// and USB data packages
|
||||
struct Description {
|
||||
|
||||
/// Human readable name.
|
||||
const char* name;
|
||||
|
||||
/// Number of supported axes.
|
||||
uint8_t numAxes;
|
||||
|
||||
/// Number of supported buttons.
|
||||
uint8_t numButtons;
|
||||
|
||||
/// Has HAT.
|
||||
bool hasHat;
|
||||
};
|
||||
|
||||
/// Joystick state.
|
||||
struct State {
|
||||
|
||||
/// Axes.
|
||||
///
|
||||
/// To keep it simple all axes are unified to 10 bits
|
||||
/// resolution. Every joystick has to map it's values
|
||||
/// to the values 0..1023 independent from the internal
|
||||
/// resolution of the device.
|
||||
uint16_t axes[MAX_AXES]{};
|
||||
|
||||
/// Hats.
|
||||
///
|
||||
/// HAT is represented through values 0..8 1 is up, 2 is
|
||||
/// 45° clockwise, 3 is right etc. Center is represented
|
||||
/// with zero.
|
||||
uint8_t hat{};
|
||||
|
||||
/// Buttons.
|
||||
///
|
||||
/// Every bit is a button. 1 is pressed, 0 is released
|
||||
uint16_t buttons{};
|
||||
};
|
||||
|
||||
/// Initialize joystick.
|
||||
///
|
||||
/// @returns True on successful initialization
|
||||
virtual bool init() = 0;
|
||||
|
||||
/// Update state.
|
||||
///
|
||||
/// This function is called every time the joystick
|
||||
/// state has to be updated.
|
||||
///
|
||||
/// @returns True on successful initialization
|
||||
virtual bool update() = 0;
|
||||
|
||||
/// Gets the State of the Joystick.
|
||||
virtual const State &getState() const = 0;
|
||||
|
||||
/// Gets the Description of the Joystick.
|
||||
virtual const Description &getDescription() const = 0;
|
||||
|
||||
Joystick() = default;
|
||||
virtual ~Joystick() = default;
|
||||
Joystick(const Joystick &) = delete;
|
||||
Joystick(Joystick &&) = delete;
|
||||
Joystick &operator=(const Joystick &) = delete;
|
||||
Joystick &operator=(Joystick &&) = delete;
|
||||
};
|
||||
Executable
+357
@@ -0,0 +1,357 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "DigitalPin.h"
|
||||
#include "GamePort.h"
|
||||
#include "Joystick.h"
|
||||
#include "Utilities.h"
|
||||
|
||||
class Logitech : public Joystick {
|
||||
public:
|
||||
bool init() override {
|
||||
enableDigitalMode();
|
||||
if (!readMetaData()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create joystick description
|
||||
m_description.name = m_metaData.deviceName;
|
||||
m_description.numAxes = min(Joystick::MAX_AXES,
|
||||
m_metaData.num10bitAxes +
|
||||
m_metaData.num8bitAxes +
|
||||
m_metaData.numSecondaryHats * 2); // Each hat is mapped to two axes
|
||||
m_description.numButtons = m_metaData.numPrimaryButtons + m_metaData.numSecondaryButtons;
|
||||
m_description.hasHat = m_metaData.hasHat;
|
||||
|
||||
// If the device is a Logitech ThunderPad Digital, manually redefine the gamepad layout to 2 axes and 8 buttons
|
||||
if(m_metaData.deviceID == DEVICE_THUNDERPAD_DIGITAL){
|
||||
m_description.numAxes = 2;
|
||||
m_description.numButtons = 8;
|
||||
m_description.hasHat = 0;
|
||||
}
|
||||
// If the device is a Logitech WingMan Gamepad, manually redefine the gamepad layout to 2 axes and 11 buttons
|
||||
else if(m_metaData.deviceID == DEVICE_WINGMAN_GAMEPAD){
|
||||
m_description.numAxes = 2;
|
||||
m_description.numButtons = 11;
|
||||
m_description.hasHat = 0;
|
||||
}
|
||||
|
||||
// Initialize axes centers
|
||||
uint8_t axis = 0u;
|
||||
for (auto i = 0u; i < m_metaData.num10bitAxes; i++, axis++) {
|
||||
m_limits[axis] = { 512 - 256, 512 + 256 };
|
||||
}
|
||||
for (auto i = 0u; i < m_metaData.num8bitAxes; i++, axis++) {
|
||||
m_limits[axis] = { 128 - 64, 128 + 64 };
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool update() override {
|
||||
|
||||
// === Status packet format ===
|
||||
//
|
||||
// Offset Bits Description
|
||||
// --------------------------------------------------------
|
||||
// 0 4 Low nibble of the Device ID
|
||||
// 4 4 High nibble of the Device ID
|
||||
// 8 10*N 10bit axes (N is number of axes)
|
||||
// ? 8*N 8bit axes (N is number of axes)
|
||||
// ? 1*N Buttons (N is number of buttons)
|
||||
// ? R*N Hats (R is resolution, N is number of hats)
|
||||
// ? 1*N Secondary buttons (N is number of buttons)
|
||||
|
||||
// Cyberman 2 seems not to work properly if the packets are
|
||||
// read too fast. Following delay will ensure, that after the
|
||||
// last read at least 5ms passed to ensure, that the joystick
|
||||
// cooled down again.
|
||||
delayMicroseconds(5000);
|
||||
|
||||
const auto packet = readPacket();
|
||||
|
||||
if (packet.size != m_metaData.packageSize) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto packetID = getBits(packet, 0, 4) | getBits(packet, 4, 4) << 4;
|
||||
if (packetID != m_metaData.deviceID) {
|
||||
return false;
|
||||
}
|
||||
|
||||
State state;
|
||||
uint16_t offset = 8u;
|
||||
|
||||
uint8_t axis = 0u;
|
||||
for (auto i = 0u; i < m_metaData.num10bitAxes; i++, axis++) {
|
||||
state.axes[axis] = mapAxisValue(axis, getBits(packet, offset, 10));
|
||||
offset += 10;
|
||||
}
|
||||
|
||||
for (auto i = 0u; i < m_metaData.num8bitAxes; i++, axis++) {
|
||||
state.axes[axis] = mapAxisValue(axis, getBits(packet, offset, 8));
|
||||
offset += 8;
|
||||
}
|
||||
|
||||
uint16_t button = 0u;
|
||||
for (auto i = 0u; i < m_metaData.numPrimaryButtons; i++) {
|
||||
state.buttons |= getBits(packet, offset++, 1) << button++;
|
||||
}
|
||||
|
||||
if (m_metaData.hasHat) {
|
||||
|
||||
const auto hatResolution = getHatResolution();
|
||||
state.hat = mapHatValue(getBits(packet, offset, hatResolution));
|
||||
offset += hatResolution;
|
||||
|
||||
// Secondary hats are all shown as dual axes
|
||||
for (auto i = 0u; i < m_metaData.numSecondaryHats; i++, axis += 2) {
|
||||
const auto value = mapHatValue(getBits(packet, offset, hatResolution));
|
||||
offset += hatResolution;
|
||||
static constexpr uint16_t dx[] = { 511, 511, 1023, 1023, 1023, 511, 0, 0, 0 };
|
||||
static constexpr uint16_t dy[] = { 511, 0, 0, 511, 1023, 1023, 1023, 511, 0 };
|
||||
state.axes[axis + 0] = dx[value];
|
||||
state.axes[axis + 1] = dy[value];
|
||||
}
|
||||
}
|
||||
|
||||
for (auto i = 0u; i < m_metaData.numSecondaryButtons; i++) {
|
||||
state.buttons |= getBits(packet, offset++, 1) << button++;
|
||||
}
|
||||
|
||||
// If the device is a Logitech ThunderPad Digital, manually remap up, down, left and right buttons to X and Y axes
|
||||
if(m_metaData.deviceID == DEVICE_THUNDERPAD_DIGITAL){
|
||||
const auto value = getBits(packet, 12, 4);
|
||||
static constexpr uint16_t dx[] = { 511, 0, 511, 0, 1023, 511, 1023, 511, 511, 0, 511, 0, 1023, 511, 1023, 511 };
|
||||
static constexpr uint16_t dy[] = { 511, 511, 1023, 1023, 511, 511, 1023, 1023, 0, 0, 511, 511, 0, 0, 511, 511 };
|
||||
state.axes[0] = dx[value];
|
||||
state.axes[1] = dy[value];
|
||||
|
||||
state.buttons &= 0xFF0F;
|
||||
state.buttons |= (state.buttons & 0x0F00) >> 4;
|
||||
}
|
||||
// If the device is a Logitech WingMan Gamepad, manually remap up, down, left and right buttons to X and Y axes
|
||||
else if(m_metaData.deviceID == DEVICE_WINGMAN_GAMEPAD){
|
||||
const auto value = getBits(packet, 8, 4);
|
||||
static constexpr uint16_t dx[] = { 511, 0, 511, 0, 1023, 511, 1023, 511, 511, 0, 511, 0, 1023, 511, 1023, 511 };
|
||||
static constexpr uint16_t dy[] = { 511, 511, 1023, 1023, 511, 511, 1023, 1023, 0, 0, 511, 511, 0, 0, 511, 511 };
|
||||
state.axes[0] = dx[value];
|
||||
state.axes[1] = dy[value];
|
||||
|
||||
state.buttons >>= 4;
|
||||
}
|
||||
|
||||
m_state = state;
|
||||
return true;
|
||||
}
|
||||
|
||||
const State &getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
const Description &getDescription() const override {
|
||||
return m_description;
|
||||
}
|
||||
|
||||
private:
|
||||
struct MetaData {
|
||||
char deviceName[32]{};
|
||||
uint8_t deviceID{};
|
||||
uint8_t packageSize{};
|
||||
uint8_t num8bitAxes{};
|
||||
uint8_t num10bitAxes{};
|
||||
uint8_t numPrimaryButtons{};
|
||||
uint8_t numSecondaryButtons{};
|
||||
uint8_t numSecondaryHats{};
|
||||
uint8_t hasHat{};
|
||||
uint8_t numHatDirections{};
|
||||
};
|
||||
|
||||
struct Limits {
|
||||
uint16_t min, max;
|
||||
};
|
||||
|
||||
// Logitech Device ID constants, taken from the Linux Kernel ADI driver
|
||||
enum LogitechDevices{
|
||||
DEVICE_WINGMAN_EXTREME_DIGITAL = 0x00,
|
||||
DEVICE_THUNDERPAD_DIGITAL = 0x01,
|
||||
DEVICE_SIDECAR = 0x02,
|
||||
DEVICE_CYBERMAN2 = 0x03,
|
||||
DEVICE_WINGMAN_INTERCEPTOR = 0x04,
|
||||
DEVICE_WINGMAN_FORMULA = 0x05,
|
||||
DEVICE_WINGMAN_GAMEPAD = 0x06,
|
||||
DEVICE_WINGMAN_EXTREME_DIGITAL_3D = 0x07,
|
||||
DEVICE_WINGMAN_GAMEPAD_EXTREME = 0x08,
|
||||
DEVICE_WINGMAN_GAMEPAD_USB = 0x09
|
||||
};
|
||||
|
||||
uint16_t mapAxisValue(uint8_t axis, uint16_t value) {
|
||||
if (value < m_limits[axis].min) {
|
||||
m_limits[axis].min = value;
|
||||
} else if (value > m_limits[axis].max) {
|
||||
m_limits[axis].max = value;
|
||||
}
|
||||
return map(value, m_limits[axis].min, m_limits[axis].max, 0, 1023);
|
||||
}
|
||||
|
||||
uint8_t mapHatValue(uint16_t value) const {
|
||||
return map(value, 0, m_metaData.numHatDirections, 0, 8);
|
||||
}
|
||||
|
||||
uint8_t getHatResolution() const {
|
||||
uint8_t result = 0u;
|
||||
for (auto value = m_metaData.numHatDirections; value; value >>= 1) {
|
||||
result++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Internal bit structure which is filled by reading from the joystick.
|
||||
using Packet = Buffer<255>;
|
||||
|
||||
static uint16_t getBits(const Packet& packet, uint8_t offset, uint8_t count) {
|
||||
uint16_t result = 0u;
|
||||
if (offset < packet.size && count <= (packet.size - offset)) {
|
||||
for (auto i = 0u; i < count; i++) {
|
||||
result = (result << 1) | packet.data[offset + i];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
DigitalOutput<GamePort<3>::pin> m_trigger;
|
||||
DigitalInput<GamePort<2>::pin, true> m_data0;
|
||||
DigitalInput<GamePort<7>::pin, true> m_data1;
|
||||
MetaData m_metaData;
|
||||
Description m_description;
|
||||
State m_state;
|
||||
Limits m_limits[Joystick::MAX_AXES];
|
||||
|
||||
void enableDigitalMode() const {
|
||||
static constexpr uint16_t seq[] = {4, 2, 3, 10, 6, 11, 7, 9, 11, 0};
|
||||
|
||||
// Some devices, as the Logitech ThunderPad Digital, require some time for its
|
||||
// microcontroller to initialize; otherwise the enableDigitalMode command is skipped
|
||||
// and the device stays in analog mode. Don't use values higher than 100ms, they could
|
||||
// interfere with the USB initialization
|
||||
delay(100);
|
||||
|
||||
for (auto i = 0u; seq[i]; i++) {
|
||||
m_trigger.pulse(20u);
|
||||
delay(seq[i]);
|
||||
}
|
||||
}
|
||||
|
||||
byte readData() const {
|
||||
const auto b0 = m_data0.read();
|
||||
const auto b1 = m_data1.read();
|
||||
return bool(b0) | bool(b1) << 1;
|
||||
}
|
||||
|
||||
Packet readPacket() const {
|
||||
static constexpr auto TIMEOUT = 32u;
|
||||
auto timeout = TIMEOUT;
|
||||
auto first = true;
|
||||
Packet packet;
|
||||
const InterruptStopper noirq;
|
||||
auto last = readData();
|
||||
m_trigger.setHigh();
|
||||
while (timeout-- && packet.size < Packet::MAX_SIZE) {
|
||||
const auto next = readData();
|
||||
const auto edge = last ^ next;
|
||||
if (edge) {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
// Normally both data bits should never flip simultaneously.
|
||||
// We should get either 10, when data1 has flipped, or 01,
|
||||
// when data0 has flipped. So if we just shift the edge to
|
||||
// the right once, we will get the needed 1 or 0 bit value.
|
||||
packet.data[packet.size++] = edge >> 1;
|
||||
}
|
||||
last = next;
|
||||
timeout = TIMEOUT;
|
||||
}
|
||||
}
|
||||
m_trigger.setLow();
|
||||
return packet;
|
||||
}
|
||||
|
||||
bool readMetaData() {
|
||||
|
||||
// === Metadata packet format ===
|
||||
//
|
||||
// Offset Bits Description
|
||||
// --------------------------------------------------------
|
||||
// 0 10 Metadata package size
|
||||
// 10 4 Low nibble of the Device ID
|
||||
// 14 4 High nibble of the Device ID
|
||||
// 18 4 Feature flags
|
||||
// 22 10 Status package size
|
||||
// 32 4 Number of axes (0..15)
|
||||
// 36 6 Number of buttons (0..63)
|
||||
// 42 6 Number of hat directions (0..63)
|
||||
// 48 6 Number of secondary buttons (0..63)
|
||||
// 54 4 Number of secondary hats (0..15)
|
||||
// 58 4 Number of 8-bit axes (0..15)
|
||||
// 62 4 Length of the cname in bytes (0..15)
|
||||
// 66 8*N Characters of the cname (N is the length)
|
||||
|
||||
// === Flags ===
|
||||
//
|
||||
// Bit Description
|
||||
// ---------------------
|
||||
// 1 Reserved
|
||||
// 2 Reserved
|
||||
// 3 Has Hat
|
||||
// 4 Has 10-bit axes
|
||||
|
||||
const auto packet = readPacket();
|
||||
|
||||
const auto metaSize = getBits(packet, 0, 10);
|
||||
if (metaSize != packet.size) {
|
||||
log("Meta data package size mismatch, expected %d but got %d", packet.size, metaSize);
|
||||
return false;
|
||||
}
|
||||
|
||||
m_metaData.deviceID = getBits(packet, 10, 4) | getBits(packet, 14, 4) << 4;
|
||||
const auto flags = getBits(packet, 18, 4);
|
||||
m_metaData.hasHat = flags & 0x4;
|
||||
m_metaData.packageSize = getBits(packet, 22, 10);
|
||||
const auto numTotalAxes = getBits(packet, 32, 4);
|
||||
m_metaData.numPrimaryButtons = getBits(packet, 36, 6);
|
||||
m_metaData.numHatDirections = getBits(packet, 42, 6);
|
||||
m_metaData.numSecondaryButtons = getBits(packet, 48, 6);
|
||||
m_metaData.numSecondaryHats = getBits(packet, 54, 4);
|
||||
const auto num8bitAxes = getBits(packet, 58, 4);
|
||||
if (flags & 0x8) {
|
||||
m_metaData.num10bitAxes = numTotalAxes - num8bitAxes;
|
||||
m_metaData.num8bitAxes = num8bitAxes;
|
||||
} else {
|
||||
m_metaData.num8bitAxes = numTotalAxes;
|
||||
m_metaData.num10bitAxes = 0u;
|
||||
}
|
||||
const auto cnameLength = getBits(packet, 62, 4);
|
||||
m_metaData.deviceName[cnameLength] = 0;
|
||||
for (auto i = 0u; i < cnameLength; i++) {
|
||||
m_metaData.deviceName[i] = getBits(packet, 66 + 8 * i, 8);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,514 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Buffer.h"
|
||||
#include "DigitalPin.h"
|
||||
#include "Joystick.h"
|
||||
#include "Utilities.h"
|
||||
|
||||
/// Class to for communication with Sidewinder joysticks.
|
||||
/// @remark This is a green field implementation, but it was heavily
|
||||
/// inspired by Linux Sidewinder driver implementation. See
|
||||
/// https://github.com/torvalds/linux/blob/master/drivers/input/joystick/sidewinder.c
|
||||
class Sidewinder : public Joystick {
|
||||
public:
|
||||
/// Resets the joystick and tries to detect the model.
|
||||
bool init() override {
|
||||
log("Sidewinder init...");
|
||||
m_errors = 0;
|
||||
|
||||
m_model = guessModel(readPacket());
|
||||
while (m_model == Model::SW_UNKNOWN) {
|
||||
// No data. 3d Pro analog mode?
|
||||
enableDigitalMode();
|
||||
m_model = guessModel(readPacket());
|
||||
}
|
||||
log("Detected model %d", m_model);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool update() override {
|
||||
const auto packet = readPacket();
|
||||
State state;
|
||||
if (decode(packet, state)) {
|
||||
m_state = state;
|
||||
m_errors = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
m_errors++;
|
||||
log("Packet decoding failed %d time(s)", m_errors);
|
||||
if (m_errors > 5) {
|
||||
return init();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const State &getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
const Description &getDescription() const override;
|
||||
|
||||
private:
|
||||
/// Supported Sidewinder model types.
|
||||
enum class Model {
|
||||
/// Unknown model.
|
||||
SW_UNKNOWN,
|
||||
|
||||
/// Sidewinder GamePad
|
||||
SW_GAMEPAD,
|
||||
|
||||
/// Sidewinder 3D Pro
|
||||
SW_3D_PRO,
|
||||
|
||||
/// Sidewinder Precision Pro
|
||||
SW_PRECISION_PRO,
|
||||
|
||||
/// Sidewinder Force Feedback Pro
|
||||
SW_FORCE_FEEDBACK_PRO,
|
||||
|
||||
/// Sidewinder Force Feedback Wheel
|
||||
SW_FORCE_FEEDBACK_WHEEL
|
||||
};
|
||||
|
||||
/// Internal bit structure which is filled by reading from the joystick.
|
||||
using Packet = Buffer<128u>;
|
||||
|
||||
/// Model specific status decoder function.
|
||||
template <Model M>
|
||||
struct Decoder {
|
||||
static const Description &getDescription();
|
||||
static bool decode(const Packet &packet, State &state);
|
||||
};
|
||||
|
||||
/// Guesses joystick model from the size of the packet.
|
||||
Model guessModel(const Packet &packet) const {
|
||||
log("Guessing model by packet size of %d", packet.size);
|
||||
switch (packet.size) {
|
||||
case 15:
|
||||
return Model::SW_GAMEPAD;
|
||||
case 16: // 3bit mode
|
||||
case 48: { // 1bit mode
|
||||
const auto id = readID(packet.size);
|
||||
log("Data packet size is ambiguous. Guessing by ID %d", id);
|
||||
if (id == 14) {
|
||||
return Model::SW_FORCE_FEEDBACK_PRO;
|
||||
}
|
||||
return Model::SW_PRECISION_PRO;
|
||||
}
|
||||
case 11: // 3bit mode
|
||||
case 33: // 1bit mode
|
||||
return Model::SW_FORCE_FEEDBACK_WHEEL;
|
||||
case 64:
|
||||
return Model::SW_3D_PRO;
|
||||
default:
|
||||
return Model::SW_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
void cooldown() const {
|
||||
m_trigger.setLow();
|
||||
delay(3);
|
||||
}
|
||||
|
||||
void trigger() const {
|
||||
m_trigger.pulse(20);
|
||||
}
|
||||
|
||||
DigitalInput<GamePort<2>::pin, true> m_clock;
|
||||
DigitalInput<GamePort<7>::pin, true> m_data0;
|
||||
DigitalInput<GamePort<10>::pin, true> m_data1;
|
||||
DigitalInput<GamePort<14>::pin, true> m_data2;
|
||||
DigitalOutput<GamePort<3>::pin> m_trigger;
|
||||
Model m_model{Model::SW_UNKNOWN};
|
||||
State m_state{};
|
||||
uint8_t m_errors{};
|
||||
|
||||
/// Enables digital mode for 3D Pro.
|
||||
//
|
||||
/// The 3D Pro can work as legacy analog joystick or in digital mode.
|
||||
/// This mode has to be activated explicitly. In this function timing
|
||||
/// is very important. See Patent: US#5628686 (page 19) for details.
|
||||
void enableDigitalMode() const {
|
||||
static const uint16_t magic = 150;
|
||||
static const uint16_t seq[] = {magic, magic + 725, magic + 300, magic, 0};
|
||||
log("Trying to enable digital mode");
|
||||
cooldown();
|
||||
const InterruptStopper interruptStopper;
|
||||
for (auto i = 0u; seq[i]; i++) {
|
||||
trigger();
|
||||
delayMicroseconds(seq[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/// Read bits packet from the joystick.
|
||||
///
|
||||
/// This part is extremely performance and timing critical. Change only, if
|
||||
/// you know, what you are doing.
|
||||
Packet readPacket() const {
|
||||
|
||||
// Packet instantiation is a very expensive call, which zeros the memory.
|
||||
// The instantiation should therefore happen outside of the interrupt stopper
|
||||
// and before triggering the device. Otherwise the clock will come before
|
||||
// the packet was zeroed/instantiated.
|
||||
Packet packet;
|
||||
|
||||
// We are reading into a byte array instead of an uint64_t, because of two
|
||||
// reasons. First, bits packets can be larger, than 64 bits. We are actually
|
||||
// not interested in packets, which are larger than that, but may be in the
|
||||
// future we'd need to handle them as well. Second, for reading into an
|
||||
// uint64_t we would need to shift between the clock impulses, which is
|
||||
// impossible to do in time. Unfortunately this shift is extremely slow on
|
||||
// an Arduino and it's just faster to write into an array. One bit per byte.
|
||||
packet.size = readBits(Packet::MAX_SIZE, [this, &packet](uint8_t pos) {
|
||||
const auto b1 = m_data0.read();
|
||||
const auto b2 = m_data1.read();
|
||||
const auto b3 = m_data2.read();
|
||||
packet.data[pos] = bool(b1) | bool(b2) << 1 | bool(b3) << 2;
|
||||
});
|
||||
|
||||
return packet;
|
||||
}
|
||||
|
||||
uint8_t readID(uint8_t dataPacketSize) const {
|
||||
|
||||
const auto rise = dataPacketSize / 2 - 1;
|
||||
const auto fall = rise + 2;
|
||||
|
||||
const auto count = readBits(255u, [this, rise, fall](uint8_t pos) {
|
||||
if (pos == rise) {
|
||||
m_trigger.setHigh();
|
||||
}
|
||||
else if (pos == fall) {
|
||||
m_trigger.setLow();
|
||||
}
|
||||
});
|
||||
return count < dataPacketSize ? 0 : count - dataPacketSize;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
uint8_t readBits(uint8_t maxCount, T&& extract) const {
|
||||
static const uint8_t wait_duration = 100;
|
||||
uint8_t count{};
|
||||
cooldown();
|
||||
// WARNING: Here starts the timing critical section
|
||||
const InterruptStopper interruptStopper;
|
||||
trigger();
|
||||
if (m_clock.wait(true, wait_duration)) {
|
||||
while(count < maxCount && m_clock.wait(Edge::rising, wait_duration)) {
|
||||
extract(count++);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/// Decodes bit packet into a state.
|
||||
bool decode(const Packet &packet, State &state) const;
|
||||
};
|
||||
|
||||
/// Placeholder for Unknown Device
|
||||
template <>
|
||||
class Sidewinder::Decoder<Sidewinder::Model::SW_UNKNOWN> {
|
||||
public:
|
||||
static const Description &getDescription() {
|
||||
static const Description desc{"Unknown", 0, 0, 0};
|
||||
return desc;
|
||||
}
|
||||
|
||||
static bool decode(const Packet &, State &) {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/// Bit decoder for Sidewinder GamePad.
|
||||
template <>
|
||||
class Sidewinder::Decoder<Sidewinder::Model::SW_GAMEPAD> {
|
||||
public:
|
||||
static const Description &getDescription() {
|
||||
static const Description desc{"MS Sidewinder GamePad", 2, 10, 0};
|
||||
return desc;
|
||||
}
|
||||
|
||||
static bool decode(const Packet &packet, State &state) {
|
||||
|
||||
const auto checksum = [&]() {
|
||||
byte result = 0u;
|
||||
for (auto i = 0u; i < packet.size; i++) {
|
||||
result ^= packet.data[i] & 1;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
if (packet.size != 15 || checksum() != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Bit 0-1: x-axis (10-left, 01-right, 11-middle)
|
||||
// Bit 2-3: y-axis (01-up, 10-down, 11-middle)
|
||||
// Bit 4-13: 10 buttons
|
||||
// Bit 14: checksum
|
||||
for (auto i = 0u; i < 10; i++) {
|
||||
state.buttons |= (~packet.data[i + 4] & 1) << i;
|
||||
}
|
||||
state.axes[0] = map(1 + packet.data[3] - packet.data[2], 0, 2, 0, 1023);
|
||||
state.axes[1] = map(1 + packet.data[0] - packet.data[1], 0, 2, 0, 1023);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/// Bit decoder for Sidewinder 3D Pro.
|
||||
template <>
|
||||
class Sidewinder::Decoder<Sidewinder::Model::SW_3D_PRO> {
|
||||
public:
|
||||
static const Description &getDescription() {
|
||||
static const Description desc{"MS Sidewinder 3D Pro", 4, 8, 1};
|
||||
return desc;
|
||||
}
|
||||
|
||||
static bool decode(const Packet &packet, State &state) {
|
||||
const auto value = [&]() {
|
||||
uint64_t result{0u};
|
||||
for (auto i = 0u; i < packet.size; i++) {
|
||||
result |= uint64_t(packet.data[i] & 1) << i;
|
||||
}
|
||||
return result;
|
||||
}();
|
||||
|
||||
const auto bits = [&](uint8_t start, uint8_t length) {
|
||||
const auto mask = (1 << length) - 1;
|
||||
return (value >> start) & mask;
|
||||
};
|
||||
|
||||
if (packet.size != 64 || !checkSync(value) || checksum(value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bit 38: button 8 + bit 8-15: buttons 1-7 (low active)
|
||||
state.buttons = ~(bits(8, 7) | (bits(38, 1) << 7));
|
||||
|
||||
// bit 3-5 + bit 16-22: x-axis (value 0-1023)
|
||||
state.axes[0] = bits(3, 3) << 7 | bits(16, 7);
|
||||
|
||||
// bit 0-2 + bit 24-30: y-axis (value 0-1023)
|
||||
state.axes[1] = bits(0, 3) << 7 | bits(24, 7);
|
||||
|
||||
// bit 35-36 + bit 40-46: z-axis (value 0-511)
|
||||
state.axes[2] = map(bits(35, 2) << 7 | bits(40, 7), 0, 511, 0, 1023);
|
||||
|
||||
// bit 32-34 + bit 48-54: throttle-axis (value 0-1023)
|
||||
state.axes[3] = bits(32, 3) << 7 | bits(48, 7);
|
||||
|
||||
// bit 6-7 + bit 60-62 (9 pos, 0 center, 1-8 clockwise)
|
||||
state.hat = bits(6, 1) << 3 | bits(60, 3);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
/// Checks sync bits.
|
||||
///
|
||||
/// This code was taken from Linux driver as is.
|
||||
static bool checkSync(uint64_t value) {
|
||||
return !((value & 0x8080808080808080ULL) ^ 0x80);
|
||||
}
|
||||
|
||||
/// Calculates checksum.
|
||||
///
|
||||
/// This code was taken from Linux driver as is.
|
||||
static byte checksum(uint64_t value) {
|
||||
auto result = 0u;
|
||||
while (value) {
|
||||
result += value & 0xf;
|
||||
value >>= 4;
|
||||
}
|
||||
return result & 0xf;
|
||||
}
|
||||
};
|
||||
|
||||
/// Bit decoder for Sidewinder Precision Pro
|
||||
template <>
|
||||
class Sidewinder::Decoder<Sidewinder::Model::SW_PRECISION_PRO> {
|
||||
public:
|
||||
static const Description &getDescription() {
|
||||
static const Description desc{"MS Sidewinder Precision Pro", 4, 9, 1};
|
||||
return desc;
|
||||
}
|
||||
|
||||
static bool decode(const Packet &packet, State &state) {
|
||||
|
||||
// The packet can be either in 3bit or in 1bit mode
|
||||
if (packet.size != 16 && packet.size != 48) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto value = [&packet]() {
|
||||
uint64_t result{0u};
|
||||
const auto shift = 48 / packet.size;
|
||||
const auto mask = (shift == 3) ? 0b111 : 0b1;
|
||||
for (auto i = 0u; i < packet.size; i++) {
|
||||
result |= uint64_t(packet.data[i] & mask) << (i * shift);
|
||||
}
|
||||
return result;
|
||||
}();
|
||||
|
||||
// TODO shared code with 3D Pro?
|
||||
const auto bits = [&value](uint8_t start, uint8_t length) {
|
||||
const auto mask = (1 << length) - 1;
|
||||
return (value >> start) & mask;
|
||||
};
|
||||
|
||||
// TODO shared code with GP?
|
||||
const auto parity = [](uint64_t t) {
|
||||
uint32_t x = t ^ (t >> 32);
|
||||
x ^= x >> 16;
|
||||
x ^= x >> 8;
|
||||
x ^= x >> 4;
|
||||
x ^= x >> 2;
|
||||
x ^= x >> 1;
|
||||
return x & 1;
|
||||
};
|
||||
|
||||
if (!parity(value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
state.axes[0] = bits(9, 10);
|
||||
state.axes[1] = bits(19, 10);
|
||||
state.axes[2] = map(bits(36, 6), 0, 63, 0, 1023);
|
||||
state.axes[3] = map(bits(29, 7), 0, 127, 0, 1023);
|
||||
state.hat = bits(42, 4);
|
||||
state.buttons = ~bits(0, 9);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
/// Descriptor for Sidewinder Force Feedback Pro.
|
||||
/// (The bit decoder is identical to the Precision Pro.)
|
||||
template <>
|
||||
class Sidewinder::Decoder<Sidewinder::Model::SW_FORCE_FEEDBACK_PRO> {
|
||||
public:
|
||||
static const Description &getDescription() {
|
||||
static const Description desc{"MS Sidewinder Force Feedback Pro", 4, 9, 1};
|
||||
return desc;
|
||||
}
|
||||
|
||||
static bool decode(const Packet &packet, State &state) {
|
||||
// Decode is identical between the Force Feedback Pro and the Precision Pro.
|
||||
return Decoder<Model::SW_PRECISION_PRO>::decode(packet, state);
|
||||
}
|
||||
};
|
||||
|
||||
/// Bit decoder for Sidewinder Force Feedback Wheel.
|
||||
template <>
|
||||
class Sidewinder::Decoder<Sidewinder::Model::SW_FORCE_FEEDBACK_WHEEL> {
|
||||
public:
|
||||
static const Description &getDescription() {
|
||||
static const Description desc{"MS ForceFeedBack Wheel", 3, 8, 0};
|
||||
return desc;
|
||||
}
|
||||
|
||||
static bool decode(const Packet &packet, State &state) {
|
||||
|
||||
// The packet can be either in 3bit or in 1bit mode
|
||||
if (packet.size != 11 && packet.size != 33) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const auto value = [&packet]() {
|
||||
uint64_t result{0u};
|
||||
const auto shift = 33 / packet.size;
|
||||
const auto mask = (shift == 3) ? 0b111 : 0b1;
|
||||
for (auto i = 0u; i < packet.size; i++) {
|
||||
result |= uint64_t(packet.data[i] & mask) << (i * shift);
|
||||
}
|
||||
return result;
|
||||
}();
|
||||
|
||||
// TODO shared code with 3D Pro?
|
||||
const auto bits = [&value](uint8_t start, uint8_t length) {
|
||||
const auto mask = (1 << length) - 1;
|
||||
return (value >> start) & mask;
|
||||
};
|
||||
|
||||
// TODO shared code with GP?
|
||||
const auto parity = [](uint64_t t) {
|
||||
uint32_t x = t ^ (t >> 32);
|
||||
x ^= x >> 16;
|
||||
x ^= x >> 8;
|
||||
x ^= x >> 4;
|
||||
x ^= x >> 2;
|
||||
x ^= x >> 1;
|
||||
return x & 1;
|
||||
};
|
||||
|
||||
if (!parity(value)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// bit 0-9: RX
|
||||
state.axes[0] = bits(0, 10);
|
||||
|
||||
// bit 10-16: Rudder
|
||||
state.axes[1] = map(bits(10, 6), 0, 63, 0, 1023);
|
||||
|
||||
// bit 16-21: Throttle
|
||||
state.axes[2] = map(bits(16, 6), 0, 63, 0, 1023);
|
||||
|
||||
// bit 22-29: buttons 1-8
|
||||
state.buttons = ~bits(22, 8);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
inline const Joystick::Description &Sidewinder::getDescription() const {
|
||||
switch (m_model) {
|
||||
case Model::SW_GAMEPAD:
|
||||
return Decoder<Model::SW_GAMEPAD>::getDescription();
|
||||
case Model::SW_3D_PRO:
|
||||
return Decoder<Model::SW_3D_PRO>::getDescription();
|
||||
case Model::SW_PRECISION_PRO:
|
||||
return Decoder<Model::SW_PRECISION_PRO>::getDescription();
|
||||
case Model::SW_FORCE_FEEDBACK_PRO:
|
||||
return Decoder<Model::SW_FORCE_FEEDBACK_PRO>::getDescription();
|
||||
case Model::SW_FORCE_FEEDBACK_WHEEL:
|
||||
return Decoder<Model::SW_FORCE_FEEDBACK_WHEEL>::getDescription();
|
||||
default:
|
||||
return Decoder<Model::SW_UNKNOWN>::getDescription();
|
||||
}
|
||||
}
|
||||
|
||||
inline bool Sidewinder::decode(const Packet &packet, State &state) const {
|
||||
switch (m_model) {
|
||||
case Model::SW_GAMEPAD:
|
||||
return Decoder<Model::SW_GAMEPAD>::decode(packet, state);
|
||||
case Model::SW_3D_PRO:
|
||||
return Decoder<Model::SW_3D_PRO>::decode(packet, state);
|
||||
case Model::SW_PRECISION_PRO:
|
||||
return Decoder<Model::SW_PRECISION_PRO>::decode(packet, state);
|
||||
case Model::SW_FORCE_FEEDBACK_PRO:
|
||||
return Decoder<Model::SW_FORCE_FEEDBACK_PRO>::decode(packet, state);
|
||||
case Model::SW_FORCE_FEEDBACK_WHEEL:
|
||||
return Decoder<Model::SW_FORCE_FEEDBACK_WHEEL>::decode(packet, state);
|
||||
default:
|
||||
return Decoder<Model::SW_UNKNOWN>::decode(packet, state);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "AnalogJoystick.h"
|
||||
#include "Joystick.h"
|
||||
|
||||
class ThrustMaster : public Joystick {
|
||||
public:
|
||||
|
||||
const Description &getDescription() const override {
|
||||
static const Description description{"ThrustMaster", 3, 4, 1};
|
||||
return description;
|
||||
}
|
||||
|
||||
const State &getState() const override {
|
||||
return m_state;
|
||||
}
|
||||
|
||||
bool init() override {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool update() override {
|
||||
|
||||
// Unfortunately I had no real ThrustMaster joystick to test, but
|
||||
// Sidewinder 3D Pro has an emulation for ThrustMaster. So, this
|
||||
// implementation was made using that emulation and could be wrong.
|
||||
// However the ThrustMaster seem to have a strange hat switch. It is
|
||||
// encoded using the 3rd axis with values between 0 and 512, where
|
||||
// 0-127 is up, 128-255 is right, 256-383 is down and 384-479 is left.
|
||||
// Everything above 480 considered to be middle.
|
||||
const auto hat = [](uint16_t value) -> uint8_t {
|
||||
if (value < 128) {
|
||||
return 1;
|
||||
}
|
||||
if (value < 256) {
|
||||
return 3;
|
||||
}
|
||||
if (value < 384) {
|
||||
return 5;
|
||||
}
|
||||
if (value < 480) {
|
||||
return 7;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
for (auto i = 0u; i < 3; i++) {
|
||||
m_state.axes[i] = m_joystick.getAxis(i);
|
||||
}
|
||||
m_state.hat = hat(m_joystick.getAxis(3));
|
||||
m_state.buttons = m_joystick.getButtons();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
AnalogJoystick m_joystick;
|
||||
State m_state;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
|
||||
/// Debug messages on serial port are turned off by default. Comment the following
|
||||
/// line to enable logging to the serial port.
|
||||
/// Arduino Micro seems somehow to share the serial port with the USB interface.
|
||||
/// If the serial port will be activated, the operating system will no longer
|
||||
/// recognize the USB device!
|
||||
#define NDEBUG
|
||||
|
||||
#ifdef NDEBUG
|
||||
#define initLog()
|
||||
#define log(...)
|
||||
#else
|
||||
inline void initLog() {
|
||||
Serial.begin(9600);
|
||||
while(!Serial);
|
||||
}
|
||||
|
||||
inline void log(const char *fmt, ...) {
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
char buffer[512];
|
||||
vsnprintf(buffer, sizeof(buffer), fmt, args);
|
||||
va_end(args);
|
||||
Serial.println(buffer);
|
||||
}
|
||||
#endif // !NDEBUG
|
||||
|
||||
/// Interrupt guard (RAII).
|
||||
///
|
||||
/// This class is used to deactivate the interrupts in performance
|
||||
/// critical sections. The interrupt is reactivated as soon as this
|
||||
/// guard runs out of scope.
|
||||
struct InterruptStopper {
|
||||
InterruptStopper() { noInterrupts(); }
|
||||
~InterruptStopper() { interrupts(); }
|
||||
InterruptStopper(const InterruptStopper&) = delete;
|
||||
InterruptStopper(InterruptStopper&&) = delete;
|
||||
InterruptStopper& operator=(const InterruptStopper&) = delete;
|
||||
InterruptStopper& operator=(InterruptStopper&&) = delete;
|
||||
};
|
||||
@@ -0,0 +1,79 @@
|
||||
// This file is part of Necroware's GamePort adapter firmware.
|
||||
// Copyright (C) 2021 Necroware
|
||||
//
|
||||
// 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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
#include "DigitalPin.h"
|
||||
#include "HidJoystick.h"
|
||||
|
||||
#include "CHFlightstickPro.h"
|
||||
#include "CHF16CombatStick.h"
|
||||
#include "GenericJoystick.h"
|
||||
#include "GrIP.h"
|
||||
#include "Logitech.h"
|
||||
#include "Sidewinder.h"
|
||||
#include "ThrustMaster.h"
|
||||
|
||||
static Joystick *createJoystick() {
|
||||
|
||||
const auto sw1 = DigitalInput<14, true>{};
|
||||
const auto sw2 = DigitalInput<15, true>{};
|
||||
const auto sw3 = DigitalInput<20, true>{};
|
||||
const auto sw4 = DigitalInput<21, true>{};
|
||||
|
||||
// Give some time to setup the input
|
||||
delay(1);
|
||||
|
||||
const auto sw = !sw4 << 3 | !sw3 << 2 | !sw2 << 1 | !sw1;
|
||||
|
||||
switch (sw) {
|
||||
case 0b0001:
|
||||
return new GenericJoystick<2,4>;
|
||||
case 0b0010:
|
||||
return new GenericJoystick<3,4>;
|
||||
case 0b0011:
|
||||
return new GenericJoystick<4,4>;
|
||||
case 0b0100:
|
||||
return new CHFlightstickPro;
|
||||
case 0b0101:
|
||||
return new ThrustMaster;
|
||||
case 0b0110:
|
||||
return new CHF16CombatStick;
|
||||
case 0b0111:
|
||||
return new Sidewinder;
|
||||
case 0b1000:
|
||||
return new GrIP;
|
||||
case 0b1001:
|
||||
return new Logitech;
|
||||
default:
|
||||
return new GenericJoystick<2,2>;
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
// DEBUG information: Debugging is turned off by default
|
||||
// Comment the "NDEBUG" line in "Utilities.h" to enable logging to the serial monitor
|
||||
initLog();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
static auto hidJoystick = [] {
|
||||
HidJoystick hidJoystick;
|
||||
hidJoystick.init(createJoystick());
|
||||
return hidJoystick;
|
||||
}();
|
||||
|
||||
hidJoystick.update();
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
0
|
||||
@@ -0,0 +1,3 @@
|
||||
(fp_lib_table
|
||||
(lib (name Necroware)(type KiCad)(uri ${KIPRJMOD}/lib/Necroware.pretty)(options "")(descr ""))
|
||||
)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"board": {
|
||||
"active_layer": 0,
|
||||
"active_layer_preset": "All Layers",
|
||||
"auto_track_width": true,
|
||||
"hidden_nets": [],
|
||||
"high_contrast_mode": 0,
|
||||
"net_color_mode": 1,
|
||||
"opacity": {
|
||||
"pads": 1.0,
|
||||
"tracks": 1.0,
|
||||
"vias": 1.0,
|
||||
"zones": 0.6
|
||||
},
|
||||
"ratsnest_display_mode": 0,
|
||||
"selection_filter": {
|
||||
"dimensions": true,
|
||||
"footprints": true,
|
||||
"graphics": true,
|
||||
"keepouts": true,
|
||||
"lockedItems": true,
|
||||
"otherItems": true,
|
||||
"pads": true,
|
||||
"text": true,
|
||||
"tracks": true,
|
||||
"vias": true,
|
||||
"zones": true
|
||||
},
|
||||
"visible_items": [
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
30,
|
||||
32,
|
||||
33,
|
||||
34,
|
||||
35,
|
||||
36
|
||||
],
|
||||
"visible_layers": "fffffff_ffffffff",
|
||||
"zone_display_mode": 0
|
||||
},
|
||||
"meta": {
|
||||
"filename": "gameport-adapter.kicad_prl",
|
||||
"version": 3
|
||||
},
|
||||
"project": {
|
||||
"files": []
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,442 @@
|
||||
{
|
||||
"board": {
|
||||
"design_settings": {
|
||||
"defaults": {
|
||||
"board_outline_line_width": 0.049999999999999996,
|
||||
"copper_line_width": 0.19999999999999998,
|
||||
"copper_text_italic": false,
|
||||
"copper_text_size_h": 1.5,
|
||||
"copper_text_size_v": 1.5,
|
||||
"copper_text_thickness": 0.3,
|
||||
"copper_text_upright": false,
|
||||
"courtyard_line_width": 0.049999999999999996,
|
||||
"dimension_precision": 4,
|
||||
"dimension_units": 3,
|
||||
"dimensions": {
|
||||
"arrow_length": 1270000,
|
||||
"extension_offset": 500000,
|
||||
"keep_text_aligned": true,
|
||||
"suppress_zeroes": false,
|
||||
"text_position": 0,
|
||||
"units_format": 1
|
||||
},
|
||||
"fab_line_width": 0.09999999999999999,
|
||||
"fab_text_italic": false,
|
||||
"fab_text_size_h": 1.0,
|
||||
"fab_text_size_v": 1.0,
|
||||
"fab_text_thickness": 0.15,
|
||||
"fab_text_upright": false,
|
||||
"other_line_width": 0.09999999999999999,
|
||||
"other_text_italic": false,
|
||||
"other_text_size_h": 1.0,
|
||||
"other_text_size_v": 1.0,
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.762,
|
||||
"height": 1.524,
|
||||
"width": 1.524
|
||||
},
|
||||
"silk_line_width": 0.12,
|
||||
"silk_text_italic": false,
|
||||
"silk_text_size_h": 1.0,
|
||||
"silk_text_size_v": 1.0,
|
||||
"silk_text_thickness": 0.15,
|
||||
"silk_text_upright": false,
|
||||
"zones": {
|
||||
"45_degree_only": false,
|
||||
"min_clearance": 0.254
|
||||
}
|
||||
},
|
||||
"diff_pair_dimensions": [],
|
||||
"drc_exclusions": [],
|
||||
"meta": {
|
||||
"filename": "board_design_settings.json",
|
||||
"version": 2
|
||||
},
|
||||
"rule_severities": {
|
||||
"annular_width": "error",
|
||||
"clearance": "error",
|
||||
"copper_edge_clearance": "error",
|
||||
"courtyards_overlap": "error",
|
||||
"diff_pair_gap_out_of_range": "error",
|
||||
"diff_pair_uncoupled_length_too_long": "error",
|
||||
"drill_out_of_range": "error",
|
||||
"duplicate_footprints": "warning",
|
||||
"extra_footprint": "warning",
|
||||
"footprint_type_mismatch": "error",
|
||||
"hole_clearance": "error",
|
||||
"hole_near_hole": "error",
|
||||
"invalid_outline": "error",
|
||||
"item_on_disabled_layer": "error",
|
||||
"items_not_allowed": "error",
|
||||
"length_out_of_range": "error",
|
||||
"malformed_courtyard": "error",
|
||||
"microvia_drill_out_of_range": "error",
|
||||
"missing_courtyard": "ignore",
|
||||
"missing_footprint": "warning",
|
||||
"net_conflict": "warning",
|
||||
"npth_inside_courtyard": "ignore",
|
||||
"padstack": "error",
|
||||
"pth_inside_courtyard": "ignore",
|
||||
"shorting_items": "error",
|
||||
"silk_over_copper": "warning",
|
||||
"silk_overlap": "warning",
|
||||
"skew_out_of_range": "error",
|
||||
"through_hole_pad_without_hole": "error",
|
||||
"too_many_vias": "error",
|
||||
"track_dangling": "warning",
|
||||
"track_width": "error",
|
||||
"tracks_crossing": "error",
|
||||
"unconnected_items": "error",
|
||||
"unresolved_variable": "error",
|
||||
"via_dangling": "warning",
|
||||
"zone_has_empty_net": "error",
|
||||
"zones_intersect": "error"
|
||||
},
|
||||
"rule_severitieslegacy_courtyards_overlap": true,
|
||||
"rule_severitieslegacy_no_courtyard_defined": false,
|
||||
"rules": {
|
||||
"allow_blind_buried_vias": false,
|
||||
"allow_microvias": false,
|
||||
"max_error": 0.005,
|
||||
"min_clearance": 0.0,
|
||||
"min_copper_edge_clearance": 0.024999999999999998,
|
||||
"min_hole_clearance": 0.25,
|
||||
"min_hole_to_hole": 0.25,
|
||||
"min_microvia_diameter": 0.19999999999999998,
|
||||
"min_microvia_drill": 0.09999999999999999,
|
||||
"min_silk_clearance": 0.0,
|
||||
"min_through_hole_diameter": 0.3,
|
||||
"min_track_width": 0.19999999999999998,
|
||||
"min_via_annular_width": 0.049999999999999996,
|
||||
"min_via_diameter": 0.39999999999999997,
|
||||
"use_height_for_length_calcs": true
|
||||
},
|
||||
"track_widths": [],
|
||||
"via_dimensions": [],
|
||||
"zones_allow_external_fillets": false,
|
||||
"zones_use_no_outline": true
|
||||
},
|
||||
"layer_presets": []
|
||||
},
|
||||
"boards": [],
|
||||
"cvpcb": {
|
||||
"equivalence_files": []
|
||||
},
|
||||
"erc": {
|
||||
"erc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"pin_map": [
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
0,
|
||||
2,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
2
|
||||
],
|
||||
[
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2,
|
||||
2
|
||||
]
|
||||
],
|
||||
"rule_severities": {
|
||||
"bus_definition_conflict": "error",
|
||||
"bus_entry_needed": "error",
|
||||
"bus_label_syntax": "error",
|
||||
"bus_to_bus_conflict": "error",
|
||||
"bus_to_net_conflict": "error",
|
||||
"different_unit_footprint": "error",
|
||||
"different_unit_net": "error",
|
||||
"duplicate_reference": "error",
|
||||
"duplicate_sheet_names": "error",
|
||||
"extra_units": "error",
|
||||
"global_label_dangling": "warning",
|
||||
"hier_label_mismatch": "error",
|
||||
"label_dangling": "error",
|
||||
"lib_symbol_issues": "warning",
|
||||
"multiple_net_names": "warning",
|
||||
"net_not_bus_member": "warning",
|
||||
"no_connect_connected": "warning",
|
||||
"no_connect_dangling": "warning",
|
||||
"pin_not_connected": "error",
|
||||
"pin_not_driven": "error",
|
||||
"pin_to_pin": "warning",
|
||||
"power_pin_not_driven": "error",
|
||||
"similar_labels": "warning",
|
||||
"unannotated": "error",
|
||||
"unit_value_mismatch": "error",
|
||||
"unresolved_variable": "error",
|
||||
"wire_dangling": "error"
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"pinned_footprint_libs": [],
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "gameport-adapter.kicad_pro",
|
||||
"version": 1
|
||||
},
|
||||
"net_settings": {
|
||||
"classes": [
|
||||
{
|
||||
"bus_width": 12.0,
|
||||
"clearance": 0.25,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.3,
|
||||
"microvia_drill": 0.1,
|
||||
"name": "Default",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.35,
|
||||
"via_diameter": 0.8,
|
||||
"via_drill": 0.4,
|
||||
"wire_width": 6.0
|
||||
},
|
||||
{
|
||||
"bus_width": 12.0,
|
||||
"clearance": 0.35,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.3,
|
||||
"microvia_drill": 0.1,
|
||||
"name": "Power",
|
||||
"nets": [
|
||||
"GND",
|
||||
"VCC"
|
||||
],
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 1.0,
|
||||
"via_diameter": 0.8,
|
||||
"via_drill": 0.4,
|
||||
"wire_width": 6.0
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"version": 2
|
||||
},
|
||||
"net_colors": null
|
||||
},
|
||||
"pcbnew": {
|
||||
"last_paths": {
|
||||
"gencad": "",
|
||||
"idf": "",
|
||||
"netlist": "",
|
||||
"specctra_dsn": "",
|
||||
"step": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": ""
|
||||
},
|
||||
"schematic": {
|
||||
"annotate_start_num": 0,
|
||||
"drawing": {
|
||||
"default_line_thickness": 6.0,
|
||||
"default_text_size": 50.0,
|
||||
"field_names": [],
|
||||
"intersheets_ref_own_page": false,
|
||||
"intersheets_ref_prefix": "",
|
||||
"intersheets_ref_short": false,
|
||||
"intersheets_ref_show": false,
|
||||
"intersheets_ref_suffix": "",
|
||||
"junction_size_choice": 3,
|
||||
"label_size_ratio": 0.25,
|
||||
"pin_symbol_size": 0.0,
|
||||
"text_offset_ratio": 0.08
|
||||
},
|
||||
"legacy_lib_dir": "",
|
||||
"legacy_lib_list": [],
|
||||
"meta": {
|
||||
"version": 1
|
||||
},
|
||||
"net_format_name": "",
|
||||
"ngspice": {
|
||||
"fix_include_paths": true,
|
||||
"fix_passive_vals": false,
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"model_mode": 0,
|
||||
"workbook_filename": ""
|
||||
},
|
||||
"page_layout_descr_file": "",
|
||||
"plot_directory": "",
|
||||
"spice_adjust_passive_values": false,
|
||||
"spice_external_command": "spice \"%I\"",
|
||||
"subpart_first_id": 65,
|
||||
"subpart_id_separator": 0
|
||||
},
|
||||
"sheets": [
|
||||
[
|
||||
"bd3a3088-a7a8-46b0-8d32-b4cc0ac8ed31",
|
||||
""
|
||||
]
|
||||
],
|
||||
"text_variables": {}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,674 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
@@ -0,0 +1,9 @@
|
||||
EESchema-DOCLIB Version 2.0
|
||||
#
|
||||
$CMP Mini-DIN-6_shielded
|
||||
D 6-pin Mini-DIN connector
|
||||
K Mini-DIN
|
||||
F http://service.powerdynamics.com/ec/Catalog17/Section%2011.pdf
|
||||
$ENDCMP
|
||||
#
|
||||
#End Doc Library
|
||||
@@ -0,0 +1,121 @@
|
||||
EESchema-LIBRARY Version 2.4
|
||||
#encoding utf-8
|
||||
#
|
||||
# Arduino_Mini
|
||||
#
|
||||
DEF Arduino_Mini U 0 40 Y Y 1 F N
|
||||
F0 "U" 450 -50 50 H V C CNN
|
||||
F1 "Arduino_Mini" 450 -800 50 V V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
S 100 -100 750 -1550 0 1 0 f
|
||||
X TX/D0 1 0 -200 100 R 50 50 1 1 B
|
||||
X D7 10 0 -1100 100 R 50 50 1 1 B
|
||||
X D8 11 0 -1200 100 R 50 50 1 1 B
|
||||
X D9 12 0 -1300 100 R 50 50 1 1 B
|
||||
X D10 13 850 -1300 100 L 50 50 1 1 B
|
||||
X D11 14 850 -1200 100 L 50 50 1 1 B
|
||||
X D12 15 850 -1100 100 L 50 50 1 1 B
|
||||
X D13 16 850 -1000 100 L 50 50 1 1 B
|
||||
X A0 17 850 -900 100 L 50 50 1 1 B
|
||||
X A1 18 850 -800 100 L 50 50 1 1 B
|
||||
X A2 19 850 -700 100 L 50 50 1 1 B
|
||||
X RX/D1 2 0 -300 100 R 50 50 1 1 B
|
||||
X A3 20 850 -600 100 L 50 50 1 1 B
|
||||
X VCC 21 850 -500 100 L 50 50 1 1 B
|
||||
X RST 22 850 -400 100 L 50 50 1 1 B
|
||||
X GND 23 850 -300 100 L 50 50 1 1 B
|
||||
X VIN 24 850 -200 100 L 50 50 1 1 B
|
||||
X GND 25 250 -1650 100 U 50 50 1 1 B
|
||||
X A4 26 350 -1650 100 U 50 50 1 1 B
|
||||
X A5 27 450 -1650 100 U 50 50 1 1 B
|
||||
X A6 28 550 -1650 100 U 50 50 1 1 B
|
||||
X A7 29 650 -1650 100 U 50 50 1 1 B
|
||||
X RST 3 0 -400 100 R 50 50 1 1 B
|
||||
X GND 4 0 -500 100 R 50 50 1 1 B
|
||||
X D2 5 0 -600 100 R 50 50 1 1 B
|
||||
X D3 6 0 -700 100 R 50 50 1 1 B
|
||||
X D4 7 0 -800 100 R 50 50 1 1 B
|
||||
X D5 8 0 -900 100 R 50 50 1 1 B
|
||||
X D6 9 0 -1000 100 R 50 50 1 1 B
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Arduino_Pro_Micro
|
||||
#
|
||||
DEF Arduino_Pro_Micro U 0 40 Y Y 1 F N
|
||||
F0 "U" 550 -50 50 H V C CNN
|
||||
F1 "Arduino_Pro_Micro" 550 -700 50 V V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
S 100 -100 1000 -1400 0 1 0 f
|
||||
X 1/TX 1 0 -200 100 R 50 50 1 1 B
|
||||
X 7 10 0 -1100 100 R 50 50 1 1 B
|
||||
X 8/A8 11 0 -1200 100 R 50 50 1 1 B
|
||||
X 9/A9 12 0 -1300 100 R 50 50 1 1 B
|
||||
X 10/A10 13 1100 -1300 100 L 50 50 1 1 B
|
||||
X 16/MOSI 14 1100 -1200 100 L 50 50 1 1 B
|
||||
X 14/MISO 15 1100 -1100 100 L 50 50 1 1 B
|
||||
X 15/SCLK 16 1100 -1000 100 L 50 50 1 1 B
|
||||
X 18/A0 17 1100 -900 100 L 50 50 1 1 B
|
||||
X 19/A1 18 1100 -800 100 L 50 50 1 1 B
|
||||
X 20/A2 19 1100 -700 100 L 50 50 1 1 B
|
||||
X 0/RX 2 0 -300 100 R 50 50 1 1 B
|
||||
X 21/A3 20 1100 -600 100 L 50 50 1 1 B
|
||||
X VCC 21 1100 -500 100 L 50 50 1 1 B
|
||||
X RST 22 1100 -400 100 L 50 50 1 1 B
|
||||
X GND 23 1100 -300 100 L 50 50 1 1 B
|
||||
X VIN 24 1100 -200 100 L 50 50 1 1 B
|
||||
X GND 3 0 -400 100 R 50 50 1 1 B
|
||||
X GND 4 0 -500 100 R 50 50 1 1 B
|
||||
X 2/SDA 5 0 -600 100 R 50 50 1 1 B
|
||||
X 3/SCL 6 0 -700 100 R 50 50 1 1 B
|
||||
X 4/A6 7 0 -800 100 R 50 50 1 1 B
|
||||
X 5 8 0 -900 100 R 50 50 1 1 B
|
||||
X 6/A7 9 0 -1000 100 R 50 50 1 1 B
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Mini-DIN-6_shielded
|
||||
#
|
||||
DEF Mini-DIN-6_shielded J 0 40 Y Y 1 F N
|
||||
F0 "J" 0 250 50 H V C CNN
|
||||
F1 "Mini-DIN-6_shielded" 50 350 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
MINI?DIN*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
A 0 0 200 -1269 -531 0 1 10 N -120 -160 120 -160
|
||||
A 2 4 200 1021 -1488 0 1 10 N -40 200 -170 -100
|
||||
A 2 5 198 -320 790 0 1 10 N 170 -100 40 200
|
||||
C -130 0 20 0 1 0 N
|
||||
C -80 -100 20 0 1 0 N
|
||||
C -80 100 20 0 1 0 N
|
||||
C 80 -100 20 0 1 0 N
|
||||
C 90 100 20 0 1 0 N
|
||||
C 130 0 20 0 1 0 N
|
||||
S -30 100 30 0 0 1 0 F
|
||||
P 2 0 1 0 -150 0 -200 0 N
|
||||
P 2 0 1 0 -100 100 -200 100 N
|
||||
P 2 0 1 0 110 100 200 100 N
|
||||
P 2 0 1 0 200 0 150 0 N
|
||||
P 3 0 1 10 -170 -100 -120 -100 -120 -160 N
|
||||
P 3 0 1 10 170 -100 120 -100 120 -160 N
|
||||
P 4 0 1 0 -80 -120 -80 -140 -200 -140 -200 -100 N
|
||||
P 4 0 1 10 -40 200 -40 160 40 160 40 200 N
|
||||
P 4 0 1 0 80 -120 80 -140 200 -140 200 -100 N
|
||||
X ~ 1 300 -100 100 L 50 50 1 1 P
|
||||
X ~ 2 -300 -100 100 R 50 50 1 1 P
|
||||
X ~ 3 300 0 100 L 50 50 1 1 P
|
||||
X ~ 4 -300 0 100 R 50 50 1 1 P
|
||||
X ~ 5 300 100 100 L 50 50 1 1 P
|
||||
X ~ 6 -300 100 100 R 50 50 1 1 P
|
||||
X ~ 7 0 -300 100 U 50 50 1 1 B
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
#End Library
|
||||
@@ -0,0 +1,70 @@
|
||||
(module Arduino_Mini (layer F.Cu) (tedit 5FB85749)
|
||||
(descr "24-lead though-hole mounted DIP package, row spacing 15.24 mm (600 mils), Socket")
|
||||
(tags "THT DIP DIL PDIP 2.54mm 15.24mm 600mil Socket")
|
||||
(fp_text reference REF** (at 7.62 -2.33) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value Arduino_Mini (at 7.62 30.27) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start 16.8 -1.6) (end -1.55 -1.6) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 16.8 29.55) (end 16.8 -1.6) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start -1.55 29.55) (end 16.8 29.55) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start -1.55 -1.6) (end -1.55 29.55) (layer F.CrtYd) (width 0.05))
|
||||
(fp_line (start 16.57 -1.39) (end -1.33 -1.39) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 16.57 29.33) (end 16.57 -1.39) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -1.33 29.33) (end 16.57 29.33) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -1.33 -1.39) (end -1.33 29.33) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 14.08 -1.33) (end 8.62 -1.33) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 14.08 29.27) (end 14.08 -1.33) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 1.16 29.27) (end 14.08 29.27) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 1.16 -1.33) (end 1.16 29.27) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 6.62 -1.33) (end 1.16 -1.33) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 16.51 -1.33) (end -1.27 -1.33) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 16.51 29.27) (end 16.51 -1.33) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -1.27 29.27) (end 16.51 29.27) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start -1.27 -1.33) (end -1.27 29.27) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 0.255 -0.27) (end 1.255 -1.27) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 0.255 29.21) (end 0.255 -0.27) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 14.985 29.21) (end 0.255 29.21) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 14.985 -1.27) (end 14.985 29.21) (layer F.Fab) (width 0.1))
|
||||
(fp_line (start 1.255 -1.27) (end 14.985 -1.27) (layer F.Fab) (width 0.1))
|
||||
(fp_arc (start 7.62 -1.33) (end 6.62 -1.33) (angle -180) (layer F.SilkS) (width 0.12))
|
||||
(fp_text user %R (at 7.62 13.97) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(pad 1 thru_hole rect (at 0 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 13 thru_hole oval (at 15.24 27.94) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 2 thru_hole oval (at 0 2.54) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 14 thru_hole oval (at 15.24 25.4) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 3 thru_hole oval (at 0 5.08) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 15 thru_hole oval (at 15.24 22.86) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 4 thru_hole oval (at 0 7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 16 thru_hole oval (at 15.24 20.32) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 5 thru_hole oval (at 0 10.16) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 17 thru_hole oval (at 15.24 17.78) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 6 thru_hole oval (at 0 12.7) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 18 thru_hole oval (at 15.24 15.24) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 7 thru_hole oval (at 0 15.24) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 19 thru_hole oval (at 15.24 12.7) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 8 thru_hole oval (at 0 17.78) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 20 thru_hole oval (at 15.24 10.16) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 9 thru_hole oval (at 0 20.32) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 21 thru_hole oval (at 15.24 7.62) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 10 thru_hole oval (at 0 22.86) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 22 thru_hole oval (at 15.24 5.08) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 11 thru_hole oval (at 0 25.4) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 23 thru_hole oval (at 15.24 2.54) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 12 thru_hole oval (at 0 27.94) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 24 thru_hole oval (at 15.24 0) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask))
|
||||
(pad 25 thru_hole circle (at 2.54 27.94) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
|
||||
(pad 26 thru_hole circle (at 5.08 27.94) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
|
||||
(pad 27 thru_hole circle (at 7.62 27.94) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
|
||||
(pad 28 thru_hole circle (at 10.16 27.94) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
|
||||
(pad 29 thru_hole circle (at 12.7 27.94) (size 1.524 1.524) (drill 0.762) (layers *.Cu *.Mask))
|
||||
(model ${KISYS3DMOD}/Package_DIP.3dshapes/DIP-24_W15.24mm_Socket.wrl
|
||||
(at (xyz 0 0 0))
|
||||
(scale (xyz 1 1 1))
|
||||
(rotate (xyz 0 0 0))
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,76 @@
|
||||
(module ISA_8BIT_EDGE (layer F.Cu) (tedit 5FB84D5C)
|
||||
(fp_text reference REF** (at -38.1 -1.905) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value ISA_8BIT_EDGE (at -46.355 -1.905) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start -78.105 0) (end -78.105 6.35) (layer F.Fab) (width 0.12))
|
||||
(fp_line (start -78.105 6.35) (end -76.835 7.62) (layer F.Fab) (width 0.12))
|
||||
(fp_line (start -76.835 7.62) (end 0.635 7.62) (layer F.Fab) (width 0.12))
|
||||
(fp_line (start 0.635 7.62) (end 1.905 6.35) (layer F.Fab) (width 0.12))
|
||||
(fp_line (start 1.905 6.35) (end 1.905 0) (layer F.Fab) (width 0.12))
|
||||
(fp_line (start 1.905 0) (end -78.105 0) (layer F.Fab) (width 0.12))
|
||||
(pad 1 connect rect (at 0 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 2 connect rect (at -2.54 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 3 connect rect (at -5.08 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 4 connect rect (at -7.62 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 5 connect rect (at -10.16 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 6 connect rect (at -12.7 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 7 connect rect (at -15.24 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 8 connect rect (at -17.78 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 9 connect rect (at -20.32 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 10 connect rect (at -22.86 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 11 connect rect (at -25.4 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 12 connect rect (at -27.94 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 13 connect rect (at -30.48 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 14 connect rect (at -33.02 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 15 connect rect (at -35.56 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 16 connect rect (at -38.1 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 17 connect rect (at -40.64 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 18 connect rect (at -43.18 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 19 connect rect (at -45.72 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 20 connect rect (at -48.26 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 21 connect rect (at -50.8 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 22 connect rect (at -53.34 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 23 connect rect (at -55.88 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 24 connect rect (at -58.42 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 25 connect rect (at -60.96 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 26 connect rect (at -63.5 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 27 connect rect (at -66.04 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 28 connect rect (at -68.58 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 29 connect rect (at -71.12 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 30 connect rect (at -73.66 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 31 connect rect (at -76.2 3.81) (size 1.27 7.62) (layers B.Cu B.Mask))
|
||||
(pad 32 connect rect (at 0 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 33 connect rect (at -2.54 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 34 connect rect (at -5.08 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 35 connect rect (at -7.62 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 36 connect rect (at -10.16 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 37 connect rect (at -12.7 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 38 connect rect (at -15.24 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 39 connect rect (at -17.78 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 40 connect rect (at -20.32 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 41 connect rect (at -22.86 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 42 connect rect (at -25.4 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 43 connect rect (at -27.94 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 44 connect rect (at -30.48 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 45 connect rect (at -33.02 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 46 connect rect (at -35.56 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 47 connect rect (at -38.1 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 48 connect rect (at -40.64 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 49 connect rect (at -43.18 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 50 connect rect (at -45.72 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 51 connect rect (at -48.26 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 52 connect rect (at -50.8 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 53 connect rect (at -53.34 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 54 connect rect (at -55.88 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 55 connect rect (at -58.42 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 56 connect rect (at -60.96 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 57 connect rect (at -63.5 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 58 connect rect (at -66.04 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 59 connect rect (at -68.58 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 60 connect rect (at -71.12 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 61 connect rect (at -73.66 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
(pad 62 connect rect (at -76.2 3.81) (size 1.27 7.62) (layers F.Cu F.Mask))
|
||||
)
|
||||
@@ -0,0 +1,21 @@
|
||||
(module Mini_DIN_6_LCSC_C77848 (layer F.Cu) (tedit 5FB9268E)
|
||||
(fp_text reference REF** (at 3 -3) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value Mini_DIN_6_LCSC_C77848 (at 4 13) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start -3.45 -2) (end -3.45 11.28) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 10.25 11.28) (end -3.45 11.28) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 10.25 -2) (end 10.25 11.28) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -3.45 -2) (end 10.25 -2) (layer F.SilkS) (width 0.12))
|
||||
(pad 6 thru_hole circle (at 0 0) (size 1.7 1.7) (drill 1.1) (layers *.Cu *.Mask))
|
||||
(pad 4 thru_hole circle (at 0 2.5) (size 1.7 1.7) (drill 1.1) (layers *.Cu *.Mask))
|
||||
(pad 5 thru_hole circle (at 6.8 0) (size 1.7 1.7) (drill 1.1) (layers *.Cu *.Mask))
|
||||
(pad 3 thru_hole circle (at 6.8 2.5) (size 1.7 1.7) (drill 1.1) (layers *.Cu *.Mask))
|
||||
(pad 2 thru_hole circle (at 2.1 2.5) (size 1.7 1.7) (drill 1.1) (layers *.Cu *.Mask))
|
||||
(pad 1 thru_hole circle (at 4.7 2.5) (size 1.7 1.7) (drill 1.1) (layers *.Cu *.Mask))
|
||||
(pad 7 thru_hole circle (at 3.4 6.58) (size 3.3 3.3) (drill 2.3) (layers *.Cu *.Mask))
|
||||
(pad 7 thru_hole circle (at -3.45 5.78) (size 3.3 3.3) (drill 2.3) (layers *.Cu *.Mask))
|
||||
(pad 7 thru_hole circle (at 10.25 5.78) (size 3.3 3.3) (drill 2.3) (layers *.Cu *.Mask))
|
||||
)
|
||||
@@ -0,0 +1,22 @@
|
||||
(module USB_Mini-B-Jing_Extension_LSCS_C46398 (layer F.Cu) (tedit 5FBA7C90)
|
||||
(fp_text reference REF** (at 0 -4) (layer F.SilkS)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_text value USB_Mini-B-Jing_Extension_LSCS_C46398 (at 0 -2) (layer F.Fab)
|
||||
(effects (font (size 1 1) (thickness 0.15)))
|
||||
)
|
||||
(fp_line (start -3.7 7.45) (end 3.7 7.45) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -3.7 9.7) (end -3.7 0) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -3.7 9.7) (end 3.7 9.7) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start 3.7 0) (end 3.7 9.7) (layer F.SilkS) (width 0.12))
|
||||
(fp_line (start -3.7 0) (end 3.7 0) (layer F.SilkS) (width 0.12))
|
||||
(pad 3 thru_hole circle (at 0 0) (size 1.1 1.1) (drill 0.4) (layers *.Cu *.Mask))
|
||||
(pad 5 thru_hole circle (at 1.6 0) (size 1.1 1.1) (drill 0.4) (layers *.Cu *.Mask))
|
||||
(pad 1 thru_hole circle (at -1.6 0) (size 1.1 1.1) (drill 0.4) (layers *.Cu *.Mask))
|
||||
(pad 2 thru_hole circle (at -0.8 1.2) (size 1.1 1.1) (drill 0.4) (layers *.Cu *.Mask))
|
||||
(pad 4 thru_hole circle (at 0.8 1.2) (size 1.1 1.1) (drill 0.4) (layers *.Cu *.Mask))
|
||||
(pad 6 thru_hole oval (at 3.7 0.9) (size 1.4 2.5) (drill oval 0.8 1.9) (layers *.Cu *.Mask))
|
||||
(pad 6 thru_hole oval (at -3.7 0.9) (size 1.4 2.5) (drill oval 0.8 1.9) (layers *.Cu *.Mask))
|
||||
(pad 6 thru_hole oval (at -3.7 5.65) (size 1.4 2.5) (drill oval 0.8 1.9) (layers *.Cu *.Mask))
|
||||
(pad 6 thru_hole oval (at 3.7 5.65) (size 1.4 2.5) (drill oval 0.8 1.9) (layers *.Cu *.Mask))
|
||||
)
|
||||
@@ -0,0 +1,371 @@
|
||||
(module LOGO (layer F.Cu)
|
||||
(at 0 0)
|
||||
(fp_text reference "G***" (at 0 0) (layer F.SilkS) hide
|
||||
(effects (font (thickness 0.3)))
|
||||
)
|
||||
(fp_text value "LOGO" (at 0.75 0) (layer F.SilkS) hide
|
||||
(effects (font (thickness 0.3)))
|
||||
)
|
||||
(fp_poly (pts (xy -2.567733 4.243323) (xy -2.542708 4.244832) (xy -2.465751 4.253948) (xy -2.397919 4.269662) (xy -2.339153 4.292005) (xy -2.289396 4.321005) (xy -2.248591 4.356694) (xy -2.216679 4.399101)
|
||||
(xy -2.204536 4.421785) (xy -2.198337 4.434872) (xy -2.192960 4.446774) (xy -2.188340 4.458364) (xy -2.184416 4.470515) (xy -2.181124 4.484100) (xy -2.178402 4.499991) (xy -2.176187 4.519062)
|
||||
(xy -2.174417 4.542185) (xy -2.173027 4.570234) (xy -2.171957 4.604081) (xy -2.171142 4.644598) (xy -2.170520 4.692660) (xy -2.170028 4.749138) (xy -2.169603 4.814906) (xy -2.169183 4.890836)
|
||||
(xy -2.169053 4.914900) (xy -2.166903 5.311422) (xy -2.381516 5.311422) (xy -2.383147 5.262475) (xy -2.384778 5.213527) (xy -2.401037 5.237032) (xy -2.426629 5.264722) (xy -2.461546 5.288034)
|
||||
(xy -2.504360 5.306020) (xy -2.505894 5.306513) (xy -2.532170 5.312546) (xy -2.566491 5.317077) (xy -2.605695 5.320000) (xy -2.646624 5.321206) (xy -2.686119 5.320587) (xy -2.721020 5.318036)
|
||||
(xy -2.743200 5.314599) (xy -2.805023 5.297525) (xy -2.858366 5.274085) (xy -2.904483 5.243633) (xy -2.935111 5.215774) (xy -2.965859 5.179189) (xy -2.988479 5.140343) (xy -3.005037 5.095482)
|
||||
(xy -3.008612 5.082340) (xy -3.018636 5.022292) (xy -3.018283 4.988830) (xy -2.816578 4.988830) (xy -2.811855 5.024864) (xy -2.797578 5.055176) (xy -2.773589 5.079966) (xy -2.739726 5.099433)
|
||||
(xy -2.722232 5.106169) (xy -2.704732 5.111603) (xy -2.687888 5.115323) (xy -2.668892 5.117643) (xy -2.644932 5.118876) (xy -2.613199 5.119335) (xy -2.603778 5.119366) (xy -2.571832 5.118968)
|
||||
(xy -2.541164 5.117779) (xy -2.514907 5.115971) (xy -2.496195 5.113719) (xy -2.493711 5.113246) (xy -2.460346 5.103417) (xy -2.433727 5.088728) (xy -2.413289 5.068175) (xy -2.398465 5.040752)
|
||||
(xy -2.388689 5.005456) (xy -2.383397 4.961280) (xy -2.381998 4.914900) (xy -2.381955 4.865511) (xy -2.536153 4.865511) (xy -2.585229 4.865636) (xy -2.624451 4.866056) (xy -2.655253 4.866841)
|
||||
(xy -2.679068 4.868059) (xy -2.697328 4.869780) (xy -2.711467 4.872074) (xy -2.721009 4.874435) (xy -2.759073 4.889856) (xy -2.787510 4.911169) (xy -2.806334 4.938388) (xy -2.815556 4.971528)
|
||||
(xy -2.816578 4.988830) (xy -3.018283 4.988830) (xy -3.018023 4.964233) (xy -3.007341 4.909125) (xy -2.987157 4.857930) (xy -2.958037 4.811606) (xy -2.920548 4.771117) (xy -2.875257 4.737421)
|
||||
(xy -2.822730 4.711481) (xy -2.782213 4.698516) (xy -2.769017 4.695737) (xy -2.752387 4.693434) (xy -2.731051 4.691536) (xy -2.703733 4.689975) (xy -2.669159 4.688679) (xy -2.626056 4.687578)
|
||||
(xy -2.573149 4.686602) (xy -2.563353 4.686447) (xy -2.380685 4.683624) (xy -2.382856 4.609337) (xy -2.383923 4.578399) (xy -2.385307 4.556226) (xy -2.387446 4.540297) (xy -2.390783 4.528089)
|
||||
(xy -2.395757 4.517078) (xy -2.400417 4.508788) (xy -2.421147 4.484513) (xy -2.451527 4.465731) (xy -2.491304 4.452516) (xy -2.540223 4.444940) (xy -2.598031 4.443077) (xy -2.624666 4.444003)
|
||||
(xy -2.667994 4.447621) (xy -2.702469 4.453921) (xy -2.730363 4.463677) (xy -2.753948 4.477660) (xy -2.773460 4.494588) (xy -2.800897 4.521916) (xy -2.881942 4.460880) (xy -2.907950 4.441011)
|
||||
(xy -2.930515 4.423232) (xy -2.948195 4.408725) (xy -2.959546 4.398671) (xy -2.963160 4.394392) (xy -2.959432 4.388378) (xy -2.949243 4.376517) (xy -2.934314 4.360735) (xy -2.922411 4.348821)
|
||||
(xy -2.878897 4.312472) (xy -2.830091 4.283888) (xy -2.775282 4.262876) (xy -2.713760 4.249241) (xy -2.644814 4.242788) (xy -2.567733 4.243323) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -0.378178 5.311671) (xy -0.484011 5.310136) (xy -0.589844 5.308600) (xy -0.592666 5.259144) (xy -0.595489 5.209688) (xy -0.626533 5.235193) (xy -0.679672 5.271826) (xy -0.737484 5.298793)
|
||||
(xy -0.798551 5.315746) (xy -0.861452 5.322336) (xy -0.924767 5.318214) (xy -0.947320 5.314056) (xy -1.000846 5.296943) (xy -1.051486 5.270202) (xy -1.097678 5.235278) (xy -1.137862 5.193613)
|
||||
(xy -1.170477 5.146650) (xy -1.193961 5.095833) (xy -1.198449 5.081927) (xy -1.204855 5.055418) (xy -1.209959 5.023471) (xy -1.213813 4.985142) (xy -1.216468 4.939486) (xy -1.217977 4.885560)
|
||||
(xy -1.218392 4.822420) (xy -1.217846 4.758432) (xy -1.003991 4.758432) (xy -1.003395 4.809565) (xy -1.002388 4.852717) (xy -1.001232 4.886391) (xy -0.999769 4.912396) (xy -0.997841 4.932542)
|
||||
(xy -0.995292 4.948640) (xy -0.991962 4.962500) (xy -0.989312 4.971143) (xy -0.970883 5.016275) (xy -0.947987 5.051558) (xy -0.919715 5.077608) (xy -0.885158 5.095044) (xy -0.843406 5.104484)
|
||||
(xy -0.793550 5.106546) (xy -0.790222 5.106447) (xy -0.758530 5.104519) (xy -0.734298 5.100744) (xy -0.713759 5.094453) (xy -0.707096 5.091687) (xy -0.673743 5.072030) (xy -0.646333 5.044574)
|
||||
(xy -0.624159 5.008397) (xy -0.606513 4.962573) (xy -0.605330 4.958645) (xy -0.601584 4.939658) (xy -0.598497 4.911627) (xy -0.596101 4.876776) (xy -0.594432 4.837334) (xy -0.593525 4.795526)
|
||||
(xy -0.593414 4.753579) (xy -0.594133 4.713719) (xy -0.595717 4.678173) (xy -0.598201 4.649167) (xy -0.600302 4.634937) (xy -0.613074 4.583827) (xy -0.630661 4.542440) (xy -0.653794 4.509971)
|
||||
(xy -0.683202 4.485620) (xy -0.719616 4.468583) (xy -0.760835 4.458530) (xy -0.808447 4.455199) (xy -0.853699 4.460770) (xy -0.894794 4.474711) (xy -0.929934 4.496494) (xy -0.948015 4.513787)
|
||||
(xy -0.964382 4.535060) (xy -0.977557 4.558740) (xy -0.987779 4.586119) (xy -0.995293 4.618486) (xy -1.000338 4.657134) (xy -1.003157 4.703352) (xy -1.003991 4.758432) (xy -1.217846 4.758432)
|
||||
(xy -1.217766 4.749122) (xy -1.217582 4.736933) (xy -1.216470 4.677497) (xy -1.215083 4.627952) (xy -1.213243 4.586900) (xy -1.210775 4.552944) (xy -1.207504 4.524686) (xy -1.203252 4.500728)
|
||||
(xy -1.197844 4.479673) (xy -1.191104 4.460124) (xy -1.182855 4.440683) (xy -1.179309 4.433076) (xy -1.162949 4.405415) (xy -1.139629 4.374859) (xy -1.112038 4.344370) (xy -1.082866 4.316911)
|
||||
(xy -1.054801 4.295444) (xy -1.053764 4.294768) (xy -1.005983 4.270031) (xy -0.952450 4.253001) (xy -0.895832 4.243971) (xy -0.838797 4.243234) (xy -0.784011 4.251083) (xy -0.749755 4.261342)
|
||||
(xy -0.712255 4.278356) (xy -0.672442 4.301486) (xy -0.634931 4.327937) (xy -0.620838 4.339480) (xy -0.592666 4.363782) (xy -0.592666 3.826934) (xy -0.378178 3.826934) (xy -0.378178 5.311671) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 1.704107 4.243521) (xy 1.722402 4.244672) (xy 1.798353 4.253284) (xy 1.864925 4.267786) (xy 1.922523 4.288439) (xy 1.971555 4.315506) (xy 2.012426 4.349249) (xy 2.045543 4.389929)
|
||||
(xy 2.071313 4.437808) (xy 2.086216 4.479111) (xy 2.088165 4.486409) (xy 2.089857 4.494875) (xy 2.091317 4.505345) (xy 2.092567 4.518658) (xy 2.093630 4.535650) (xy 2.094531 4.557157)
|
||||
(xy 2.095292 4.584017) (xy 2.095936 4.617067) (xy 2.096487 4.657143) (xy 2.096969 4.705084) (xy 2.097404 4.761724) (xy 2.097815 4.827903) (xy 2.098227 4.904456) (xy 2.098266 4.912078)
|
||||
(xy 2.100293 5.311422) (xy 1.885245 5.311422) (xy 1.885245 5.213243) (xy 1.868122 5.236526) (xy 1.840929 5.264733) (xy 1.804783 5.288441) (xy 1.761531 5.306441) (xy 1.761306 5.306513)
|
||||
(xy 1.741650 5.311833) (xy 1.719833 5.315606) (xy 1.693174 5.318141) (xy 1.658995 5.319747) (xy 1.642534 5.320201) (xy 1.612425 5.320716) (xy 1.585661 5.320808) (xy 1.564608 5.320497)
|
||||
(xy 1.551629 5.319801) (xy 1.549400 5.319463) (xy 1.538363 5.316897) (xy 1.520220 5.312726) (xy 1.498873 5.307847) (xy 1.498600 5.307785) (xy 1.439970 5.289154) (xy 1.387900 5.261882)
|
||||
(xy 1.343048 5.226717) (xy 1.306072 5.184411) (xy 1.277631 5.135714) (xy 1.258383 5.081376) (xy 1.249074 5.023395) (xy 1.249544 4.989207) (xy 1.450622 4.989207) (xy 1.455603 5.025126)
|
||||
(xy 1.470519 5.055709) (xy 1.495333 5.080909) (xy 1.530007 5.100680) (xy 1.544968 5.106485) (xy 1.559733 5.111361) (xy 1.573201 5.114836) (xy 1.587619 5.117103) (xy 1.605234 5.118353)
|
||||
(xy 1.628292 5.118780) (xy 1.659042 5.118575) (xy 1.682085 5.118230) (xy 1.717843 5.117581) (xy 1.744425 5.116785) (xy 1.763941 5.115549) (xy 1.778501 5.113577) (xy 1.790216 5.110574)
|
||||
(xy 1.801198 5.106247) (xy 1.813557 5.100300) (xy 1.814729 5.099715) (xy 1.838274 5.084839) (xy 1.856421 5.065710) (xy 1.869680 5.041009) (xy 1.878562 5.009412) (xy 1.883579 4.969599)
|
||||
(xy 1.885240 4.920247) (xy 1.885245 4.917260) (xy 1.885245 4.865511) (xy 1.731047 4.865511) (xy 1.681971 4.865636) (xy 1.642749 4.866056) (xy 1.611947 4.866841) (xy 1.588132 4.868059)
|
||||
(xy 1.569872 4.869780) (xy 1.555733 4.872074) (xy 1.546191 4.874435) (xy 1.508158 4.889822) (xy 1.479761 4.911069) (xy 1.460955 4.938230) (xy 1.451692 4.971362) (xy 1.450622 4.989207)
|
||||
(xy 1.249544 4.989207) (xy 1.249906 4.963002) (xy 1.261027 4.906404) (xy 1.281835 4.854431) (xy 1.311726 4.807913) (xy 1.350099 4.767681) (xy 1.396348 4.734565) (xy 1.449873 4.709396)
|
||||
(xy 1.484987 4.698516) (xy 1.498188 4.695736) (xy 1.514824 4.693432) (xy 1.536169 4.691534) (xy 1.563497 4.689973) (xy 1.598084 4.688677) (xy 1.641204 4.687576) (xy 1.694131 4.686600)
|
||||
(xy 1.703750 4.686448) (xy 1.886322 4.683626) (xy 1.884207 4.609469) (xy 1.882205 4.569417) (xy 1.878312 4.538722) (xy 1.871823 4.515511) (xy 1.862031 4.497914) (xy 1.848230 4.484060)
|
||||
(xy 1.833043 4.473959) (xy 1.811720 4.463084) (xy 1.789547 4.455255) (xy 1.763680 4.449817) (xy 1.731281 4.446113) (xy 1.704622 4.444281) (xy 1.641966 4.443696) (xy 1.588340 4.449596)
|
||||
(xy 1.543811 4.461963) (xy 1.508446 4.480781) (xy 1.485287 4.502261) (xy 1.468010 4.523221) (xy 1.386183 4.461533) (xy 1.360043 4.441549) (xy 1.337331 4.423658) (xy 1.319483 4.409033)
|
||||
(xy 1.307936 4.398850) (xy 1.304111 4.394392) (xy 1.307808 4.388379) (xy 1.317972 4.376520) (xy 1.332884 4.360740) (xy 1.344789 4.348821) (xy 1.388779 4.312171) (xy 1.438254 4.283401)
|
||||
(xy 1.493869 4.262332) (xy 1.556279 4.248783) (xy 1.626140 4.242573) (xy 1.704107 4.243521) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 3.554050 4.248824) (xy 3.621233 4.264096) (xy 3.683475 4.289040) (xy 3.740079 4.323137) (xy 3.790350 4.365869) (xy 3.833591 4.416717) (xy 3.869107 4.475161) (xy 3.896200 4.540685)
|
||||
(xy 3.900733 4.555221) (xy 3.904825 4.570271) (xy 3.908006 4.585468) (xy 3.910432 4.602646) (xy 3.912260 4.623641) (xy 3.913648 4.650286) (xy 3.914752 4.684417) (xy 3.915729 4.727869)
|
||||
(xy 3.915799 4.731456) (xy 3.918419 4.865511) (xy 3.262489 4.865511) (xy 3.262489 4.889725) (xy 3.264000 4.909155) (xy 3.267874 4.932813) (xy 3.271141 4.947158) (xy 3.288718 4.995554)
|
||||
(xy 3.314401 5.036184) (xy 3.348596 5.069540) (xy 3.391708 5.096110) (xy 3.396309 5.098312) (xy 3.417120 5.107191) (xy 3.436237 5.112845) (xy 3.457935 5.116208) (xy 3.486491 5.118216)
|
||||
(xy 3.487659 5.118273) (xy 3.517237 5.118759) (xy 3.546057 5.117624) (xy 3.569433 5.115085) (xy 3.573634 5.114307) (xy 3.608734 5.103862) (xy 3.647116 5.087228) (xy 3.684421 5.066521)
|
||||
(xy 3.712744 5.046733) (xy 3.731864 5.033114) (xy 3.745032 5.027169) (xy 3.749832 5.027570) (xy 3.758109 5.033644) (xy 3.772323 5.045131) (xy 3.790755 5.060538) (xy 3.811687 5.078375)
|
||||
(xy 3.833399 5.097151) (xy 3.854172 5.115372) (xy 3.872287 5.131549) (xy 3.886026 5.144189) (xy 3.893668 5.151800) (xy 3.894667 5.153240) (xy 3.890636 5.159487) (xy 3.879932 5.170945)
|
||||
(xy 3.864639 5.185703) (xy 3.846839 5.201846) (xy 3.828615 5.217461) (xy 3.812052 5.230636) (xy 3.804356 5.236181) (xy 3.749001 5.268364) (xy 3.687811 5.294322) (xy 3.625120 5.312332)
|
||||
(xy 3.601156 5.316837) (xy 3.564219 5.320648) (xy 3.520832 5.321966) (xy 3.475540 5.320865) (xy 3.432889 5.317417) (xy 3.407742 5.313773) (xy 3.342260 5.296777) (xy 3.280902 5.270597)
|
||||
(xy 3.225276 5.236104) (xy 3.176988 5.194168) (xy 3.167004 5.183466) (xy 3.148661 5.159939) (xy 3.129179 5.129825) (xy 3.111165 5.097188) (xy 3.109628 5.094111) (xy 3.087177 5.043126)
|
||||
(xy 3.070263 4.991266) (xy 3.058430 4.936250) (xy 3.051226 4.875794) (xy 3.048196 4.807619) (xy 3.048033 4.784670) (xy 3.051216 4.700979) (xy 3.056008 4.663497) (xy 3.262489 4.663497)
|
||||
(xy 3.262489 4.684889) (xy 3.702756 4.684889) (xy 3.702672 4.669367) (xy 3.698624 4.634319) (xy 3.687813 4.595598) (xy 3.671731 4.557235) (xy 3.651864 4.523261) (xy 3.645543 4.514722)
|
||||
(xy 3.615851 4.485707) (xy 3.579571 4.464192) (xy 3.538662 4.450298) (xy 3.495081 4.444147) (xy 3.450784 4.445861) (xy 3.407731 4.455562) (xy 3.367877 4.473372) (xy 3.337339 4.495548)
|
||||
(xy 3.309276 4.527421) (xy 3.286470 4.566445) (xy 3.270488 4.609106) (xy 3.262897 4.651885) (xy 3.262489 4.663497) (xy 3.056008 4.663497) (xy 3.060913 4.625144) (xy 3.077464 4.555572)
|
||||
(xy 3.101204 4.490669) (xy 3.117497 4.456289) (xy 3.141052 4.418282) (xy 3.172006 4.379898) (xy 3.207656 4.343852) (xy 3.245300 4.312854) (xy 3.282232 4.289617) (xy 3.285067 4.288179)
|
||||
(xy 3.337252 4.266030) (xy 3.390037 4.251843) (xy 3.446923 4.244831) (xy 3.482622 4.243743) (xy 3.554050 4.248824) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -3.475862 2.577931) (xy -3.414828 2.591508) (xy -3.365215 2.611112) (xy -3.339813 2.624711) (xy -3.316824 2.640630) (xy -3.292766 2.661470) (xy -3.276098 2.677690) (xy -3.241097 2.716816)
|
||||
(xy -3.215077 2.755909) (xy -3.196188 2.798123) (xy -3.186357 2.830670) (xy -3.181150 2.857703) (xy -3.176660 2.894283) (xy -3.172973 2.938682) (xy -3.170176 2.989176) (xy -3.168355 3.044039)
|
||||
(xy -3.167597 3.101546) (xy -3.167987 3.159970) (xy -3.168565 3.186289) (xy -3.170896 3.250990) (xy -3.174290 3.305814) (xy -3.179038 3.352148) (xy -3.185432 3.391378) (xy -3.193764 3.424891)
|
||||
(xy -3.204323 3.454072) (xy -3.217402 3.480308) (xy -3.233292 3.504985) (xy -3.236416 3.509291) (xy -3.276128 3.555848) (xy -3.320179 3.592813) (xy -3.370542 3.621632) (xy -3.412687 3.638444)
|
||||
(xy -3.452691 3.648450) (xy -3.497909 3.653858) (xy -3.544243 3.654552) (xy -3.587594 3.650414) (xy -3.615266 3.644197) (xy -3.665227 3.624764) (xy -3.715513 3.597082) (xy -3.761332 3.564006)
|
||||
(xy -3.798711 3.533174) (xy -3.798711 4.364372) (xy -3.764307 4.332520) (xy -3.716259 4.295548) (xy -3.662629 4.268327) (xy -3.603700 4.250962) (xy -3.539760 4.243559) (xy -3.524955 4.243278)
|
||||
(xy -3.462187 4.248465) (xy -3.403148 4.263798) (xy -3.348732 4.288498) (xy -3.299829 4.321785) (xy -3.257332 4.362880) (xy -3.222133 4.411003) (xy -3.195123 4.465374) (xy -3.177195 4.525214)
|
||||
(xy -3.172664 4.551242) (xy -3.171281 4.567331) (xy -3.170059 4.594232) (xy -3.169007 4.631466) (xy -3.168131 4.678557) (xy -3.167438 4.735027) (xy -3.166936 4.800401) (xy -3.166632 4.874201)
|
||||
(xy -3.166533 4.953409) (xy -3.166533 5.311422) (xy -3.381022 5.311422) (xy -3.381120 4.985456) (xy -3.381179 4.911083) (xy -3.381353 4.847064) (xy -3.381712 4.792463) (xy -3.382325 4.746344)
|
||||
(xy -3.383261 4.707772) (xy -3.384590 4.675811) (xy -3.386380 4.649527) (xy -3.388701 4.627983) (xy -3.391622 4.610245) (xy -3.395213 4.595376) (xy -3.399542 4.582441) (xy -3.404679 4.570505)
|
||||
(xy -3.410693 4.558633) (xy -3.413028 4.554300) (xy -3.437865 4.519759) (xy -3.470670 4.490928) (xy -3.508591 4.470292) (xy -3.510014 4.469734) (xy -3.546596 4.460206) (xy -3.588019 4.456862)
|
||||
(xy -3.629685 4.459701) (xy -3.666994 4.468717) (xy -3.670027 4.469850) (xy -3.708954 4.490767) (xy -3.742359 4.520516) (xy -3.768921 4.557453) (xy -3.787324 4.599933) (xy -3.793195 4.623478)
|
||||
(xy -3.794292 4.634959) (xy -3.795301 4.656793) (xy -3.796207 4.688041) (xy -3.796996 4.727766) (xy -3.797654 4.775032) (xy -3.798165 4.828902) (xy -3.798516 4.888439) (xy -3.798693 4.952705)
|
||||
(xy -3.798711 4.981993) (xy -3.798711 5.311422) (xy -4.013200 5.311422) (xy -4.013200 3.129572) (xy -3.796221 3.129572) (xy -3.795459 3.172792) (xy -3.793738 3.212831) (xy -3.791056 3.247289)
|
||||
(xy -3.787412 3.273765) (xy -3.785864 3.280884) (xy -3.769259 3.330883) (xy -3.746872 3.371319) (xy -3.718455 3.402465) (xy -3.683758 3.424596) (xy -3.644371 3.437605) (xy -3.610803 3.441407)
|
||||
(xy -3.572649 3.440423) (xy -3.534607 3.435115) (xy -3.501371 3.425944) (xy -3.493649 3.422784) (xy -3.460590 3.403159) (xy -3.433904 3.376361) (xy -3.412898 3.341398) (xy -3.396881 3.297279)
|
||||
(xy -3.391658 3.276591) (xy -3.388411 3.255189) (xy -3.386010 3.224925) (xy -3.384438 3.188105) (xy -3.383677 3.147033) (xy -3.383711 3.104013) (xy -3.384522 3.061350) (xy -3.386093 3.021348)
|
||||
(xy -3.388407 2.986312) (xy -3.391447 2.958546) (xy -3.394132 2.944121) (xy -3.409700 2.896431) (xy -3.430645 2.858386) (xy -3.457744 2.829323) (xy -3.491772 2.808577) (xy -3.533507 2.795486)
|
||||
(xy -3.574436 2.789968) (xy -3.624827 2.790537) (xy -3.668661 2.800239) (xy -3.706058 2.819162) (xy -3.737134 2.847396) (xy -3.762008 2.885029) (xy -3.780797 2.932150) (xy -3.785683 2.949804)
|
||||
(xy -3.789699 2.972911) (xy -3.792762 3.004842) (xy -3.794871 3.043196) (xy -3.796025 3.085573) (xy -3.796221 3.129572) (xy -4.013200 3.129572) (xy -4.013200 2.585156) (xy -3.798711 2.585156)
|
||||
(xy -3.798711 2.693273) (xy -3.769078 2.668121) (xy -3.715513 2.629498) (xy -3.658364 2.601019) (xy -3.598675 2.582834) (xy -3.537493 2.575088) (xy -3.475862 2.577931) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -1.390535 4.247584) (xy -1.333384 4.262004) (xy -1.280751 4.285671) (xy -1.273205 4.290105) (xy -1.255842 4.300373) (xy -1.243067 4.308366) (xy -1.235179 4.315541) (xy -1.232475 4.323356)
|
||||
(xy -1.235253 4.333266) (xy -1.243811 4.346730) (xy -1.258448 4.365203) (xy -1.279460 4.390144) (xy -1.298196 4.412318) (xy -1.320945 4.439211) (xy -1.341384 4.463031) (xy -1.358357 4.482460)
|
||||
(xy -1.370711 4.496180) (xy -1.377292 4.502875) (xy -1.377905 4.503299) (xy -1.385255 4.501546) (xy -1.397135 4.494841) (xy -1.399491 4.493213) (xy -1.431843 4.473769) (xy -1.464671 4.462273)
|
||||
(xy -1.502018 4.457499) (xy -1.518355 4.457194) (xy -1.568557 4.461923) (xy -1.612034 4.475696) (xy -1.648923 4.498596) (xy -1.679364 4.530706) (xy -1.700181 4.565114) (xy -1.718733 4.602789)
|
||||
(xy -1.720345 4.957106) (xy -1.721958 5.311422) (xy -1.936044 5.311422) (xy -1.936044 4.255911) (xy -1.721555 4.255911) (xy -1.721555 4.364372) (xy -1.688391 4.333667) (xy -1.653546 4.304417)
|
||||
(xy -1.619332 4.282693) (xy -1.581425 4.265878) (xy -1.569511 4.261676) (xy -1.510557 4.247231) (xy -1.450246 4.242597) (xy -1.390535 4.247584) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 0.679655 4.618418) (xy 0.699590 4.679923) (xy 0.718579 4.738274) (xy 0.736326 4.792583) (xy 0.752539 4.841959) (xy 0.766922 4.885514) (xy 0.779181 4.922357) (xy 0.789022 4.951598)
|
||||
(xy 0.796151 4.972348) (xy 0.800273 4.983718) (xy 0.801142 4.985639) (xy 0.803301 4.981472) (xy 0.808123 4.967136) (xy 0.815626 4.942562) (xy 0.825831 4.907680) (xy 0.838757 4.862422)
|
||||
(xy 0.854423 4.806718) (xy 0.872848 4.740498) (xy 0.894053 4.663693) (xy 0.918056 4.576235) (xy 0.944876 4.478053) (xy 0.974534 4.369079) (xy 1.000269 4.274256) (xy 1.005242 4.255911)
|
||||
(xy 1.118469 4.255911) (xy 1.158505 4.256063) (xy 1.188388 4.256564) (xy 1.209252 4.257489) (xy 1.222228 4.258908) (xy 1.228450 4.260895) (xy 1.229317 4.262967) (xy 1.227299 4.269240)
|
||||
(xy 1.222089 4.285524) (xy 1.213926 4.311074) (xy 1.203048 4.345145) (xy 1.189692 4.386991) (xy 1.174096 4.435868) (xy 1.156498 4.491031) (xy 1.137134 4.551734) (xy 1.116244 4.617233)
|
||||
(xy 1.094065 4.686783) (xy 1.070834 4.759639) (xy 1.060924 4.790722) (xy 0.894910 5.311422) (xy 0.706086 5.311422) (xy 0.700912 5.293078) (xy 0.696208 5.276752) (xy 0.688902 5.251859)
|
||||
(xy 0.679325 5.219496) (xy 0.667807 5.180757) (xy 0.654676 5.136738) (xy 0.640263 5.088534) (xy 0.624896 5.037240) (xy 0.608906 4.983952) (xy 0.592622 4.929766) (xy 0.576374 4.875776)
|
||||
(xy 0.560490 4.823077) (xy 0.545302 4.772766) (xy 0.531138 4.725937) (xy 0.518327 4.683686) (xy 0.507200 4.647108) (xy 0.498087 4.617298) (xy 0.491315 4.595352) (xy 0.487216 4.582366)
|
||||
(xy 0.486115 4.579196) (xy 0.483902 4.583258) (xy 0.478774 4.597280) (xy 0.471006 4.620391) (xy 0.460870 4.651721) (xy 0.448642 4.690401) (xy 0.434595 4.735559) (xy 0.419003 4.786327)
|
||||
(xy 0.402139 4.841835) (xy 0.384279 4.901211) (xy 0.375932 4.929151) (xy 0.357593 4.990625) (xy 0.340110 5.049129) (xy 0.323765 5.103728) (xy 0.308839 5.153487) (xy 0.295612 5.197473)
|
||||
(xy 0.284367 5.234749) (xy 0.275384 5.264382) (xy 0.268946 5.285438) (xy 0.265331 5.296980) (xy 0.264740 5.298722) (xy 0.262582 5.303414) (xy 0.259096 5.306780) (xy 0.252589 5.309040)
|
||||
(xy 0.241371 5.310414) (xy 0.223747 5.311122) (xy 0.198026 5.311385) (xy 0.167118 5.311422) (xy 0.074311 5.311422) (xy 0.054351 5.250745) (xy 0.049421 5.235590) (xy 0.041381 5.210663)
|
||||
(xy 0.030545 5.176944) (xy 0.017227 5.135417) (xy 0.001743 5.087066) (xy -0.015593 5.032873) (xy -0.034467 4.973822) (xy -0.054564 4.910894) (xy -0.075569 4.845074) (xy -0.097168 4.777344)
|
||||
(xy -0.098751 4.772378) (xy -0.120267 4.704901) (xy -0.141128 4.639523) (xy -0.161028 4.577196) (xy -0.179664 4.518870) (xy -0.196732 4.465496) (xy -0.211927 4.418026) (xy -0.224945 4.377410)
|
||||
(xy -0.235482 4.344599) (xy -0.243234 4.320544) (xy -0.247896 4.306196) (xy -0.248191 4.305300) (xy -0.264488 4.255911) (xy -0.150589 4.255968) (xy -0.036689 4.256026) (xy 0.061521 4.616833)
|
||||
(xy 0.078386 4.678664) (xy 0.094462 4.737353) (xy 0.109492 4.791979) (xy 0.123221 4.841624) (xy 0.135391 4.885369) (xy 0.145748 4.922294) (xy 0.154034 4.951480) (xy 0.159994 4.972008)
|
||||
(xy 0.163372 4.982958) (xy 0.163971 4.984500) (xy 0.167119 4.982006) (xy 0.172859 4.970017) (xy 0.180644 4.949884) (xy 0.189929 4.922954) (xy 0.194096 4.910091) (xy 0.200976 4.888589)
|
||||
(xy 0.210888 4.857749) (xy 0.223382 4.818967) (xy 0.238005 4.773643) (xy 0.254306 4.723175) (xy 0.271834 4.668963) (xy 0.290136 4.612403) (xy 0.308762 4.554896) (xy 0.312365 4.543778)
|
||||
(xy 0.404749 4.258734) (xy 0.562293 4.255614) (xy 0.679655 4.618418) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 2.841307 4.243797) (xy 2.868889 4.245889) (xy 2.891458 4.249003) (xy 2.895600 4.249864) (xy 2.917001 4.256371) (xy 2.943502 4.266717) (xy 2.971735 4.279336) (xy 2.998336 4.292663)
|
||||
(xy 3.019937 4.305131) (xy 3.030288 4.312516) (xy 3.043619 4.323655) (xy 2.968971 4.412550) (xy 2.946257 4.439412) (xy 2.925845 4.463197) (xy 2.908892 4.482587) (xy 2.896557 4.496259)
|
||||
(xy 2.889995 4.502896) (xy 2.889399 4.503299) (xy 2.881976 4.501544) (xy 2.870054 4.494833) (xy 2.867709 4.493213) (xy 2.852246 4.483631) (xy 2.832550 4.473214) (xy 2.823882 4.469129)
|
||||
(xy 2.793625 4.460179) (xy 2.757347 4.456600) (xy 2.718940 4.458358) (xy 2.682295 4.465420) (xy 2.667017 4.470473) (xy 2.632263 4.489331) (xy 2.600680 4.516714) (xy 2.575019 4.549866)
|
||||
(xy 2.561671 4.575969) (xy 2.548467 4.608689) (xy 2.546892 4.960056) (xy 2.545317 5.311422) (xy 2.331156 5.311422) (xy 2.331156 4.255911) (xy 2.545645 4.255911) (xy 2.545645 4.364156)
|
||||
(xy 2.582270 4.330595) (xy 2.630489 4.293668) (xy 2.683578 4.266853) (xy 2.741710 4.250084) (xy 2.805059 4.243296) (xy 2.813756 4.243142) (xy 2.841307 4.243797) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -4.586122 2.576532) (xy -4.523134 2.585184) (xy -4.465548 2.601232) (xy -4.463110 2.602134) (xy -4.411940 2.626594) (xy -4.362738 2.660143) (xy -4.317451 2.700845) (xy -4.278023 2.746764)
|
||||
(xy -4.246399 2.795964) (xy -4.228193 2.835931) (xy -4.219147 2.861948) (xy -4.212037 2.886753) (xy -4.206585 2.912364) (xy -4.202515 2.940799) (xy -4.199550 2.974075) (xy -4.197414 3.014211)
|
||||
(xy -4.195830 3.063223) (xy -4.195563 3.073958) (xy -4.194601 3.142281) (xy -4.195396 3.200986) (xy -4.198164 3.251635) (xy -4.203120 3.295793) (xy -4.210480 3.335024) (xy -4.220461 3.370892)
|
||||
(xy -4.233278 3.404962) (xy -4.244657 3.429817) (xy -4.269420 3.471363) (xy -4.302243 3.513011) (xy -4.340353 3.551688) (xy -4.380977 3.584322) (xy -4.389113 3.589824) (xy -4.442475 3.618425)
|
||||
(xy -4.502286 3.639308) (xy -4.566374 3.652042) (xy -4.632567 3.656194) (xy -4.698692 3.651334) (xy -4.698780 3.651322) (xy -4.765656 3.636054) (xy -4.828392 3.610669) (xy -4.885920 3.575814)
|
||||
(xy -4.937174 3.532137) (xy -4.981086 3.480285) (xy -4.981438 3.479792) (xy -5.002607 3.447583) (xy -5.019779 3.415154) (xy -5.033369 3.380821) (xy -5.043792 3.342902) (xy -5.051461 3.299715)
|
||||
(xy -5.056791 3.249579) (xy -5.060195 3.190811) (xy -5.061372 3.155188) (xy -5.061429 3.149703) (xy -4.847688 3.149703) (xy -4.846302 3.201872) (xy -4.842573 3.245591) (xy -4.836232 3.282209)
|
||||
(xy -4.827007 3.313074) (xy -4.814630 3.339532) (xy -4.798830 3.362932) (xy -4.789691 3.373763) (xy -4.756257 3.402806) (xy -4.716319 3.423985) (xy -4.671858 3.436884) (xy -4.624856 3.441084)
|
||||
(xy -4.577293 3.436169) (xy -4.541751 3.425991) (xy -4.502818 3.405556) (xy -4.469424 3.376053) (xy -4.442594 3.338765) (xy -4.423353 3.294969) (xy -4.416617 3.269716) (xy -4.413331 3.247087)
|
||||
(xy -4.410860 3.215727) (xy -4.409207 3.178141) (xy -4.408372 3.136836) (xy -4.408357 3.094317) (xy -4.409162 3.053090) (xy -4.410791 3.015660) (xy -4.413244 2.984532) (xy -4.416440 2.962594)
|
||||
(xy -4.431616 2.912734) (xy -4.454258 2.871329) (xy -4.484452 2.838293) (xy -4.522280 2.813541) (xy -4.567827 2.796986) (xy -4.582297 2.793745) (xy -4.630158 2.789345) (xy -4.676863 2.794503)
|
||||
(xy -4.720673 2.808511) (xy -4.759850 2.830658) (xy -4.792655 2.860236) (xy -4.812468 2.887613) (xy -4.822406 2.906123) (xy -4.830147 2.924850) (xy -4.836006 2.945627) (xy -4.840300 2.970290)
|
||||
(xy -4.843345 3.000671) (xy -4.845459 3.038606) (xy -4.846957 3.085929) (xy -4.847002 3.087739) (xy -4.847688 3.149703) (xy -5.061429 3.149703) (xy -5.062187 3.076816) (xy -5.060012 3.008181)
|
||||
(xy -5.054528 2.948053) (xy -5.045418 2.895200) (xy -5.032365 2.848393) (xy -5.015052 2.806401) (xy -4.993160 2.767993) (xy -4.966374 2.731939) (xy -4.946425 2.709437) (xy -4.897812 2.663847)
|
||||
(xy -4.846951 2.628613) (xy -4.792173 2.602816) (xy -4.731807 2.585538) (xy -4.715515 2.582418) (xy -4.651316 2.575527) (xy -4.586122 2.576532) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -2.587978 2.577082) (xy -2.543070 2.578260) (xy -2.505524 2.582036) (xy -2.471544 2.589284) (xy -2.437335 2.600879) (xy -2.399101 2.617695) (xy -2.387600 2.623242) (xy -2.361898 2.636514)
|
||||
(xy -2.340832 2.649475) (xy -2.321112 2.664549) (xy -2.299449 2.684161) (xy -2.282697 2.700563) (xy -2.258840 2.725058) (xy -2.241118 2.745450) (xy -2.227111 2.765006) (xy -2.214401 2.786991)
|
||||
(xy -2.205119 2.805289) (xy -2.191924 2.832847) (xy -2.181559 2.856760) (xy -2.173654 2.879021) (xy -2.167838 2.901623) (xy -2.163739 2.926557) (xy -2.160987 2.955817) (xy -2.159210 2.991394)
|
||||
(xy -2.158039 3.035281) (xy -2.157569 3.060700) (xy -2.155282 3.194756) (xy -2.810933 3.194756) (xy -2.810933 3.213741) (xy -2.807426 3.250390) (xy -2.797748 3.290291) (xy -2.783543 3.327392)
|
||||
(xy -2.758471 3.368223) (xy -2.725410 3.401675) (xy -2.685325 3.427237) (xy -2.639186 3.444400) (xy -2.587958 3.452656) (xy -2.545644 3.452622) (xy -2.497474 3.446591) (xy -2.454500 3.434591)
|
||||
(xy -2.413433 3.415347) (xy -2.370985 3.387585) (xy -2.363481 3.381992) (xy -2.327395 3.354679) (xy -2.254486 3.416489) (xy -2.230270 3.437334) (xy -2.209256 3.456019) (xy -2.192906 3.471198)
|
||||
(xy -2.182682 3.481521) (xy -2.179915 3.485264) (xy -2.183120 3.492629) (xy -2.193563 3.505033) (xy -2.209419 3.520786) (xy -2.228863 3.538196) (xy -2.250070 3.555573) (xy -2.271213 3.571227)
|
||||
(xy -2.276824 3.575038) (xy -2.335352 3.607494) (xy -2.400228 3.632022) (xy -2.469373 3.648205) (xy -2.540708 3.655627) (xy -2.612154 3.653870) (xy -2.647762 3.649340) (xy -2.719330 3.632674)
|
||||
(xy -2.783622 3.607385) (xy -2.840547 3.573557) (xy -2.890012 3.531277) (xy -2.931924 3.480631) (xy -2.966190 3.421703) (xy -2.992719 3.354580) (xy -3.002164 3.321503) (xy -3.013843 3.262827)
|
||||
(xy -3.021307 3.197201) (xy -3.024489 3.128176) (xy -3.023323 3.059300) (xy -3.018796 3.006437) (xy -2.810933 3.006437) (xy -2.810933 3.019778) (xy -2.370666 3.019778) (xy -2.370666 2.998386)
|
||||
(xy -2.375808 2.954825) (xy -2.390314 2.910829) (xy -2.412805 2.869433) (xy -2.441900 2.833667) (xy -2.448453 2.827399) (xy -2.484344 2.801903) (xy -2.525188 2.785237) (xy -2.569052 2.777287)
|
||||
(xy -2.614001 2.777939) (xy -2.658102 2.787078) (xy -2.699420 2.804592) (xy -2.736021 2.830365) (xy -2.750995 2.845246) (xy -2.772245 2.875074) (xy -2.790193 2.912060) (xy -2.803358 2.952220)
|
||||
(xy -2.810258 2.991570) (xy -2.810933 3.006437) (xy -3.018796 3.006437) (xy -3.017741 2.994125) (xy -3.009322 2.943578) (xy -2.988483 2.867973) (xy -2.960218 2.800615) (xy -2.924616 2.741630)
|
||||
(xy -2.881765 2.691143) (xy -2.831753 2.649280) (xy -2.779889 2.618683) (xy -2.742342 2.601610) (xy -2.708373 2.589693) (xy -2.674380 2.582152) (xy -2.636760 2.578207) (xy -2.591911 2.577075)
|
||||
(xy -2.587978 2.577082) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -0.041013 2.575989) (xy 0.040288 2.586119) (xy 0.118421 2.605882) (xy 0.192088 2.634920) (xy 0.259985 2.672875) (xy 0.280585 2.687065) (xy 0.300017 2.701536) (xy 0.311433 2.711392)
|
||||
(xy 0.316235 2.718246) (xy 0.315826 2.723705) (xy 0.314452 2.725952) (xy 0.308564 2.733345) (xy 0.296766 2.747613) (xy 0.280485 2.767048) (xy 0.261147 2.789945) (xy 0.248991 2.804257)
|
||||
(xy 0.190360 2.873149) (xy 0.172791 2.861563) (xy 0.143810 2.844377) (xy 0.108533 2.826318) (xy 0.071536 2.809549) (xy 0.037396 2.796235) (xy 0.027944 2.793096) (xy 0.008439 2.787505)
|
||||
(xy -0.010041 2.783717) (xy -0.030498 2.781404) (xy -0.055937 2.780238) (xy -0.089361 2.779891) (xy -0.093133 2.779889) (xy -0.125199 2.780034) (xy -0.148516 2.780696) (xy -0.165622 2.782215)
|
||||
(xy -0.179056 2.784932) (xy -0.191356 2.789187) (xy -0.203804 2.794729) (xy -0.235337 2.814545) (xy -0.257146 2.839969) (xy -0.269450 2.871269) (xy -0.270274 2.875303) (xy -0.272298 2.909382)
|
||||
(xy -0.264506 2.938014) (xy -0.246765 2.961418) (xy -0.218946 2.979814) (xy -0.203995 2.986185) (xy -0.188989 2.990803) (xy -0.169642 2.994792) (xy -0.144322 2.998373) (xy -0.111396 3.001768)
|
||||
(xy -0.069232 3.005196) (xy -0.056868 3.006098) (xy -0.018276 3.009138) (xy 0.019728 3.012627) (xy 0.054502 3.016286) (xy 0.083404 3.019837) (xy 0.103791 3.023000) (xy 0.104422 3.023120)
|
||||
(xy 0.162274 3.039324) (xy 0.212953 3.064083) (xy 0.256116 3.097079) (xy 0.291419 3.137997) (xy 0.318518 3.186517) (xy 0.335723 3.236864) (xy 0.341003 3.266846) (xy 0.343716 3.302670)
|
||||
(xy 0.343872 3.340321) (xy 0.341481 3.375779) (xy 0.336552 3.405030) (xy 0.335306 3.409631) (xy 0.314334 3.461416) (xy 0.283650 3.508387) (xy 0.244053 3.549841) (xy 0.196345 3.585078)
|
||||
(xy 0.141326 3.613397) (xy 0.079795 3.634097) (xy 0.078718 3.634374) (xy 0.024528 3.645723) (xy -0.032301 3.653184) (xy -0.087845 3.656419) (xy -0.138176 3.655091) (xy -0.149578 3.653996)
|
||||
(xy -0.231500 3.640633) (xy -0.306699 3.619572) (xy -0.377215 3.590229) (xy -0.383822 3.586950) (xy -0.410578 3.572369) (xy -0.440435 3.554293) (xy -0.470868 3.534438) (xy -0.499348 3.514519)
|
||||
(xy -0.523350 3.496252) (xy -0.540346 3.481353) (xy -0.542245 3.479397) (xy -0.555459 3.465332) (xy -0.482664 3.392376) (xy -0.409870 3.319420) (xy -0.380261 3.344715) (xy -0.322153 3.387288)
|
||||
(xy -0.259667 3.419454) (xy -0.192803 3.441217) (xy -0.121554 3.452577) (xy -0.077300 3.454400) (xy -0.027732 3.451355) (xy 0.017318 3.442590) (xy 0.056323 3.428663) (xy 0.087760 3.410130)
|
||||
(xy 0.110104 3.387549) (xy 0.111566 3.385413) (xy 0.123003 3.360715) (xy 0.128904 3.331924) (xy 0.129019 3.302972) (xy 0.123100 3.277792) (xy 0.118886 3.269493) (xy 0.110590 3.257587)
|
||||
(xy 0.101238 3.247727) (xy 0.089594 3.239575) (xy 0.074420 3.232794) (xy 0.054481 3.227044) (xy 0.028539 3.221989) (xy -0.004642 3.217289) (xy -0.046299 3.212607) (xy -0.097668 3.207604)
|
||||
(xy -0.112465 3.206237) (xy -0.157143 3.201957) (xy -0.192527 3.198077) (xy -0.220593 3.194282) (xy -0.243312 3.190259) (xy -0.262658 3.185695) (xy -0.280606 3.180275) (xy -0.284870 3.178831)
|
||||
(xy -0.340916 3.154596) (xy -0.387855 3.123693) (xy -0.425649 3.086174) (xy -0.454262 3.042091) (xy -0.473657 2.991494) (xy -0.483796 2.934436) (xy -0.485422 2.897689) (xy -0.480528 2.836623)
|
||||
(xy -0.466041 2.781269) (xy -0.442255 2.731888) (xy -0.409461 2.688741) (xy -0.367954 2.652088) (xy -0.318026 2.622192) (xy -0.259970 2.599312) (xy -0.194079 2.583710) (xy -0.124178 2.575849)
|
||||
(xy -0.041013 2.575989) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 0.954676 2.577853) (xy 1.020691 2.589594) (xy 1.064657 2.602975) (xy 1.118626 2.627920) (xy 1.169340 2.661805) (xy 1.215176 2.702969) (xy 1.254511 2.749751) (xy 1.285721 2.800491)
|
||||
(xy 1.306103 2.850002) (xy 1.314767 2.879346) (xy 1.321539 2.906925) (xy 1.326635 2.934753) (xy 1.330270 2.964842) (xy 1.332662 2.999207) (xy 1.334025 3.039860) (xy 1.334576 3.088816)
|
||||
(xy 1.334616 3.115734) (xy 1.334112 3.175020) (xy 1.332553 3.224838) (xy 1.329724 3.266979) (xy 1.325414 3.303231) (xy 1.319410 3.335385) (xy 1.311498 3.365230) (xy 1.301467 3.394556)
|
||||
(xy 1.301453 3.394591) (xy 1.274699 3.450175) (xy 1.238503 3.501603) (xy 1.194349 3.547560) (xy 1.143721 3.586732) (xy 1.088102 3.617806) (xy 1.028976 3.639468) (xy 1.023263 3.640980)
|
||||
(xy 0.988691 3.647757) (xy 0.948009 3.652522) (xy 0.905551 3.655012) (xy 0.865649 3.654962) (xy 0.834952 3.652450) (xy 0.774008 3.640061) (xy 0.719445 3.620456) (xy 0.669092 3.592525)
|
||||
(xy 0.620777 3.555157) (xy 0.592485 3.528371) (xy 0.558834 3.491541) (xy 0.531668 3.454655) (xy 0.510298 3.415895) (xy 0.494034 3.373443) (xy 0.482186 3.325480) (xy 0.474062 3.270189)
|
||||
(xy 0.468975 3.205751) (xy 0.468801 3.202503) (xy 0.466663 3.134801) (xy 0.679373 3.134801) (xy 0.680966 3.183650) (xy 0.684566 3.229419) (xy 0.689450 3.265270) (xy 0.702840 3.312808)
|
||||
(xy 0.724949 3.354046) (xy 0.754679 3.388260) (xy 0.790932 3.414726) (xy 0.832610 3.432721) (xy 0.878617 3.441519) (xy 0.927855 3.440398) (xy 0.949400 3.436759) (xy 0.996870 3.421704)
|
||||
(xy 1.036721 3.398319) (xy 1.068950 3.366610) (xy 1.093552 3.326580) (xy 1.110524 3.278234) (xy 1.118162 3.237162) (xy 1.120258 3.213055) (xy 1.121548 3.181586) (xy 1.122078 3.145103)
|
||||
(xy 1.121899 3.105956) (xy 1.121059 3.066493) (xy 1.119606 3.029062) (xy 1.117590 2.996013) (xy 1.115059 2.969694) (xy 1.112263 2.953222) (xy 1.096028 2.908372) (xy 1.071913 2.868788)
|
||||
(xy 1.041258 2.836100) (xy 1.005405 2.811938) (xy 0.990425 2.805224) (xy 0.962092 2.797426) (xy 0.927634 2.792687) (xy 0.891339 2.791202) (xy 0.857497 2.793165) (xy 0.832556 2.798077)
|
||||
(xy 0.788906 2.817078) (xy 0.751708 2.845033) (xy 0.721867 2.881064) (xy 0.700289 2.924291) (xy 0.699125 2.927526) (xy 0.691705 2.956134) (xy 0.685952 2.993541) (xy 0.681934 3.037371)
|
||||
(xy 0.679718 3.085250) (xy 0.679373 3.134801) (xy 0.466663 3.134801) (xy 0.466590 3.132497) (xy 0.467282 3.064601) (xy 0.470735 3.000539) (xy 0.476806 2.942037) (xy 0.485352 2.890819)
|
||||
(xy 0.496231 2.848613) (xy 0.498666 2.841429) (xy 0.522599 2.789518) (xy 0.556053 2.739581) (xy 0.597261 2.693570) (xy 0.644454 2.653431) (xy 0.695865 2.621114) (xy 0.700841 2.618553)
|
||||
(xy 0.758489 2.595411) (xy 0.821437 2.580853) (xy 0.887545 2.574969) (xy 0.954676 2.577853) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 1.624189 2.586442) (xy 1.730022 2.587978) (xy 1.732845 2.937934) (xy 1.735667 3.287889) (xy 1.753134 3.324578) (xy 1.778425 3.365638) (xy 1.810592 3.398322) (xy 1.848497 3.422206)
|
||||
(xy 1.891000 3.436865) (xy 1.936965 3.441875) (xy 1.985253 3.436811) (xy 2.023869 3.425568) (xy 2.061780 3.405545) (xy 2.093358 3.376523) (xy 2.118179 3.339123) (xy 2.135817 3.293964)
|
||||
(xy 2.144988 3.248848) (xy 2.145974 3.235653) (xy 2.146905 3.212368) (xy 2.147763 3.180189) (xy 2.148530 3.140315) (xy 2.149187 3.093944) (xy 2.149716 3.042272) (xy 2.150099 2.986499)
|
||||
(xy 2.150317 2.927821) (xy 2.150359 2.897011) (xy 2.150534 2.585156) (xy 2.359378 2.585156) (xy 2.359378 3.646311) (xy 2.150534 3.646311) (xy 2.150534 3.589867) (xy 2.150318 3.566172)
|
||||
(xy 2.149738 3.547376) (xy 2.148891 3.535867) (xy 2.148219 3.533422) (xy 2.143351 3.537049) (xy 2.132531 3.546662) (xy 2.117887 3.560357) (xy 2.114285 3.563803) (xy 2.070759 3.598129)
|
||||
(xy 2.020376 3.625015) (xy 1.965248 3.643882) (xy 1.907485 3.654148) (xy 1.849195 3.655234) (xy 1.803879 3.649160) (xy 1.744779 3.631326) (xy 1.689843 3.603820) (xy 1.640415 3.567702)
|
||||
(xy 1.597838 3.524035) (xy 1.563456 3.473881) (xy 1.550883 3.449190) (xy 1.544788 3.435663) (xy 1.539512 3.422997) (xy 1.534995 3.410303) (xy 1.531177 3.396690) (xy 1.528001 3.381269)
|
||||
(xy 1.525406 3.363148) (xy 1.523333 3.341439) (xy 1.521723 3.315251) (xy 1.520517 3.283693) (xy 1.519656 3.245877) (xy 1.519080 3.200912) (xy 1.518731 3.147907) (xy 1.518548 3.085974)
|
||||
(xy 1.518473 3.014221) (xy 1.518454 2.961798) (xy 1.518356 2.584907) (xy 1.624189 2.586442) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 3.801675 2.577838) (xy 3.844086 2.582151) (xy 3.878618 2.589302) (xy 3.948098 2.614080) (xy 4.010655 2.646772) (xy 4.068497 2.688654) (xy 4.101124 2.718015) (xy 4.118807 2.735519)
|
||||
(xy 4.129248 2.747289) (xy 4.133631 2.755106) (xy 4.133140 2.760750) (xy 4.131333 2.763438) (xy 4.124724 2.770130) (xy 4.111269 2.782828) (xy 4.092569 2.800051) (xy 4.070228 2.820318)
|
||||
(xy 4.054423 2.834504) (xy 3.984991 2.896559) (xy 3.950057 2.864946) (xy 3.905014 2.830168) (xy 3.858287 2.806258) (xy 3.808722 2.792804) (xy 3.755165 2.789398) (xy 3.739445 2.790178)
|
||||
(xy 3.683623 2.798643) (xy 3.635217 2.815545) (xy 3.594054 2.841034) (xy 3.559960 2.875261) (xy 3.532759 2.918375) (xy 3.512278 2.970528) (xy 3.506705 2.990783) (xy 3.501961 3.018063)
|
||||
(xy 3.498791 3.053365) (xy 3.497191 3.093532) (xy 3.497160 3.135407) (xy 3.498697 3.175835) (xy 3.501799 3.211657) (xy 3.506464 3.239717) (xy 3.506853 3.241322) (xy 3.524854 3.295774)
|
||||
(xy 3.549603 3.341257) (xy 3.581229 3.377949) (xy 3.619860 3.406024) (xy 3.631094 3.411948) (xy 3.683545 3.431800) (xy 3.737358 3.441095) (xy 3.791115 3.440038) (xy 3.843400 3.428833)
|
||||
(xy 3.892796 3.407685) (xy 3.937887 3.376800) (xy 3.950198 3.365822) (xy 3.965571 3.351631) (xy 3.977683 3.341097) (xy 3.984336 3.336113) (xy 3.984838 3.335949) (xy 3.989984 3.339530)
|
||||
(xy 4.001626 3.349163) (xy 4.017921 3.363287) (xy 4.033179 3.376871) (xy 4.056004 3.397393) (xy 4.079603 3.418576) (xy 4.100352 3.437168) (xy 4.108908 3.444819) (xy 4.139259 3.471927)
|
||||
(xy 4.105863 3.505987) (xy 4.055495 3.550729) (xy 3.999040 3.589194) (xy 3.939132 3.619847) (xy 3.878408 3.641148) (xy 3.870822 3.643094) (xy 3.837021 3.649241) (xy 3.796579 3.653313)
|
||||
(xy 3.753989 3.655097) (xy 3.713745 3.654380) (xy 3.686164 3.651849) (xy 3.622866 3.638261) (xy 3.560523 3.615954) (xy 3.502246 3.586265) (xy 3.451578 3.550890) (xy 3.405826 3.506152)
|
||||
(xy 3.366772 3.453156) (xy 3.334657 3.392902) (xy 3.309721 3.326390) (xy 3.292203 3.254620) (xy 3.282345 3.178595) (xy 3.280385 3.099312) (xy 3.286565 3.017775) (xy 3.301125 2.934982)
|
||||
(xy 3.302394 2.929467) (xy 3.314651 2.888793) (xy 3.332627 2.844471) (xy 3.354433 2.800379) (xy 3.378180 2.760400) (xy 3.397857 2.733310) (xy 3.441085 2.688799) (xy 3.492739 2.649914)
|
||||
(xy 3.550846 2.617889) (xy 3.613436 2.593955) (xy 3.627243 2.589997) (xy 3.664596 2.582564) (xy 3.708444 2.578054) (xy 3.755299 2.576475) (xy 3.801675 2.577838) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 4.680628 2.577870) (xy 4.747110 2.590613) (xy 4.810783 2.612625) (xy 4.858168 2.636649) (xy 4.887059 2.656853) (xy 4.918455 2.683985) (xy 4.949423 2.715079) (xy 4.977028 2.747169)
|
||||
(xy 4.998338 2.777290) (xy 4.999929 2.779943) (xy 5.019248 2.815552) (xy 5.034448 2.850625) (xy 5.045939 2.887132) (xy 5.054135 2.927048) (xy 5.059446 2.972346) (xy 5.062285 3.024997)
|
||||
(xy 5.063067 3.082363) (xy 5.063067 3.194756) (xy 4.406682 3.194756) (xy 4.409821 3.235678) (xy 4.418834 3.288447) (xy 4.436959 3.334843) (xy 4.463656 3.374350) (xy 4.498390 3.406455)
|
||||
(xy 4.540620 3.430643) (xy 4.589810 3.446400) (xy 4.636911 3.452794) (xy 4.691945 3.450770) (xy 4.746949 3.438644) (xy 4.799332 3.417309) (xy 4.846502 3.387656) (xy 4.861164 3.375598)
|
||||
(xy 4.887861 3.352042) (xy 4.964246 3.417571) (xy 4.993070 3.442272) (xy 5.013927 3.460947) (xy 5.027174 3.475195) (xy 5.033168 3.486615) (xy 5.032268 3.496808) (xy 5.024829 3.507371)
|
||||
(xy 5.011209 3.519905) (xy 4.991765 3.536008) (xy 4.990864 3.536756) (xy 4.928186 3.581716) (xy 4.861274 3.616281) (xy 4.790605 3.640317) (xy 4.716654 3.653688) (xy 4.639895 3.656259)
|
||||
(xy 4.585953 3.651719) (xy 4.513626 3.637387) (xy 4.448232 3.614269) (xy 4.389917 3.582468) (xy 4.338831 3.542088) (xy 4.295122 3.493231) (xy 4.258938 3.436002) (xy 4.249807 3.417711)
|
||||
(xy 4.228678 3.366545) (xy 4.212926 3.313084) (xy 4.202163 3.255243) (xy 4.195999 3.190937) (xy 4.194046 3.118556) (xy 4.196408 3.040249) (xy 4.200837 2.998386) (xy 4.408311 2.998386)
|
||||
(xy 4.408311 3.019778) (xy 4.850132 3.019778) (xy 4.846478 2.988684) (xy 4.835523 2.934807) (xy 4.816491 2.887849) (xy 4.789979 2.848391) (xy 4.756585 2.817013) (xy 4.716908 2.794297)
|
||||
(xy 4.671545 2.780822) (xy 4.628445 2.777067) (xy 4.577621 2.782062) (xy 4.532309 2.796767) (xy 4.493043 2.820760) (xy 4.460354 2.853618) (xy 4.434776 2.894922) (xy 4.416841 2.944248)
|
||||
(xy 4.416731 2.944669) (xy 4.411969 2.966725) (xy 4.408917 2.988114) (xy 4.408311 2.998386) (xy 4.200837 2.998386) (xy 4.203781 2.970562) (xy 4.216598 2.907797) (xy 4.235291 2.850257)
|
||||
(xy 4.260291 2.796243) (xy 4.287671 2.750553) (xy 4.328354 2.698639) (xy 4.375732 2.655717) (xy 4.429976 2.621676) (xy 4.491256 2.596406) (xy 4.548508 2.581836) (xy 4.613655 2.574808)
|
||||
(xy 4.680628 2.577870) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy -1.455607 2.576709) (xy -1.398025 2.586547) (xy -1.342441 2.605476) (xy -1.290257 2.633465) (xy -1.242876 2.670481) (xy -1.236591 2.676494) (xy -1.196114 2.723587) (xy -1.165394 2.776020)
|
||||
(xy -1.144168 2.834319) (xy -1.134852 2.878667) (xy -1.133349 2.893126) (xy -1.132106 2.915635) (xy -1.131120 2.946627) (xy -1.130384 2.986540) (xy -1.129894 3.035808) (xy -1.129644 3.094867)
|
||||
(xy -1.129630 3.164153) (xy -1.129845 3.244101) (xy -1.130009 3.282245) (xy -1.131711 3.643489) (xy -1.340555 3.643489) (xy -1.343466 3.296356) (xy -1.344075 3.222962) (xy -1.344637 3.159941)
|
||||
(xy -1.345238 3.106376) (xy -1.345965 3.061351) (xy -1.346906 3.023951) (xy -1.348146 2.993258) (xy -1.349774 2.968359) (xy -1.351875 2.948336) (xy -1.354536 2.932273) (xy -1.357845 2.919255)
|
||||
(xy -1.361889 2.908366) (xy -1.366753 2.898690) (xy -1.372525 2.889310) (xy -1.379292 2.879311) (xy -1.383601 2.873022) (xy -1.412603 2.839697) (xy -1.447336 2.814834) (xy -1.486193 2.798315)
|
||||
(xy -1.527567 2.790026) (xy -1.569849 2.789849) (xy -1.611432 2.797668) (xy -1.650708 2.813368) (xy -1.686071 2.836831) (xy -1.715911 2.867942) (xy -1.734809 2.898422) (xy -1.740082 2.909605)
|
||||
(xy -1.744601 2.920906) (xy -1.748424 2.933257) (xy -1.751607 2.947586) (xy -1.754210 2.964824) (xy -1.756289 2.985901) (xy -1.757904 3.011746) (xy -1.759111 3.043289) (xy -1.759969 3.081461)
|
||||
(xy -1.760535 3.127191) (xy -1.760869 3.181409) (xy -1.761026 3.245044) (xy -1.761066 3.319028) (xy -1.761066 3.646311) (xy -1.864548 3.646311) (xy -1.897642 3.646115) (xy -1.926769 3.645570)
|
||||
(xy -1.950078 3.644741) (xy -1.965718 3.643694) (xy -1.971792 3.642548) (xy -1.972336 3.636482) (xy -1.972856 3.619916) (xy -1.973347 3.593641) (xy -1.973803 3.558446) (xy -1.974219 3.515121)
|
||||
(xy -1.974589 3.464455) (xy -1.974908 3.407239) (xy -1.975169 3.344261) (xy -1.975367 3.276312) (xy -1.975497 3.204181) (xy -1.975554 3.128658) (xy -1.975555 3.111971) (xy -1.975555 2.585156)
|
||||
(xy -1.761066 2.585156) (xy -1.761066 2.699339) (xy -1.724419 2.665057) (xy -1.677877 2.628940) (xy -1.626323 2.602080) (xy -1.571158 2.584443) (xy -1.513785 2.575997) (xy -1.455607 2.576709) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 3.117218 2.577431) (xy 3.144324 2.579681) (xy 3.166159 2.583822) (xy 3.177822 2.587301) (xy 3.201355 2.596444) (xy 3.228498 2.608742) (xy 3.255651 2.622390) (xy 3.279215 2.635583)
|
||||
(xy 3.294868 2.645955) (xy 3.307492 2.655711) (xy 3.236517 2.740378) (xy 3.214154 2.767001) (xy 3.193939 2.790967) (xy 3.177116 2.810807) (xy 3.164933 2.825051) (xy 3.158636 2.832231)
|
||||
(xy 3.158407 2.832474) (xy 3.152467 2.835802) (xy 3.143857 2.833732) (xy 3.129796 2.825460) (xy 3.126447 2.823233) (xy 3.087010 2.802883) (xy 3.044516 2.791687) (xy 3.000847 2.789324)
|
||||
(xy 2.957885 2.795474) (xy 2.917509 2.809815) (xy 2.881601 2.832027) (xy 2.852041 2.861789) (xy 2.845323 2.871182) (xy 2.838087 2.882133) (xy 2.831870 2.892127) (xy 2.826591 2.902076)
|
||||
(xy 2.822166 2.912896) (xy 2.818513 2.925501) (xy 2.815550 2.940804) (xy 2.813195 2.959722) (xy 2.811364 2.983167) (xy 2.809976 3.012054) (xy 2.808948 3.047298) (xy 2.808197 3.089813)
|
||||
(xy 2.807642 3.140513) (xy 2.807200 3.200313) (xy 2.806788 3.270126) (xy 2.806616 3.300589) (xy 2.804655 3.646311) (xy 2.700373 3.646311) (xy 2.660984 3.646106) (xy 2.631756 3.645440)
|
||||
(xy 2.611567 3.644241) (xy 2.599296 3.642433) (xy 2.593820 3.639943) (xy 2.593400 3.639256) (xy 2.593025 3.632701) (xy 2.592696 3.615658) (xy 2.592416 3.588926) (xy 2.592185 3.553305)
|
||||
(xy 2.592007 3.509594) (xy 2.591883 3.458595) (xy 2.591814 3.401106) (xy 2.591803 3.337928) (xy 2.591851 3.269861) (xy 2.591960 3.197704) (xy 2.592133 3.122258) (xy 2.592166 3.110089)
|
||||
(xy 2.593622 2.587978) (xy 2.699456 2.586442) (xy 2.805289 2.584907) (xy 2.805289 2.698992) (xy 2.840527 2.667104) (xy 2.885593 2.631236) (xy 2.931621 2.605094) (xy 2.980770 2.587868)
|
||||
(xy 3.035204 2.578750) (xy 3.081867 2.576744) (xy 3.117218 2.577431) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
(fp_poly (pts (xy 0.530628 -5.301544) (xy 0.547790 -5.286022) (xy 0.642971 -4.774559) (xy 0.661750 -4.674032) (xy 0.678626 -4.584493) (xy 0.693628 -4.505807) (xy 0.706781 -4.437839) (xy 0.718113 -4.380453)
|
||||
(xy 0.727651 -4.333516) (xy 0.735422 -4.296892) (xy 0.741452 -4.270446) (xy 0.745769 -4.254044) (xy 0.748092 -4.247926) (xy 0.760150 -4.234340) (xy 0.772716 -4.225225) (xy 0.780388 -4.221824)
|
||||
(xy 0.797594 -4.214538) (xy 0.823416 -4.203748) (xy 0.856935 -4.189832) (xy 0.897233 -4.173171) (xy 0.943391 -4.154145) (xy 0.994490 -4.133131) (xy 1.049613 -4.110511) (xy 1.107840 -4.086664)
|
||||
(xy 1.127167 -4.078758) (xy 1.202922 -4.047876) (xy 1.268741 -4.021255) (xy 1.325070 -3.998723) (xy 1.372354 -3.980110) (xy 1.411041 -3.965244) (xy 1.441576 -3.953954) (xy 1.464405 -3.946068)
|
||||
(xy 1.479974 -3.941415) (xy 1.488730 -3.939824) (xy 1.488947 -3.939822) (xy 1.493077 -3.939723) (xy 1.496781 -3.939670) (xy 1.500625 -3.940032) (xy 1.505175 -3.941176) (xy 1.510998 -3.943470)
|
||||
(xy 1.518658 -3.947282) (xy 1.528722 -3.952980) (xy 1.541757 -3.960932) (xy 1.558327 -3.971504) (xy 1.579000 -3.985066) (xy 1.604341 -4.001985) (xy 1.634916 -4.022629) (xy 1.671291 -4.047365)
|
||||
(xy 1.714032 -4.076562) (xy 1.763705 -4.110587) (xy 1.820876 -4.149808) (xy 1.886111 -4.194593) (xy 1.959976 -4.245309) (xy 1.976683 -4.256779) (xy 2.036924 -4.298041) (xy 2.094736 -4.337455)
|
||||
(xy 2.149413 -4.374550) (xy 2.200247 -4.408855) (xy 2.246531 -4.439898) (xy 2.287557 -4.467208) (xy 2.322618 -4.490313) (xy 2.351006 -4.508741) (xy 2.372014 -4.522021) (xy 2.384934 -4.529682)
|
||||
(xy 2.388776 -4.531447) (xy 2.405625 -4.529661) (xy 2.422642 -4.522074) (xy 2.429346 -4.516402) (xy 2.443399 -4.503320) (xy 2.464194 -4.483426) (xy 2.491124 -4.457317) (xy 2.523579 -4.425591)
|
||||
(xy 2.560954 -4.388844) (xy 2.602639 -4.347675) (xy 2.648027 -4.302680) (xy 2.696509 -4.254458) (xy 2.747479 -4.203605) (xy 2.792251 -4.158813) (xy 2.859786 -4.091062) (xy 2.919503 -4.030938)
|
||||
(xy 2.971655 -3.978178) (xy 3.016496 -3.932520) (xy 3.054280 -3.893698) (xy 3.085262 -3.861451) (xy 3.109695 -3.835514) (xy 3.127834 -3.815625) (xy 3.139932 -3.801519) (xy 3.146244 -3.792933)
|
||||
(xy 3.147302 -3.790660) (xy 3.148317 -3.772894) (xy 3.145466 -3.758623) (xy 3.141456 -3.751743) (xy 3.131512 -3.736260) (xy 3.116100 -3.712866) (xy 3.095688 -3.682254) (xy 3.070745 -3.645117)
|
||||
(xy 3.041738 -3.602149) (xy 3.009135 -3.554043) (xy 2.973404 -3.501492) (xy 2.935012 -3.445189) (xy 2.894428 -3.385828) (xy 2.855795 -3.329456) (xy 2.806358 -3.257369) (xy 2.762946 -3.193972)
|
||||
(xy 2.725170 -3.138668) (xy 2.692641 -3.090858) (xy 2.664968 -3.049945) (xy 2.641762 -3.015330) (xy 2.622634 -2.986415) (xy 2.607194 -2.962601) (xy 2.595053 -2.943291) (xy 2.585821 -2.927886)
|
||||
(xy 2.579108 -2.915788) (xy 2.574526 -2.906398) (xy 2.571684 -2.899119) (xy 2.570193 -2.893353) (xy 2.569768 -2.890183) (xy 2.569637 -2.884427) (xy 2.570384 -2.877474) (xy 2.572311 -2.868554)
|
||||
(xy 2.575723 -2.856897) (xy 2.580925 -2.841732) (xy 2.588220 -2.822288) (xy 2.597913 -2.797797) (xy 2.610307 -2.767486) (xy 2.625708 -2.730586) (xy 2.644419 -2.686327) (xy 2.666744 -2.633938)
|
||||
(xy 2.692988 -2.572649) (xy 2.719890 -2.509983) (xy 2.745748 -2.449902) (xy 2.770489 -2.392621) (xy 2.793723 -2.339026) (xy 2.815065 -2.290001) (xy 2.834125 -2.246433) (xy 2.850515 -2.209205)
|
||||
(xy 2.863849 -2.179205) (xy 2.873737 -2.157316) (xy 2.879793 -2.144424) (xy 2.881367 -2.141460) (xy 2.884053 -2.137207) (xy 2.886616 -2.133425) (xy 2.889737 -2.129960) (xy 2.894099 -2.126657)
|
||||
(xy 2.900384 -2.123362) (xy 2.909274 -2.119920) (xy 2.921451 -2.116178) (xy 2.937597 -2.111980) (xy 2.958394 -2.107173) (xy 2.984524 -2.101602) (xy 3.016669 -2.095113) (xy 3.055511 -2.087551)
|
||||
(xy 3.101732 -2.078762) (xy 3.156015 -2.068591) (xy 3.219041 -2.056885) (xy 3.291492 -2.043489) (xy 3.374050 -2.028249) (xy 3.414889 -2.020709) (xy 3.447998 -2.014580) (xy 3.490632 -2.006665)
|
||||
(xy 3.541223 -1.997256) (xy 3.598199 -1.986644) (xy 3.659992 -1.975124) (xy 3.725032 -1.962987) (xy 3.791748 -1.950526) (xy 3.858570 -1.938033) (xy 3.859199 -1.937915) (xy 3.886337 -1.931913)
|
||||
(xy 3.904891 -1.925321) (xy 3.917557 -1.917117) (xy 3.919877 -1.914939) (xy 3.934178 -1.900638) (xy 3.934178 -1.383375) (xy 3.934189 -1.293710) (xy 3.934194 -1.214651) (xy 3.934154 -1.145518)
|
||||
(xy 3.934028 -1.085628) (xy 3.933776 -1.034299) (xy 3.933358 -0.990850) (xy 3.932733 -0.954598) (xy 3.931863 -0.924863) (xy 3.930705 -0.900961) (xy 3.929221 -0.882211) (xy 3.927370 -0.867932)
|
||||
(xy 3.925112 -0.857441) (xy 3.922406 -0.850056) (xy 3.919213 -0.845096) (xy 3.915492 -0.841879) (xy 3.911204 -0.839723) (xy 3.906307 -0.837946) (xy 3.901947 -0.836348) (xy 3.894072 -0.834380)
|
||||
(xy 3.875947 -0.830540) (xy 3.848428 -0.824989) (xy 3.812367 -0.817893) (xy 3.768620 -0.809416) (xy 3.718040 -0.799721) (xy 3.661483 -0.788974) (xy 3.599801 -0.777337) (xy 3.533849 -0.764975)
|
||||
(xy 3.464482 -0.752053) (xy 3.426178 -0.744950) (xy 3.355210 -0.731792) (xy 3.287108 -0.719131) (xy 3.222736 -0.707128) (xy 3.162959 -0.695946) (xy 3.108641 -0.685748) (xy 3.060647 -0.676698)
|
||||
(xy 3.019842 -0.668957) (xy 2.987090 -0.662689) (xy 2.963256 -0.658057) (xy 2.949205 -0.655223) (xy 2.946033 -0.654510) (xy 2.928532 -0.647090) (xy 2.913842 -0.636382) (xy 2.913373 -0.635893)
|
||||
(xy 2.908520 -0.627699) (xy 2.900052 -0.609992) (xy 2.888376 -0.583805) (xy 2.873905 -0.550170) (xy 2.857048 -0.510117) (xy 2.838214 -0.464678) (xy 2.817814 -0.414885) (xy 2.796258 -0.361769)
|
||||
(xy 2.773957 -0.306362) (xy 2.751319 -0.249695) (xy 2.728756 -0.192799) (xy 2.706677 -0.136707) (xy 2.685492 -0.082450) (xy 2.665612 -0.031058) (xy 2.647446 0.016435) (xy 2.631404 0.059000)
|
||||
(xy 2.617897 0.095603) (xy 2.607335 0.125215) (xy 2.600128 0.146803) (xy 2.596685 0.159336) (xy 2.596445 0.161332) (xy 2.596345 0.165943) (xy 2.596311 0.170056) (xy 2.596740 0.174289)
|
||||
(xy 2.598028 0.179260) (xy 2.600572 0.185586) (xy 2.604769 0.193884) (xy 2.611015 0.204773) (xy 2.619708 0.218868) (xy 2.631243 0.236788) (xy 2.646019 0.259150) (xy 2.664431 0.286571)
|
||||
(xy 2.686877 0.319670) (xy 2.713753 0.359063) (xy 2.745456 0.405368) (xy 2.782383 0.459202) (xy 2.824931 0.521182) (xy 2.868192 0.584200) (xy 2.906622 0.640193) (xy 2.943767 0.694319)
|
||||
(xy 2.979038 0.745723) (xy 3.011851 0.793551) (xy 3.041618 0.836948) (xy 3.067753 0.875058) (xy 3.089670 0.907026) (xy 3.106781 0.931997) (xy 3.118501 0.949116) (xy 3.123189 0.955979)
|
||||
(xy 3.130632 0.966286) (xy 3.137421 0.975165) (xy 3.143143 0.983158) (xy 3.147386 0.990805) (xy 3.149738 0.998647) (xy 3.149787 1.007226) (xy 3.147120 1.017083) (xy 3.141326 1.028759)
|
||||
(xy 3.131992 1.042794) (xy 3.118706 1.059731) (xy 3.101056 1.080109) (xy 3.078630 1.104471) (xy 3.051015 1.133357) (xy 3.017800 1.167309) (xy 2.978572 1.206867) (xy 2.932920 1.252573)
|
||||
(xy 2.880430 1.304967) (xy 2.820691 1.364592) (xy 2.784074 1.401185) (xy 2.721774 1.463474) (xy 2.666940 1.518256) (xy 2.619062 1.566013) (xy 2.577630 1.607227) (xy 2.542133 1.642378)
|
||||
(xy 2.512062 1.671949) (xy 2.486906 1.696421) (xy 2.466155 1.716277) (xy 2.449299 1.731997) (xy 2.435828 1.744064) (xy 2.425231 1.752958) (xy 2.416999 1.759162) (xy 2.410620 1.763158)
|
||||
(xy 2.405586 1.765426) (xy 2.401385 1.766449) (xy 2.397509 1.766708) (xy 2.396902 1.766711) (xy 2.392160 1.766196) (xy 2.386036 1.764380) (xy 2.377903 1.760856) (xy 2.367133 1.755217)
|
||||
(xy 2.353096 1.747056) (xy 2.335164 1.735965) (xy 2.312710 1.721538) (xy 2.285104 1.703368) (xy 2.251718 1.681047) (xy 2.211924 1.654169) (xy 2.165094 1.622327) (xy 2.110598 1.585113)
|
||||
(xy 2.047809 1.542120) (xy 2.007484 1.514473) (xy 1.949063 1.474406) (xy 1.892810 1.435830) (xy 1.839501 1.399275) (xy 1.789906 1.365270) (xy 1.744798 1.334345) (xy 1.704950 1.307029)
|
||||
(xy 1.671134 1.283853) (xy 1.644124 1.265345) (xy 1.624690 1.252036) (xy 1.613607 1.244454) (xy 1.612267 1.243540) (xy 1.600036 1.235445) (xy 1.588970 1.229341) (xy 1.577966 1.225561)
|
||||
(xy 1.565919 1.224440) (xy 1.551725 1.226309) (xy 1.534279 1.231501) (xy 1.512477 1.240352) (xy 1.485215 1.253192) (xy 1.451389 1.270356) (xy 1.409893 1.292177) (xy 1.359624 1.318988)
|
||||
(xy 1.356286 1.320772) (xy 1.314696 1.342871) (xy 1.275990 1.363176) (xy 1.241351 1.381085) (xy 1.211967 1.395995) (xy 1.189022 1.407306) (xy 1.173701 1.414415) (xy 1.167304 1.416728)
|
||||
(xy 1.156684 1.413153) (xy 1.144177 1.404471) (xy 1.143713 1.404056) (xy 1.140231 1.398669) (xy 1.133901 1.386135) (xy 1.124619 1.366206) (xy 1.112280 1.338633) (xy 1.096778 1.303168)
|
||||
(xy 1.078009 1.259564) (xy 1.055867 1.207573) (xy 1.030248 1.146947) (xy 1.001046 1.077438) (xy 0.968158 0.998798) (xy 0.931476 0.910779) (xy 0.890897 0.813133) (xy 0.846316 0.705613)
|
||||
(xy 0.797628 0.587970) (xy 0.779331 0.543714) (xy 0.740781 0.450394) (xy 0.703418 0.359844) (xy 0.667469 0.272622) (xy 0.633162 0.189281) (xy 0.600723 0.110376) (xy 0.570380 0.036463)
|
||||
(xy 0.542359 -0.031903) (xy 0.516889 -0.094167) (xy 0.494195 -0.149775) (xy 0.474506 -0.198171) (xy 0.458047 -0.238799) (xy 0.445047 -0.271106) (xy 0.435732 -0.294536) (xy 0.430330 -0.308534)
|
||||
(xy 0.428978 -0.312565) (xy 0.432146 -0.328436) (xy 0.442451 -0.343884) (xy 0.461092 -0.360231) (xy 0.488975 -0.378619) (xy 0.507565 -0.390017) (xy 0.525138 -0.401248) (xy 0.543327 -0.413459)
|
||||
(xy 0.563763 -0.427798) (xy 0.588078 -0.445413) (xy 0.617903 -0.467450) (xy 0.654869 -0.495057) (xy 0.659863 -0.498799) (xy 0.744951 -0.569595) (xy 0.822433 -0.648628) (xy 0.891809 -0.735360)
|
||||
(xy 0.922700 -0.780519) (xy 0.977694 -0.875335) (xy 1.022301 -0.973630) (xy 1.056603 -1.074658) (xy 1.080680 -1.177670) (xy 1.094614 -1.281921) (xy 1.098486 -1.386662) (xy 1.092378 -1.491147)
|
||||
(xy 1.076369 -1.594628) (xy 1.050542 -1.696357) (xy 1.014978 -1.795589) (xy 0.969757 -1.891574) (xy 0.914960 -1.983567) (xy 0.850670 -2.070820) (xy 0.776966 -2.152585) (xy 0.773350 -2.156203)
|
||||
(xy 0.690844 -2.230539) (xy 0.602182 -2.295486) (xy 0.507761 -2.350846) (xy 0.407979 -2.396422) (xy 0.303233 -2.432014) (xy 0.193921 -2.457426) (xy 0.155222 -2.463795) (xy 0.109393 -2.468823)
|
||||
(xy 0.056164 -2.471835) (xy -0.000756 -2.472829) (xy -0.057657 -2.471804) (xy -0.110833 -2.468758) (xy -0.155222 -2.463890) (xy -0.263310 -2.442679) (xy -0.366631 -2.411675) (xy -0.464796 -2.371467)
|
||||
(xy -0.557415 -2.322646) (xy -0.644099 -2.265800) (xy -0.724459 -2.201520) (xy -0.798105 -2.130395) (xy -0.864649 -2.053015) (xy -0.923699 -1.969969) (xy -0.974868 -1.881847) (xy -1.017766 -1.789239)
|
||||
(xy -1.052002 -1.692734) (xy -1.077189 -1.592922) (xy -1.092937 -1.490393) (xy -1.098855 -1.385735) (xy -1.094556 -1.279539) (xy -1.079649 -1.172394) (xy -1.061303 -1.091883) (xy -1.028792 -0.990840)
|
||||
(xy -0.986353 -0.893090) (xy -0.934740 -0.799762) (xy -0.874711 -0.711984) (xy -0.807020 -0.630885) (xy -0.732423 -0.557596) (xy -0.669247 -0.506067) (xy -0.631142 -0.477634) (xy -0.600468 -0.454908)
|
||||
(xy -0.575655 -0.436780) (xy -0.555136 -0.422139) (xy -0.537340 -0.409876) (xy -0.520700 -0.398881) (xy -0.503647 -0.388045) (xy -0.493380 -0.381663) (xy -0.464737 -0.362699) (xy -0.445335 -0.346560)
|
||||
(xy -0.433923 -0.331904) (xy -0.429253 -0.317388) (xy -0.428978 -0.312480) (xy -0.431100 -0.306386) (xy -0.437317 -0.290417) (xy -0.447400 -0.265130) (xy -0.461123 -0.231078) (xy -0.478259 -0.188818)
|
||||
(xy -0.498580 -0.138905) (xy -0.521859 -0.081893) (xy -0.547869 -0.018338) (xy -0.576384 0.051205) (xy -0.607175 0.126180) (xy -0.640015 0.206034) (xy -0.674678 0.290210) (xy -0.710937 0.378154)
|
||||
(xy -0.748563 0.469310) (xy -0.779342 0.543798) (xy -0.829560 0.665192) (xy -0.875633 0.776371) (xy -0.917664 0.877583) (xy -0.955756 0.969070) (xy -0.990013 1.051080) (xy -1.020540 1.123856)
|
||||
(xy -1.047439 1.187644) (xy -1.070815 1.242689) (xy -1.090772 1.289235) (xy -1.107412 1.327528) (xy -1.120841 1.357812) (xy -1.131162 1.380334) (xy -1.138478 1.395337) (xy -1.142893 1.403067)
|
||||
(xy -1.143723 1.404056) (xy -1.155970 1.412870) (xy -1.166343 1.416747) (xy -1.166679 1.416756) (xy -1.173572 1.414174) (xy -1.189217 1.406829) (xy -1.212436 1.395321) (xy -1.242049 1.380251)
|
||||
(xy -1.276875 1.362217) (xy -1.315735 1.341822) (xy -1.355322 1.320800) (xy -1.403656 1.295077) (xy -1.443160 1.274287) (xy -1.474899 1.257930) (xy -1.499938 1.245506) (xy -1.519342 1.236516)
|
||||
(xy -1.534176 1.230458) (xy -1.545507 1.226835) (xy -1.554398 1.225145) (xy -1.559799 1.224845) (xy -1.563508 1.224661) (xy -1.566583 1.224342) (xy -1.569556 1.224234) (xy -1.572957 1.224683)
|
||||
(xy -1.577317 1.226038) (xy -1.583166 1.228644) (xy -1.591036 1.232850) (xy -1.601456 1.239000) (xy -1.614958 1.247443) (xy -1.632072 1.258526) (xy -1.653329 1.272594) (xy -1.679259 1.289996)
|
||||
(xy -1.710393 1.311078) (xy -1.747262 1.336186) (xy -1.790396 1.365669) (xy -1.840326 1.399872) (xy -1.897583 1.439142) (xy -1.962696 1.483827) (xy -2.036198 1.534273) (xy -2.097649 1.576441)
|
||||
(xy -2.156090 1.616496) (xy -2.205994 1.650584) (xy -2.248100 1.679177) (xy -2.283146 1.702743) (xy -2.311871 1.721752) (xy -2.335013 1.736675) (xy -2.353310 1.747980) (xy -2.367502 1.756137)
|
||||
(xy -2.378325 1.761616) (xy -2.386520 1.764887) (xy -2.392823 1.766420) (xy -2.396756 1.766711) (xy -2.400643 1.766538) (xy -2.404751 1.765696) (xy -2.409589 1.763703) (xy -2.415670 1.760079)
|
||||
(xy -2.423503 1.754342) (xy -2.433599 1.746009) (xy -2.446467 1.734599) (xy -2.462619 1.719631) (xy -2.482565 1.700622) (xy -2.506815 1.677091) (xy -2.535880 1.648557) (xy -2.570270 1.614537)
|
||||
(xy -2.610495 1.574550) (xy -2.657067 1.528114) (xy -2.710494 1.474748) (xy -2.771288 1.413970) (xy -2.784073 1.401185) (xy -2.848033 1.337295) (xy -2.904513 1.280936) (xy -2.953927 1.231568)
|
||||
(xy -2.996686 1.188649) (xy -3.033202 1.151639) (xy -3.063889 1.119995) (xy -3.089157 1.093177) (xy -3.109420 1.070644) (xy -3.125089 1.051855) (xy -3.136578 1.036269) (xy -3.144297 1.023343)
|
||||
(xy -3.148659 1.012539) (xy -3.150076 1.003313) (xy -3.148962 0.995125) (xy -3.145727 0.987435) (xy -3.140783 0.979700) (xy -3.134545 0.971380) (xy -3.127422 0.961933) (xy -3.123222 0.955979)
|
||||
(xy -3.115691 0.944952) (xy -3.102350 0.925460) (xy -3.083776 0.898345) (xy -3.060547 0.864450) (xy -3.033241 0.824617) (xy -3.002434 0.779688) (xy -2.968705 0.730507) (xy -2.932631 0.677914)
|
||||
(xy -2.894790 0.622754) (xy -2.862919 0.576303) (xy -2.815484 0.507183) (xy -2.774018 0.446759) (xy -2.738121 0.394410) (xy -2.707395 0.349511) (xy -2.681438 0.311440) (xy -2.659852 0.279573)
|
||||
(xy -2.642235 0.253288) (xy -2.628189 0.231962) (xy -2.617313 0.214970) (xy -2.609207 0.201690) (xy -2.603471 0.191500) (xy -2.599706 0.183775) (xy -2.597512 0.177892) (xy -2.596488 0.173229)
|
||||
(xy -2.596234 0.169163) (xy -2.596352 0.165069) (xy -2.596444 0.161102) (xy -2.597694 0.153221) (xy -2.601568 0.139403) (xy -2.608257 0.119148) (xy -2.617949 0.091953) (xy -2.630834 0.057318)
|
||||
(xy -2.647099 0.014742) (xy -2.666936 -0.036277) (xy -2.690532 -0.096240) (xy -2.718077 -0.165647) (xy -2.748576 -0.242042) (xy -2.773649 -0.304511) (xy -2.797708 -0.364085) (xy -2.820396 -0.419906)
|
||||
(xy -2.841359 -0.471116) (xy -2.860240 -0.516858) (xy -2.876685 -0.556275) (xy -2.890338 -0.588508) (xy -2.900843 -0.612700) (xy -2.907845 -0.627993) (xy -2.910791 -0.633371) (xy -2.922389 -0.644068)
|
||||
(xy -2.930716 -0.649780) (xy -2.937652 -0.651590) (xy -2.954859 -0.655283) (xy -2.981508 -0.660699) (xy -3.016769 -0.667677) (xy -3.059810 -0.676059) (xy -3.109801 -0.685683) (xy -3.165913 -0.696390)
|
||||
(xy -3.227314 -0.708018) (xy -3.293174 -0.720409) (xy -3.362663 -0.733402) (xy -3.410557 -0.742313) (xy -3.482089 -0.755602) (xy -3.550614 -0.768348) (xy -3.615294 -0.780394) (xy -3.675292 -0.791584)
|
||||
(xy -3.729770 -0.801759) (xy -3.777889 -0.810765) (xy -3.818813 -0.818443) (xy -3.851702 -0.824638) (xy -3.875719 -0.829192) (xy -3.890027 -0.831949) (xy -3.893741 -0.832708) (xy -3.907033 -0.838905)
|
||||
(xy -3.920516 -0.849425) (xy -3.934178 -0.863087) (xy -3.933998 -1.381221) (xy -3.933968 -1.469914) (xy -3.933924 -1.548015) (xy -3.933838 -1.616222) (xy -3.933679 -1.675232) (xy -3.933419 -1.725741)
|
||||
(xy -3.933030 -1.768449) (xy -3.932481 -1.804051) (xy -3.931744 -1.833245) (xy -3.930790 -1.856728) (xy -3.929589 -1.875198) (xy -3.928114 -1.889352) (xy -3.926334 -1.899886) (xy -3.924220 -1.907499)
|
||||
(xy -3.921744 -1.912888) (xy -3.918877 -1.916749) (xy -3.915589 -1.919780) (xy -3.911851 -1.922679) (xy -3.911428 -1.923007) (xy -3.904704 -1.925016) (xy -3.887686 -1.928904) (xy -3.861182 -1.934513)
|
||||
(xy -3.826002 -1.941684) (xy -3.782955 -1.950259) (xy -3.732850 -1.960077) (xy -3.676497 -1.970982) (xy -3.614703 -1.982814) (xy -3.548279 -1.995415) (xy -3.478033 -2.008626) (xy -3.411895 -2.020965)
|
||||
(xy -3.338702 -2.034626) (xy -3.268466 -2.047845) (xy -3.202010 -2.060462) (xy -3.140159 -2.072315) (xy -3.083736 -2.083242) (xy -3.033565 -2.093081) (xy -2.990471 -2.101672) (xy -2.955277 -2.108853)
|
||||
(xy -2.928807 -2.114463) (xy -2.911886 -2.118339) (xy -2.905531 -2.120198) (xy -2.890952 -2.130771) (xy -2.881144 -2.141800) (xy -2.877453 -2.149193) (xy -2.869718 -2.166084) (xy -2.858323 -2.191588)
|
||||
(xy -2.843658 -2.224820) (xy -2.826107 -2.264897) (xy -2.806058 -2.310932) (xy -2.783898 -2.362042) (xy -2.760013 -2.417342) (xy -2.734791 -2.475947) (xy -2.720224 -2.509883) (xy -2.688555 -2.583898)
|
||||
(xy -2.661201 -2.648195) (xy -2.637917 -2.703383) (xy -2.618459 -2.750072) (xy -2.602580 -2.788871) (xy -2.590035 -2.820388) (xy -2.580580 -2.845233) (xy -2.573969 -2.864015) (xy -2.569957 -2.877342)
|
||||
(xy -2.568298 -2.885824) (xy -2.568222 -2.887372) (xy -2.568599 -2.891891) (xy -2.569985 -2.897401) (xy -2.572766 -2.904494) (xy -2.577327 -2.913762) (xy -2.584053 -2.925797) (xy -2.593329 -2.941191)
|
||||
(xy -2.605539 -2.960537) (xy -2.621070 -2.984425) (xy -2.640305 -3.013449) (xy -2.663631 -3.048201) (xy -2.691431 -3.089272) (xy -2.724092 -3.137254) (xy -2.761998 -3.192740) (xy -2.805534 -3.256322)
|
||||
(xy -2.855084 -3.328592) (xy -2.856278 -3.330332) (xy -2.898718 -3.392299) (xy -2.939348 -3.451807) (xy -2.977709 -3.508173) (xy -3.013341 -3.560714) (xy -3.045785 -3.608746) (xy -3.074582 -3.651587)
|
||||
(xy -3.099272 -3.688552) (xy -3.119396 -3.718958) (xy -3.134494 -3.742122) (xy -3.144107 -3.757360) (xy -3.147776 -3.763989) (xy -3.147778 -3.763998) (xy -3.148502 -3.780380) (xy -3.146177 -3.791083)
|
||||
(xy -3.141150 -3.797751) (xy -3.128312 -3.812078) (xy -3.107910 -3.833812) (xy -3.080190 -3.862704) (xy -3.045400 -3.898505) (xy -3.003784 -3.940965) (xy -2.955590 -3.989833) (xy -2.901064 -4.044860)
|
||||
(xy -2.840451 -4.105797) (xy -2.774000 -4.172393) (xy -2.701955 -4.244398) (xy -2.624564 -4.321563) (xy -2.542072 -4.403639) (xy -2.541630 -4.404078) (xy -2.505349 -4.440026) (xy -2.476077 -4.468708)
|
||||
(xy -2.452917 -4.490913) (xy -2.434967 -4.507428) (xy -2.421329 -4.519043) (xy -2.411103 -4.526545) (xy -2.403388 -4.530723) (xy -2.397285 -4.532365) (xy -2.395090 -4.532489) (xy -2.390075 -4.531232)
|
||||
(xy -2.381460 -4.527238) (xy -2.368735 -4.520172) (xy -2.351391 -4.509698) (xy -2.328917 -4.495480) (xy -2.300804 -4.477182) (xy -2.266542 -4.454470) (xy -2.225620 -4.427008) (xy -2.177529 -4.394460)
|
||||
(xy -2.121759 -4.356491) (xy -2.057800 -4.312765) (xy -1.985143 -4.262947) (xy -1.977682 -4.257825) (xy -1.901761 -4.205694) (xy -1.834593 -4.159571) (xy -1.775615 -4.119090) (xy -1.724263 -4.083885)
|
||||
(xy -1.679972 -4.053590) (xy -1.642180 -4.027837) (xy -1.610323 -4.006261) (xy -1.583837 -3.988494) (xy -1.562159 -3.974172) (xy -1.544725 -3.962927) (xy -1.530971 -3.954393) (xy -1.520333 -3.948204)
|
||||
(xy -1.512249 -3.943993) (xy -1.506153 -3.941394) (xy -1.501484 -3.940040) (xy -1.497677 -3.939566) (xy -1.494168 -3.939604) (xy -1.490393 -3.939789) (xy -1.488463 -3.939822) (xy -1.480049 -3.941178)
|
||||
(xy -1.465404 -3.945376) (xy -1.444009 -3.952617) (xy -1.415341 -3.963099) (xy -1.378881 -3.977020) (xy -1.334108 -3.994579) (xy -1.280501 -4.015976) (xy -1.217539 -4.041407) (xy -1.146438 -4.070365)
|
||||
(xy -1.073861 -4.100019) (xy -1.011006 -4.125723) (xy -0.957150 -4.147800) (xy -0.911564 -4.166574) (xy -0.873524 -4.182367) (xy -0.842303 -4.195502) (xy -0.817176 -4.206303) (xy -0.797417 -4.215092)
|
||||
(xy -0.782299 -4.222193) (xy -0.771098 -4.227927) (xy -0.763086 -4.232620) (xy -0.757539 -4.236592) (xy -0.753729 -4.240169) (xy -0.750932 -4.243671) (xy -0.748421 -4.247423) (xy -0.748372 -4.247498)
|
||||
(xy -0.745675 -4.254390) (xy -0.741719 -4.268921) (xy -0.736432 -4.291448) (xy -0.729742 -4.322329) (xy -0.721578 -4.361921) (xy -0.711869 -4.410583) (xy -0.700543 -4.468670) (xy -0.687527 -4.536541)
|
||||
(xy -0.672751 -4.614554) (xy -0.656143 -4.703065) (xy -0.642775 -4.774765) (xy -0.547667 -5.286022) (xy -0.530567 -5.301544) (xy -0.513466 -5.317066) (xy 0.513467 -5.317066) (xy 0.530628 -5.301544) )(layer F.SilkS) (width 0.010000)
|
||||
)
|
||||
)
|
||||
@@ -0,0 +1,225 @@
|
||||
(module open_hardware_logo_only (layer F.Cu) (tedit 0)
|
||||
(fp_text reference G*** (at 0 0) (layer F.SilkS) hide
|
||||
(effects (font (size 1.524 1.524) (thickness 0.3)))
|
||||
)
|
||||
(fp_text value LOGO (at 0.75 0) (layer F.SilkS) hide
|
||||
(effects (font (size 1.524 1.524) (thickness 0.3)))
|
||||
)
|
||||
(fp_poly (pts (xy 0.481926 -3.171191) (xy 0.485025 -3.167684) (xy 0.487915 -3.163228) (xy 0.490784 -3.156998)
|
||||
(xy 0.493818 -3.148167) (xy 0.497202 -3.13591) (xy 0.501124 -3.119399) (xy 0.505768 -3.09781)
|
||||
(xy 0.511323 -3.070316) (xy 0.517972 -3.036091) (xy 0.525904 -2.994309) (xy 0.535303 -2.944144)
|
||||
(xy 0.54576 -2.88798) (xy 0.56332 -2.793486) (xy 0.579117 -2.708469) (xy 0.593255 -2.632419)
|
||||
(xy 0.605837 -2.564826) (xy 0.616968 -2.505181) (xy 0.626754 -2.452975) (xy 0.635297 -2.407696)
|
||||
(xy 0.642703 -2.368836) (xy 0.649075 -2.335885) (xy 0.654519 -2.308332) (xy 0.659139 -2.285669)
|
||||
(xy 0.663039 -2.267386) (xy 0.666323 -2.252972) (xy 0.669096 -2.241919) (xy 0.671463 -2.233715)
|
||||
(xy 0.673527 -2.227852) (xy 0.675393 -2.22382) (xy 0.677166 -2.221109) (xy 0.678949 -2.21921)
|
||||
(xy 0.680848 -2.217611) (xy 0.682967 -2.215805) (xy 0.683534 -2.21527) (xy 0.691474 -2.210239)
|
||||
(xy 0.707905 -2.201939) (xy 0.731855 -2.190767) (xy 0.762348 -2.17712) (xy 0.79841 -2.161396)
|
||||
(xy 0.839068 -2.143993) (xy 0.883347 -2.125308) (xy 0.930273 -2.105738) (xy 0.978871 -2.085682)
|
||||
(xy 1.028168 -2.065536) (xy 1.077189 -2.045698) (xy 1.124961 -2.026567) (xy 1.170508 -2.008538)
|
||||
(xy 1.212857 -1.99201) (xy 1.251033 -1.977381) (xy 1.284062 -1.965047) (xy 1.310971 -1.955407)
|
||||
(xy 1.330785 -1.948858) (xy 1.342529 -1.945797) (xy 1.344339 -1.945619) (xy 1.357758 -1.947028)
|
||||
(xy 1.371652 -1.952035) (xy 1.388871 -1.96185) (xy 1.400219 -1.969346) (xy 1.413317 -1.978275)
|
||||
(xy 1.434048 -1.992447) (xy 1.461672 -2.011351) (xy 1.495445 -2.034479) (xy 1.534625 -2.061322)
|
||||
(xy 1.57847 -2.091371) (xy 1.626237 -2.124119) (xy 1.677186 -2.159054) (xy 1.730573 -2.19567)
|
||||
(xy 1.785656 -2.233457) (xy 1.841693 -2.271906) (xy 1.897943 -2.310508) (xy 1.953661 -2.348755)
|
||||
(xy 1.963768 -2.355693) (xy 2.000332 -2.380752) (xy 2.034628 -2.404171) (xy 2.065671 -2.425286)
|
||||
(xy 2.092477 -2.443429) (xy 2.114061 -2.457935) (xy 2.129438 -2.468138) (xy 2.137624 -2.473372)
|
||||
(xy 2.138293 -2.473754) (xy 2.143109 -2.476256) (xy 2.147743 -2.478077) (xy 2.152654 -2.478809)
|
||||
(xy 2.158303 -2.478049) (xy 2.16515 -2.475389) (xy 2.173654 -2.470425) (xy 2.184276 -2.46275)
|
||||
(xy 2.197476 -2.451958) (xy 2.213713 -2.437645) (xy 2.233448 -2.419404) (xy 2.257139 -2.39683)
|
||||
(xy 2.285249 -2.369517) (xy 2.318236 -2.337059) (xy 2.35656 -2.29905) (xy 2.400681 -2.255086)
|
||||
(xy 2.451059 -2.204759) (xy 2.508155 -2.147665) (xy 2.509412 -2.146408) (xy 2.565347 -2.090457)
|
||||
(xy 2.614527 -2.041225) (xy 2.657385 -1.998251) (xy 2.694357 -1.961076) (xy 2.725876 -1.929238)
|
||||
(xy 2.752376 -1.902279) (xy 2.774293 -1.879738) (xy 2.792061 -1.861154) (xy 2.806114 -1.846069)
|
||||
(xy 2.816885 -1.834021) (xy 2.824811 -1.824552) (xy 2.830325 -1.8172) (xy 2.833861 -1.811506)
|
||||
(xy 2.835854 -1.807009) (xy 2.836738 -1.80325) (xy 2.836948 -1.799768) (xy 2.836949 -1.799496)
|
||||
(xy 2.836484 -1.795447) (xy 2.83486 -1.79012) (xy 2.831732 -1.782986) (xy 2.826755 -1.773517)
|
||||
(xy 2.819586 -1.761186) (xy 2.809878 -1.745464) (xy 2.797289 -1.725823) (xy 2.781472 -1.701736)
|
||||
(xy 2.762083 -1.672674) (xy 2.738779 -1.63811) (xy 2.711213 -1.597514) (xy 2.679042 -1.55036)
|
||||
(xy 2.641921 -1.496118) (xy 2.599506 -1.434262) (xy 2.580771 -1.406966) (xy 2.542682 -1.351373)
|
||||
(xy 2.506156 -1.297852) (xy 2.471617 -1.247038) (xy 2.43949 -1.199565) (xy 2.4102 -1.156068)
|
||||
(xy 2.384171 -1.11718) (xy 2.361828 -1.083536) (xy 2.343596 -1.05577) (xy 2.329899 -1.034517)
|
||||
(xy 2.321162 -1.02041) (xy 2.317875 -1.014305) (xy 2.313808 -0.991943) (xy 2.315764 -0.978745)
|
||||
(xy 2.31852 -0.971421) (xy 2.324959 -0.955581) (xy 2.334736 -0.932038) (xy 2.347509 -0.901603)
|
||||
(xy 2.362933 -0.865091) (xy 2.380665 -0.823312) (xy 2.40036 -0.777081) (xy 2.421677 -0.727208)
|
||||
(xy 2.44427 -0.674507) (xy 2.455787 -0.6477) (xy 2.483397 -0.583515) (xy 2.507346 -0.528012)
|
||||
(xy 2.52798 -0.480541) (xy 2.545645 -0.440448) (xy 2.560687 -0.40708) (xy 2.573454 -0.379785)
|
||||
(xy 2.584292 -0.357911) (xy 2.593547 -0.340804) (xy 2.601566 -0.327813) (xy 2.608695 -0.318284)
|
||||
(xy 2.615281 -0.311566) (xy 2.62167 -0.307005) (xy 2.628208 -0.303948) (xy 2.635243 -0.301744)
|
||||
(xy 2.640131 -0.300488) (xy 2.648482 -0.298722) (xy 2.665901 -0.295292) (xy 2.691461 -0.290374)
|
||||
(xy 2.724237 -0.284143) (xy 2.763304 -0.276773) (xy 2.807735 -0.268438) (xy 2.856606 -0.259313)
|
||||
(xy 2.90899 -0.249573) (xy 2.963963 -0.239393) (xy 2.96672 -0.238883) (xy 3.053008 -0.222946)
|
||||
(xy 3.129864 -0.208761) (xy 3.19784 -0.196211) (xy 3.257491 -0.185184) (xy 3.30937 -0.175563)
|
||||
(xy 3.354032 -0.167234) (xy 3.39203 -0.160083) (xy 3.423918 -0.153993) (xy 3.450249 -0.148851)
|
||||
(xy 3.471579 -0.144541) (xy 3.488461 -0.140949) (xy 3.501448 -0.137959) (xy 3.511094 -0.135458)
|
||||
(xy 3.517954 -0.133329) (xy 3.522581 -0.131458) (xy 3.52553 -0.12973) (xy 3.527353 -0.128031)
|
||||
(xy 3.528605 -0.126245) (xy 3.52984 -0.124258) (xy 3.531612 -0.121954) (xy 3.53187 -0.12167)
|
||||
(xy 3.54584 -0.10652) (xy 3.54584 0.352901) (xy 3.545799 0.439151) (xy 3.545673 0.515617)
|
||||
(xy 3.545459 0.58267) (xy 3.545151 0.640686) (xy 3.544744 0.690039) (xy 3.544235 0.731101)
|
||||
(xy 3.543618 0.764249) (xy 3.542888 0.789854) (xy 3.542043 0.808293) (xy 3.541076 0.819937)
|
||||
(xy 3.540056 0.825016) (xy 3.531385 0.836076) (xy 3.518592 0.844962) (xy 3.518466 0.845021)
|
||||
(xy 3.510371 0.847403) (xy 3.493334 0.85138) (xy 3.468411 0.85674) (xy 3.436657 0.863267)
|
||||
(xy 3.399128 0.870749) (xy 3.35688 0.878973) (xy 3.310969 0.887723) (xy 3.2639 0.89652)
|
||||
(xy 3.166957 0.914467) (xy 3.077755 0.930992) (xy 2.996519 0.946055) (xy 2.923473 0.959611)
|
||||
(xy 2.858842 0.971621) (xy 2.802851 0.982042) (xy 2.755724 0.990833) (xy 2.717687 0.997951)
|
||||
(xy 2.688963 1.003354) (xy 2.669777 1.007001) (xy 2.660354 1.008851) (xy 2.660272 1.008868)
|
||||
(xy 2.653406 1.010411) (xy 2.647181 1.012383) (xy 2.641288 1.015413) (xy 2.63542 1.020127)
|
||||
(xy 2.629272 1.027152) (xy 2.622535 1.037114) (xy 2.614902 1.050641) (xy 2.606066 1.068359)
|
||||
(xy 2.595721 1.090896) (xy 2.583559 1.118877) (xy 2.569273 1.15293) (xy 2.552556 1.193682)
|
||||
(xy 2.533101 1.241759) (xy 2.5106 1.297789) (xy 2.484747 1.362397) (xy 2.474445 1.388165)
|
||||
(xy 2.447852 1.454755) (xy 2.424833 1.512576) (xy 2.405149 1.562274) (xy 2.388561 1.604495)
|
||||
(xy 2.374828 1.639886) (xy 2.363709 1.669095) (xy 2.354967 1.692768) (xy 2.34836 1.711552)
|
||||
(xy 2.343648 1.726093) (xy 2.340592 1.737038) (xy 2.338952 1.745035) (xy 2.338488 1.750729)
|
||||
(xy 2.338779 1.753936) (xy 2.342267 1.761704) (xy 2.351292 1.777222) (xy 2.365896 1.800555)
|
||||
(xy 2.386122 1.831767) (xy 2.412011 1.870921) (xy 2.443606 1.918082) (xy 2.480949 1.973312)
|
||||
(xy 2.524083 2.036676) (xy 2.573049 2.108238) (xy 2.588588 2.130885) (xy 2.625842 2.18527)
|
||||
(xy 2.661453 2.237487) (xy 2.694995 2.286899) (xy 2.726044 2.33287) (xy 2.754174 2.374763)
|
||||
(xy 2.77896 2.41194) (xy 2.799977 2.443764) (xy 2.816799 2.4696) (xy 2.829003 2.488808)
|
||||
(xy 2.836161 2.500753) (xy 2.837953 2.504496) (xy 2.836889 2.522284) (xy 2.830327 2.536218)
|
||||
(xy 2.825463 2.541862) (xy 2.814011 2.553983) (xy 2.796603 2.571949) (xy 2.773875 2.59513)
|
||||
(xy 2.746463 2.622894) (xy 2.715 2.654611) (xy 2.680121 2.689648) (xy 2.642461 2.727376)
|
||||
(xy 2.602656 2.767162) (xy 2.561339 2.808376) (xy 2.519146 2.850386) (xy 2.476712 2.892562)
|
||||
(xy 2.434671 2.934273) (xy 2.393658 2.974886) (xy 2.354308 3.013772) (xy 2.317255 3.050298)
|
||||
(xy 2.283135 3.083835) (xy 2.252583 3.11375) (xy 2.226232 3.139412) (xy 2.204719 3.160191)
|
||||
(xy 2.188677 3.175456) (xy 2.178742 3.184574) (xy 2.175815 3.186933) (xy 2.171669 3.188838)
|
||||
(xy 2.166909 3.18974) (xy 2.160993 3.189303) (xy 2.153379 3.187194) (xy 2.143526 3.183077)
|
||||
(xy 2.130891 3.176619) (xy 2.114932 3.167486) (xy 2.095107 3.155342) (xy 2.070875 3.139854)
|
||||
(xy 2.041694 3.120687) (xy 2.007021 3.097506) (xy 1.966315 3.069978) (xy 1.919034 3.037767)
|
||||
(xy 1.864636 3.00054) (xy 1.802578 2.957962) (xy 1.783434 2.944815) (xy 1.720852 2.901842)
|
||||
(xy 1.666075 2.864269) (xy 1.618543 2.831735) (xy 1.577693 2.803879) (xy 1.542964 2.780337)
|
||||
(xy 1.513794 2.760749) (xy 1.489621 2.744752) (xy 1.469885 2.731985) (xy 1.454022 2.722085)
|
||||
(xy 1.441472 2.714691) (xy 1.431672 2.709441) (xy 1.424061 2.705973) (xy 1.418077 2.703926)
|
||||
(xy 1.413159 2.702936) (xy 1.408745 2.702643) (xy 1.407514 2.702637) (xy 1.400319 2.703155)
|
||||
(xy 1.391916 2.70497) (xy 1.381316 2.708546) (xy 1.367529 2.714345) (xy 1.349568 2.72283)
|
||||
(xy 1.326442 2.734465) (xy 1.297163 2.749711) (xy 1.260741 2.769032) (xy 1.22682 2.787184)
|
||||
(xy 1.181463 2.81139) (xy 1.144096 2.830983) (xy 1.113842 2.846306) (xy 1.089823 2.857705)
|
||||
(xy 1.071161 2.865524) (xy 1.056979 2.870109) (xy 1.0464 2.871804) (xy 1.038545 2.870955)
|
||||
(xy 1.032537 2.867906) (xy 1.029166 2.864866) (xy 1.026167 2.859085) (xy 1.019582 2.844509)
|
||||
(xy 1.009661 2.821742) (xy 0.996654 2.791391) (xy 0.98081 2.754059) (xy 0.962379 2.710354)
|
||||
(xy 0.94161 2.66088) (xy 0.918754 2.606244) (xy 0.89406 2.547051) (xy 0.867778 2.483906)
|
||||
(xy 0.840157 2.417415) (xy 0.811447 2.348184) (xy 0.781898 2.276817) (xy 0.751759 2.203922)
|
||||
(xy 0.721281 2.130103) (xy 0.690712 2.055966) (xy 0.660303 1.982116) (xy 0.630304 1.909159)
|
||||
(xy 0.600963 1.837701) (xy 0.572531 1.768347) (xy 0.545257 1.701703) (xy 0.519391 1.638375)
|
||||
(xy 0.495183 1.578967) (xy 0.472882 1.524086) (xy 0.452739 1.474337) (xy 0.435002 1.430326)
|
||||
(xy 0.419922 1.392657) (xy 0.407748 1.361938) (xy 0.39873 1.338773) (xy 0.393117 1.323769)
|
||||
(xy 0.39116 1.317529) (xy 0.391159 1.31751) (xy 0.39296 1.30432) (xy 0.399261 1.29242)
|
||||
(xy 0.411409 1.280321) (xy 0.430751 1.266537) (xy 0.445807 1.257178) (xy 0.459794 1.248625)
|
||||
(xy 0.473193 1.240083) (xy 0.48728 1.230646) (xy 0.503333 1.219405) (xy 0.522629 1.205455)
|
||||
(xy 0.546445 1.187888) (xy 0.576057 1.165796) (xy 0.60452 1.144452) (xy 0.642981 1.113209)
|
||||
(xy 0.68381 1.075924) (xy 0.724269 1.035341) (xy 0.761621 0.994203) (xy 0.792514 0.956069)
|
||||
(xy 0.849085 0.872629) (xy 0.896282 0.785326) (xy 0.934023 0.694405) (xy 0.962225 0.600116)
|
||||
(xy 0.980807 0.502704) (xy 0.989685 0.402418) (xy 0.9905 0.36221) (xy 0.985734 0.263266)
|
||||
(xy 0.971445 0.166827) (xy 0.948059 0.073416) (xy 0.916003 -0.016445) (xy 0.875704 -0.102232)
|
||||
(xy 0.827589 -0.183423) (xy 0.772083 -0.259493) (xy 0.709614 -0.329921) (xy 0.640607 -0.394182)
|
||||
(xy 0.565491 -0.451754) (xy 0.484691 -0.502114) (xy 0.398633 -0.544738) (xy 0.307745 -0.579103)
|
||||
(xy 0.212453 -0.604687) (xy 0.199872 -0.607319) (xy 0.102079 -0.622169) (xy 0.00525 -0.627243)
|
||||
(xy -0.09009 -0.622915) (xy -0.183419 -0.609559) (xy -0.274214 -0.587549) (xy -0.361951 -0.55726)
|
||||
(xy -0.446107 -0.519066) (xy -0.526159 -0.47334) (xy -0.601583 -0.420457) (xy -0.671857 -0.360791)
|
||||
(xy -0.736456 -0.294717) (xy -0.794859 -0.222608) (xy -0.84654 -0.144839) (xy -0.890978 -0.061783)
|
||||
(xy -0.927649 0.026184) (xy -0.956029 0.11869) (xy -0.975595 0.215359) (xy -0.978414 0.235229)
|
||||
(xy -0.981765 0.269921) (xy -0.983764 0.310933) (xy -0.984452 0.355637) (xy -0.983872 0.401409)
|
||||
(xy -0.982066 0.445621) (xy -0.979077 0.485648) (xy -0.974947 0.518864) (xy -0.973728 0.525869)
|
||||
(xy -0.95038 0.626129) (xy -0.918943 0.720515) (xy -0.879161 0.809627) (xy -0.830777 0.89406)
|
||||
(xy -0.792038 0.950183) (xy -0.765949 0.982858) (xy -0.734116 1.018735) (xy -0.698885 1.055446)
|
||||
(xy -0.662605 1.09062) (xy -0.627623 1.121891) (xy -0.59944 1.144549) (xy -0.563589 1.171328)
|
||||
(xy -0.53445 1.192898) (xy -0.510665 1.210225) (xy -0.490874 1.224271) (xy -0.47372 1.235999)
|
||||
(xy -0.457842 1.246373) (xy -0.441883 1.256355) (xy -0.440548 1.257174) (xy -0.416699 1.27261)
|
||||
(xy -0.400716 1.285328) (xy -0.391235 1.296858) (xy -0.38689 1.308729) (xy -0.386175 1.31812)
|
||||
(xy -0.388094 1.324158) (xy -0.393667 1.338971) (xy -0.402644 1.361951) (xy -0.414776 1.392493)
|
||||
(xy -0.429812 1.429991) (xy -0.447502 1.473838) (xy -0.467598 1.523428) (xy -0.489849 1.578156)
|
||||
(xy -0.514005 1.637415) (xy -0.539817 1.700598) (xy -0.567035 1.7671) (xy -0.595408 1.836315)
|
||||
(xy -0.624688 1.907637) (xy -0.654625 1.980459) (xy -0.684968 2.054175) (xy -0.715467 2.128179)
|
||||
(xy -0.745874 2.201866) (xy -0.775939 2.274628) (xy -0.80541 2.345859) (xy -0.83404 2.414955)
|
||||
(xy -0.861577 2.481308) (xy -0.887773 2.544312) (xy -0.912377 2.603361) (xy -0.935139 2.657849)
|
||||
(xy -0.955811 2.707171) (xy -0.974141 2.750719) (xy -0.98988 2.787887) (xy -1.002779 2.81807)
|
||||
(xy -1.012588 2.840662) (xy -1.019056 2.855055) (xy -1.02175 2.860406) (xy -1.026441 2.866282)
|
||||
(xy -1.03209 2.870137) (xy -1.039568 2.871654) (xy -1.049743 2.870512) (xy -1.063487 2.866391)
|
||||
(xy -1.081668 2.858973) (xy -1.105156 2.847938) (xy -1.134822 2.832966) (xy -1.171534 2.813739)
|
||||
(xy -1.216164 2.789936) (xy -1.221665 2.786986) (xy -1.266905 2.762717) (xy -1.304217 2.742917)
|
||||
(xy -1.334673 2.727349) (xy -1.359349 2.715775) (xy -1.379316 2.707956) (xy -1.395651 2.703653)
|
||||
(xy -1.409426 2.702628) (xy -1.421715 2.704643) (xy -1.433592 2.709459) (xy -1.446132 2.716838)
|
||||
(xy -1.460408 2.726541) (xy -1.46852 2.732181) (xy -1.565067 2.798961) (xy -1.653514 2.859989)
|
||||
(xy -1.734048 2.915391) (xy -1.806857 2.965292) (xy -1.872129 3.009819) (xy -1.930051 3.049096)
|
||||
(xy -1.98081 3.083249) (xy -2.024593 3.112405) (xy -2.06159 3.136688) (xy -2.091985 3.156224)
|
||||
(xy -2.115968 3.171139) (xy -2.133726 3.181559) (xy -2.145446 3.187608) (xy -2.150743 3.189403)
|
||||
(xy -2.170426 3.191427) (xy -2.503276 2.858577) (xy -2.559649 2.802199) (xy -2.609263 2.752551)
|
||||
(xy -2.652547 2.709179) (xy -2.689928 2.671628) (xy -2.721832 2.639446) (xy -2.748688 2.612178)
|
||||
(xy -2.770921 2.58937) (xy -2.788961 2.57057) (xy -2.803233 2.555321) (xy -2.814165 2.543172)
|
||||
(xy -2.822184 2.533668) (xy -2.827718 2.526356) (xy -2.831193 2.520781) (xy -2.833037 2.51649)
|
||||
(xy -2.833677 2.513028) (xy -2.833541 2.509943) (xy -2.833259 2.508053) (xy -2.830365 2.501145)
|
||||
(xy -2.822808 2.487763) (xy -2.810452 2.467701) (xy -2.79316 2.440755) (xy -2.770796 2.406718)
|
||||
(xy -2.743226 2.365387) (xy -2.710312 2.316555) (xy -2.67192 2.260018) (xy -2.627913 2.195569)
|
||||
(xy -2.585171 2.133221) (xy -2.542816 2.071392) (xy -2.503488 2.013706) (xy -2.467497 1.960627)
|
||||
(xy -2.43515 1.912617) (xy -2.406756 1.870141) (xy -2.382623 1.833661) (xy -2.363058 1.803641)
|
||||
(xy -2.348371 1.780543) (xy -2.338868 1.764831) (xy -2.334859 1.756969) (xy -2.334815 1.756818)
|
||||
(xy -2.333986 1.752837) (xy -2.333735 1.748221) (xy -2.334307 1.742302) (xy -2.335945 1.734411)
|
||||
(xy -2.338892 1.723881) (xy -2.343394 1.710043) (xy -2.349693 1.692229) (xy -2.358034 1.669772)
|
||||
(xy -2.36866 1.642002) (xy -2.381815 1.608251) (xy -2.397743 1.567852) (xy -2.416687 1.520136)
|
||||
(xy -2.438893 1.464436) (xy -2.464602 1.400082) (xy -2.469042 1.388975) (xy -2.496217 1.321025)
|
||||
(xy -2.519926 1.261883) (xy -2.540478 1.210922) (xy -2.558178 1.167514) (xy -2.573334 1.131034)
|
||||
(xy -2.586253 1.100855) (xy -2.59724 1.07635) (xy -2.606604 1.056892) (xy -2.614651 1.041855)
|
||||
(xy -2.621688 1.030612) (xy -2.628021 1.022537) (xy -2.633958 1.017002) (xy -2.639805 1.013382)
|
||||
(xy -2.645869 1.011049) (xy -2.652456 1.009377) (xy -2.655193 1.008778) (xy -2.662292 1.007389)
|
||||
(xy -2.678617 1.004287) (xy -2.703405 0.999616) (xy -2.735891 0.993517) (xy -2.775313 0.986133)
|
||||
(xy -2.820908 0.977607) (xy -2.871912 0.968083) (xy -2.927561 0.957702) (xy -2.987093 0.946607)
|
||||
(xy -3.049744 0.934942) (xy -3.088966 0.927644) (xy -3.153048 0.915669) (xy -3.214399 0.904097)
|
||||
(xy -3.272263 0.893078) (xy -3.325885 0.882759) (xy -3.374511 0.87329) (xy -3.417384 0.86482)
|
||||
(xy -3.453749 0.857497) (xy -3.482852 0.85147) (xy -3.503936 0.846887) (xy -3.516247 0.843898)
|
||||
(xy -3.519135 0.842916) (xy -3.529829 0.832859) (xy -3.535319 0.824264) (xy -3.536383 0.81757)
|
||||
(xy -3.537326 0.802308) (xy -3.53815 0.7783) (xy -3.538857 0.74537) (xy -3.539449 0.70334)
|
||||
(xy -3.539929 0.652032) (xy -3.540298 0.591269) (xy -3.540558 0.520875) (xy -3.540711 0.440671)
|
||||
(xy -3.54076 0.352901) (xy -3.54076 -0.10652) (xy -3.52679 -0.121693) (xy -3.524253 -0.124342)
|
||||
(xy -3.521364 -0.126788) (xy -3.517491 -0.129168) (xy -3.512 -0.131615) (xy -3.504261 -0.134264)
|
||||
(xy -3.493639 -0.137251) (xy -3.479502 -0.14071) (xy -3.461217 -0.144775) (xy -3.438152 -0.149581)
|
||||
(xy -3.409674 -0.155264) (xy -3.375151 -0.161958) (xy -3.333949 -0.169797) (xy -3.285435 -0.178917)
|
||||
(xy -3.228978 -0.189451) (xy -3.163945 -0.201536) (xy -3.089702 -0.215306) (xy -3.070924 -0.218787)
|
||||
(xy -3.005074 -0.231042) (xy -2.941907 -0.242888) (xy -2.882162 -0.254183) (xy -2.826579 -0.264783)
|
||||
(xy -2.775897 -0.274543) (xy -2.730854 -0.283319) (xy -2.69219 -0.290968) (xy -2.660643 -0.297345)
|
||||
(xy -2.636954 -0.302308) (xy -2.62186 -0.305711) (xy -2.616252 -0.307314) (xy -2.603211 -0.315913)
|
||||
(xy -2.594911 -0.323385) (xy -2.591676 -0.32935) (xy -2.584861 -0.34373) (xy -2.574868 -0.365593)
|
||||
(xy -2.562103 -0.394008) (xy -2.54697 -0.428043) (xy -2.529872 -0.466768) (xy -2.511213 -0.509249)
|
||||
(xy -2.491397 -0.554557) (xy -2.470829 -0.60176) (xy -2.449912 -0.649926) (xy -2.429051 -0.698123)
|
||||
(xy -2.408649 -0.745421) (xy -2.38911 -0.790888) (xy -2.370838 -0.833593) (xy -2.354238 -0.872603)
|
||||
(xy -2.339714 -0.906989) (xy -2.327668 -0.935817) (xy -2.318506 -0.958158) (xy -2.312631 -0.973079)
|
||||
(xy -2.310652 -0.978745) (xy -2.309199 -0.999572) (xy -2.31283 -1.014428) (xy -2.316666 -1.021466)
|
||||
(xy -2.325851 -1.03623) (xy -2.33996 -1.058084) (xy -2.358567 -1.086396) (xy -2.381248 -1.12053)
|
||||
(xy -2.407579 -1.159851) (xy -2.437133 -1.203725) (xy -2.469488 -1.251518) (xy -2.504217 -1.302595)
|
||||
(xy -2.540896 -1.356322) (xy -2.575726 -1.407148) (xy -2.620389 -1.472245) (xy -2.659618 -1.529513)
|
||||
(xy -2.693756 -1.579479) (xy -2.723148 -1.622673) (xy -2.748139 -1.65962) (xy -2.769072 -1.690849)
|
||||
(xy -2.786293 -1.716888) (xy -2.800145 -1.738264) (xy -2.810973 -1.755505) (xy -2.819122 -1.769137)
|
||||
(xy -2.824935 -1.77969) (xy -2.828757 -1.78769) (xy -2.830933 -1.793665) (xy -2.831807 -1.798143)
|
||||
(xy -2.83187 -1.799556) (xy -2.83169 -1.80303) (xy -2.83086 -1.806755) (xy -2.828947 -1.811192)
|
||||
(xy -2.825515 -1.816801) (xy -2.820131 -1.824042) (xy -2.812361 -1.833374) (xy -2.801768 -1.845257)
|
||||
(xy -2.787921 -1.860152) (xy -2.770383 -1.878519) (xy -2.748721 -1.900817) (xy -2.722501 -1.927506)
|
||||
(xy -2.691288 -1.959047) (xy -2.654647 -1.995899) (xy -2.612145 -2.038522) (xy -2.563347 -2.087377)
|
||||
(xy -2.507818 -2.142923) (xy -2.504333 -2.146408) (xy -2.446992 -2.20376) (xy -2.396387 -2.254344)
|
||||
(xy -2.352055 -2.298558) (xy -2.313531 -2.3368) (xy -2.280352 -2.36947) (xy -2.252053 -2.396966)
|
||||
(xy -2.22817 -2.419687) (xy -2.208239 -2.438031) (xy -2.191795 -2.452397) (xy -2.178376 -2.463185)
|
||||
(xy -2.167516 -2.470792) (xy -2.158752 -2.475618) (xy -2.151619 -2.478062) (xy -2.145654 -2.478521)
|
||||
(xy -2.140391 -2.477395) (xy -2.135368 -2.475082) (xy -2.13012 -2.471982) (xy -2.127332 -2.4703)
|
||||
(xy -2.120748 -2.466012) (xy -2.106418 -2.456398) (xy -2.084968 -2.441888) (xy -2.057026 -2.422909)
|
||||
(xy -2.023221 -2.39989) (xy -1.98418 -2.373258) (xy -1.940529 -2.343442) (xy -1.892898 -2.31087)
|
||||
(xy -1.841913 -2.27597) (xy -1.788202 -2.23917) (xy -1.735531 -2.20305) (xy -1.670673 -2.158571)
|
||||
(xy -1.613644 -2.119508) (xy -1.563903 -2.085512) (xy -1.520915 -2.056233) (xy -1.48414 -2.031322)
|
||||
(xy -1.45304 -2.010431) (xy -1.427078 -1.993209) (xy -1.405714 -1.979309) (xy -1.388412 -1.968379)
|
||||
(xy -1.374632 -1.960073) (xy -1.363837 -1.954039) (xy -1.355488 -1.949929) (xy -1.349048 -1.947395)
|
||||
(xy -1.343979 -1.946085) (xy -1.339741 -1.945653) (xy -1.338837 -1.945641) (xy -1.332037 -1.946563)
|
||||
(xy -1.321002 -1.949473) (xy -1.305168 -1.954587) (xy -1.283972 -1.962119) (xy -1.256852 -1.972286)
|
||||
(xy -1.223244 -1.985301) (xy -1.182585 -2.001382) (xy -1.134312 -2.020742) (xy -1.077863 -2.043597)
|
||||
(xy -1.012673 -2.070163) (xy -1.005387 -2.07314) (xy -0.94072 -2.099612) (xy -0.884833 -2.122611)
|
||||
(xy -0.837074 -2.142445) (xy -0.796791 -2.15942) (xy -0.763334 -2.173845) (xy -0.736051 -2.186027)
|
||||
(xy -0.714292 -2.196274) (xy -0.697404 -2.204893) (xy -0.684738 -2.212191) (xy -0.675641 -2.218478)
|
||||
(xy -0.669463 -2.224059) (xy -0.665552 -2.229244) (xy -0.663257 -2.234338) (xy -0.663101 -2.234825)
|
||||
(xy -0.661824 -2.240896) (xy -0.658829 -2.256236) (xy -0.654252 -2.280128) (xy -0.648228 -2.31185)
|
||||
(xy -0.640893 -2.350684) (xy -0.632381 -2.395909) (xy -0.622829 -2.446808) (xy -0.612373 -2.502659)
|
||||
(xy -0.601146 -2.562743) (xy -0.589285 -2.626341) (xy -0.576925 -2.692734) (xy -0.576514 -2.69494)
|
||||
(xy -0.564136 -2.761433) (xy -0.552249 -2.825169) (xy -0.540989 -2.885428) (xy -0.530491 -2.941488)
|
||||
(xy -0.520892 -2.992628) (xy -0.512327 -3.038127) (xy -0.504932 -3.077265) (xy -0.498842 -3.10932)
|
||||
(xy -0.494194 -3.13357) (xy -0.491123 -3.149295) (xy -0.489765 -3.155773) (xy -0.489752 -3.155818)
|
||||
(xy -0.484013 -3.165036) (xy -0.473995 -3.174868) (xy -0.471599 -3.176622) (xy -0.46873 -3.178165)
|
||||
(xy -0.464757 -3.17951) (xy -0.459051 -3.18067) (xy -0.450979 -3.18166) (xy -0.439912 -3.182492)
|
||||
(xy -0.425217 -3.183181) (xy -0.406265 -3.18374) (xy -0.382425 -3.184182) (xy -0.353064 -3.184522)
|
||||
(xy -0.317553 -3.184772) (xy -0.275261 -3.184946) (xy -0.225557 -3.185059) (xy -0.16781 -3.185123)
|
||||
(xy -0.101389 -3.185152) (xy -0.025663 -3.18516) (xy 0.468141 -3.18516) (xy 0.481926 -3.171191)) (layer F.SilkS) (width 0.01))
|
||||
)
|
||||
@@ -0,0 +1 @@
|
||||
# kicad-library
|
||||
@@ -0,0 +1,3 @@
|
||||
(sym_lib_table
|
||||
(lib (name Necroware)(type Legacy)(uri ${KIPRJMOD}/lib/Necroware.lib)(options "")(descr ""))
|
||||
)
|
||||
Reference in New Issue
Block a user