diff --git a/kawaii/kawaii-rs/doc/.lock b/kawaii/kawaii-rs/doc/.lock
new file mode 100755
index 0000000..e69de29
diff --git a/kawaii/kawaii-rs/doc/COPYRIGHT.txt b/kawaii/kawaii-rs/doc/COPYRIGHT.txt
new file mode 100644
index 0000000..c69861a
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/COPYRIGHT.txt
@@ -0,0 +1,59 @@
+These documentation pages include resources by third parties. This copyright
+file applies only to those resources. The following third party resources are
+included, and carry their own copyright notices and license terms:
+
+* Fira Sans (FiraSans-Regular.woff, FiraSans-Medium.woff):
+
+ Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
+ with Reserved Font Name Fira Sans.
+
+ Copyright (c) 2014, Telefonica S.A.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See FiraSans-LICENSE.txt.
+
+* Heuristica (Heuristica-Italic.woff):
+
+ Copyright 1989, 1991 Adobe Systems Incorporated. All rights reserved.
+ Utopia is either a registered trademark or trademark of Adobe Systems
+ Incorporated in the United States and/or other countries. Used under
+ license.
+
+ Copyright 2006 Han The Thanh, Vntopia font family, http://vntex.sf.net
+
+ Copyright (c) 2008-2012, Andrey V. Panov (panov@canopus.iacp.dvo.ru),
+ with Reserved Font Name Heuristica.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See Heuristica-LICENSE.txt.
+
+* rustdoc.css, main.js, and playpen.js:
+
+ Copyright 2015 The Rust Developers.
+ Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or
+ the MIT license (LICENSE-MIT.txt) at your option.
+
+* normalize.css:
+
+ Copyright (c) Nicolas Gallagher and Jonathan Neal.
+ Licensed under the MIT license (see LICENSE-MIT.txt).
+
+* Source Code Pro (SourceCodePro-Regular.woff, SourceCodePro-Semibold.woff):
+
+ Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/),
+ with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark
+ of Adobe Systems Incorporated in the United States and/or other countries.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See SourceCodePro-LICENSE.txt.
+
+* Source Serif Pro (SourceSerifPro-Regular.woff, SourceSerifPro-Bold.woff):
+
+ Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with
+ Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of
+ Adobe Systems Incorporated in the United States and/or other countries.
+
+ Licensed under the SIL Open Font License, Version 1.1.
+ See SourceSerifPro-LICENSE.txt.
+
+This copyright file is intended to be distributed with rustdoc output.
diff --git a/kawaii/kawaii-rs/doc/FiraSans-LICENSE.txt b/kawaii/kawaii-rs/doc/FiraSans-LICENSE.txt
new file mode 100644
index 0000000..b4a3967
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/FiraSans-LICENSE.txt
@@ -0,0 +1,99 @@
+Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
+with Reserved Font Name Fira Sans.
+
+Copyright (c) 2014, Mozilla Foundation https://mozilla.org/
+with Reserved Font Name Fira Mono.
+
+Copyright (c) 2014, Telefonica S.A.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/kawaii/kawaii-rs/doc/FiraSans-Medium.woff b/kawaii/kawaii-rs/doc/FiraSans-Medium.woff
new file mode 100644
index 0000000..5627227
Binary files /dev/null and b/kawaii/kawaii-rs/doc/FiraSans-Medium.woff differ
diff --git a/kawaii/kawaii-rs/doc/FiraSans-Regular.woff b/kawaii/kawaii-rs/doc/FiraSans-Regular.woff
new file mode 100644
index 0000000..9ff4044
Binary files /dev/null and b/kawaii/kawaii-rs/doc/FiraSans-Regular.woff differ
diff --git a/kawaii/kawaii-rs/doc/Heuristica-Italic.woff b/kawaii/kawaii-rs/doc/Heuristica-Italic.woff
new file mode 100644
index 0000000..b0cebf0
Binary files /dev/null and b/kawaii/kawaii-rs/doc/Heuristica-Italic.woff differ
diff --git a/kawaii/kawaii-rs/doc/Heuristica-LICENSE.txt b/kawaii/kawaii-rs/doc/Heuristica-LICENSE.txt
new file mode 100644
index 0000000..dd85e40
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/Heuristica-LICENSE.txt
@@ -0,0 +1,101 @@
+Copyright 1989, 1991 Adobe Systems Incorporated. All rights reserved.
+Utopia is either a registered trademark or trademark of Adobe Systems
+Incorporated in the United States and/or other countries. Used under
+license.
+
+Copyright 2006 Han The Thanh, Vntopia font family, http://vntex.sf.net
+
+Copyright (c) 2008-2012, Andrey V. Panov (panov@canopus.iacp.dvo.ru),
+with Reserved Font Name Heuristica.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/kawaii/kawaii-rs/doc/LICENSE-APACHE.txt b/kawaii/kawaii-rs/doc/LICENSE-APACHE.txt
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/LICENSE-APACHE.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/kawaii/kawaii-rs/doc/LICENSE-MIT.txt b/kawaii/kawaii-rs/doc/LICENSE-MIT.txt
new file mode 100644
index 0000000..31aa793
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/LICENSE-MIT.txt
@@ -0,0 +1,23 @@
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/kawaii/kawaii-rs/doc/SourceCodePro-LICENSE.txt b/kawaii/kawaii-rs/doc/SourceCodePro-LICENSE.txt
new file mode 100644
index 0000000..0754257
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/SourceCodePro-LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/kawaii/kawaii-rs/doc/SourceCodePro-Regular.woff b/kawaii/kawaii-rs/doc/SourceCodePro-Regular.woff
new file mode 100644
index 0000000..5576670
Binary files /dev/null and b/kawaii/kawaii-rs/doc/SourceCodePro-Regular.woff differ
diff --git a/kawaii/kawaii-rs/doc/SourceCodePro-Semibold.woff b/kawaii/kawaii-rs/doc/SourceCodePro-Semibold.woff
new file mode 100644
index 0000000..ca972a1
Binary files /dev/null and b/kawaii/kawaii-rs/doc/SourceCodePro-Semibold.woff differ
diff --git a/kawaii/kawaii-rs/doc/SourceSerifPro-Bold.woff b/kawaii/kawaii-rs/doc/SourceSerifPro-Bold.woff
new file mode 100644
index 0000000..ac1b1b3
Binary files /dev/null and b/kawaii/kawaii-rs/doc/SourceSerifPro-Bold.woff differ
diff --git a/kawaii/kawaii-rs/doc/SourceSerifPro-LICENSE.txt b/kawaii/kawaii-rs/doc/SourceSerifPro-LICENSE.txt
new file mode 100644
index 0000000..b77d653
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/SourceSerifPro-LICENSE.txt
@@ -0,0 +1,93 @@
+Copyright 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/kawaii/kawaii-rs/doc/SourceSerifPro-Regular.woff b/kawaii/kawaii-rs/doc/SourceSerifPro-Regular.woff
new file mode 100644
index 0000000..e8c43b8
Binary files /dev/null and b/kawaii/kawaii-rs/doc/SourceSerifPro-Regular.woff differ
diff --git a/kawaii/kawaii-rs/doc/emergency_stop/EmergencyStop.t.html b/kawaii/kawaii-rs/doc/emergency_stop/EmergencyStop.t.html
new file mode 100644
index 0000000..6b91c77
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/emergency_stop/EmergencyStop.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.EmergencyStop.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/emergency_stop/index.html b/kawaii/kawaii-rs/doc/emergency_stop/index.html
new file mode 100644
index 0000000..79511d6
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/emergency_stop/index.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+ emergency_stop - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/emergency_stop/sidebar-items.js b/kawaii/kawaii-rs/doc/emergency_stop/sidebar-items.js
new file mode 100644
index 0000000..3925150
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/emergency_stop/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"struct":[["EmergencyStop",""]]});
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/emergency_stop/struct.EmergencyStop.html b/kawaii/kawaii-rs/doc/emergency_stop/struct.EmergencyStop.html
new file mode 100644
index 0000000..f22e8a2
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/emergency_stop/struct.EmergencyStop.html
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+ emergency_stop::EmergencyStop - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct EmergencyStop {
+ pub state: Arc <AtomicBool >,
+ // some fields omitted
+} Fields
+
+ state: Arc <AtomicBool >
+ Methods
+fn new (stop_port: u8 ) -> Result <Self>
+
Constructs a new EmergencyStop and starts poll thread.
+
+
+
+stop_port GPIO Port number of emergency stop pin.
+
+
Trait Implementations
+
+
Formats the value using the given formatter.
+
+fn drop (&mut self)
+
Set emergency stop and join poll thread.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/implementors/core/clone/trait.Clone.js b/kawaii/kawaii-rs/doc/implementors/core/clone/trait.Clone.js
new file mode 100644
index 0000000..f89c34f
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/implementors/core/clone/trait.Clone.js
@@ -0,0 +1,10 @@
+(function() {var implementors = {};
+implementors["kawaii"] = ["impl Clone for Direction ","impl Clone for Edge ","impl Clone for Value ",];
+
+ if (window.register_implementors) {
+ window.register_implementors(implementors);
+ } else {
+ window.pending_implementors = implementors;
+ }
+
+})()
diff --git a/kawaii/kawaii-rs/doc/implementors/core/fmt/trait.Debug.js b/kawaii/kawaii-rs/doc/implementors/core/fmt/trait.Debug.js
new file mode 100644
index 0000000..9803ce5
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/implementors/core/fmt/trait.Debug.js
@@ -0,0 +1,12 @@
+(function() {var implementors = {};
+implementors["emergency_stop"] = ["impl Debug for EmergencyStop ",];
+implementors["kawaii"] = ["impl Debug for Direction ","impl Debug for Edge ","impl Debug for Value ","impl Debug for Port ","impl Debug for SyncPort ","impl Debug for AsyncPort ","impl Debug for Measure ",];
+implementors["ultrasonic_irq"] = ["impl Debug for UltrasonicEcho ","impl Debug for UltrasonicTrigger ","impl Debug for Ultrasonic ",];
+
+ if (window.register_implementors) {
+ window.register_implementors(implementors);
+ } else {
+ window.pending_implementors = implementors;
+ }
+
+})()
diff --git a/kawaii/kawaii-rs/doc/implementors/core/marker/trait.Copy.js b/kawaii/kawaii-rs/doc/implementors/core/marker/trait.Copy.js
new file mode 100644
index 0000000..159710b
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/implementors/core/marker/trait.Copy.js
@@ -0,0 +1,10 @@
+(function() {var implementors = {};
+implementors["kawaii"] = ["impl Copy for Direction ","impl Copy for Edge ","impl Copy for Value ",];
+
+ if (window.register_implementors) {
+ window.register_implementors(implementors);
+ } else {
+ window.pending_implementors = implementors;
+ }
+
+})()
diff --git a/kawaii/kawaii-rs/doc/implementors/core/ops/drop/trait.Drop.js b/kawaii/kawaii-rs/doc/implementors/core/ops/drop/trait.Drop.js
new file mode 100644
index 0000000..876a677
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/implementors/core/ops/drop/trait.Drop.js
@@ -0,0 +1,12 @@
+(function() {var implementors = {};
+implementors["emergency_stop"] = ["impl Drop for EmergencyStop ",];
+implementors["kawaii"] = ["impl Drop for Measure ",];
+implementors["ultrasonic_irq"] = ["impl Drop for Ultrasonic ",];
+
+ if (window.register_implementors) {
+ window.register_implementors(implementors);
+ } else {
+ window.pending_implementors = implementors;
+ }
+
+})()
diff --git a/kawaii/kawaii-rs/doc/kawaii/Measure.t.html b/kawaii/kawaii-rs/doc/kawaii/Measure.t.html
new file mode 100644
index 0000000..77498b8
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/Measure.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.Measure.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/AsyncPort.t.html b/kawaii/kawaii-rs/doc/kawaii/gpio/AsyncPort.t.html
new file mode 100644
index 0000000..bb6465f
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/AsyncPort.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.AsyncPort.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/Direction.t.html b/kawaii/kawaii-rs/doc/kawaii/gpio/Direction.t.html
new file mode 100644
index 0000000..03027a1
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/Direction.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to enum.Direction.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/Edge.t.html b/kawaii/kawaii-rs/doc/kawaii/gpio/Edge.t.html
new file mode 100644
index 0000000..1ae673a
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/Edge.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to enum.Edge.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/Port.t.html b/kawaii/kawaii-rs/doc/kawaii/gpio/Port.t.html
new file mode 100644
index 0000000..665d505
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/Port.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.Port.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/SyncPort.t.html b/kawaii/kawaii-rs/doc/kawaii/gpio/SyncPort.t.html
new file mode 100644
index 0000000..216d445
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/SyncPort.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.SyncPort.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/Value.t.html b/kawaii/kawaii-rs/doc/kawaii/gpio/Value.t.html
new file mode 100644
index 0000000..9d92215
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/Value.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to enum.Value.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Direction.html b/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Direction.html
new file mode 100644
index 0000000..e1b6a2c
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Direction.html
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio::Direction - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub enum Direction {
+ Out,
+ In,
+} Variants
+OutInMethods
+Trait Implementations
+
+
fn clone_from (&mut self, source: &Self)1.0.0
+
Performs copy-assignment from source. Read more
+
+
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Edge.html b/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Edge.html
new file mode 100644
index 0000000..310e4bd
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Edge.html
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio::Edge - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub enum Edge {
+ None,
+ Rising,
+ Falling,
+ Both,
+} Variants
+NoneRisingFallingBothMethods
+Trait Implementations
+
+
fn clone_from (&mut self, source: &Self)1.0.0
+
Performs copy-assignment from source. Read more
+
+
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Value.html b/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Value.html
new file mode 100644
index 0000000..cfe98d4
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/enum.Value.html
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio::Value - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub enum Value {
+ High,
+ Low,
+} Variants
+HighLowMethods
+Trait Implementations
+
+
fn clone_from (&mut self, source: &Self)1.0.0
+
Performs copy-assignment from source. Read more
+
+
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/index.html b/kawaii/kawaii-rs/doc/kawaii/gpio/index.html
new file mode 100644
index 0000000..bf1824c
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/index.html
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/sidebar-items.js b/kawaii/kawaii-rs/doc/kawaii/gpio/sidebar-items.js
new file mode 100644
index 0000000..4e76bcc
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"enum":[["Direction",""],["Edge",""],["Value",""]],"struct":[["AsyncPort",""],["Port",""],["SyncPort",""]]});
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/struct.AsyncPort.html b/kawaii/kawaii-rs/doc/kawaii/gpio/struct.AsyncPort.html
new file mode 100644
index 0000000..42b9423
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/struct.AsyncPort.html
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio::AsyncPort - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct AsyncPort {
+ pub port: Port ,
+ pub edge: Edge ,
+ // some fields omitted
+} Fields
+
+ port: Port
+
+
+ edge: Edge
+ Methods
+
+
Constructs a new asynchronous GPIO Port.
+
+
+
+number GPIO Port number of pin.
+edge GPIO Port edge detection setting.
+
+
+
Read asynchronous from GPIO AsyncPort sysfs file
+
+
Read asynchronous from GPIO AsyncPort sysfs file with measure support (ignore poll time)
+
Trait Implementations
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/struct.Port.html b/kawaii/kawaii-rs/doc/kawaii/gpio/struct.Port.html
new file mode 100644
index 0000000..bed1584
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/struct.Port.html
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio::Port - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct Port {
+ pub number: u8 ,
+ pub direction: Direction ,
+} Fields
+
+ number: u8
+
+
+ direction: Direction
+ Methods
+
+
Constructs a new GPIO Port.
+
+
+
+number GPIO Port number of pin.
+direction GPIO Port direction.
+
+
fn drop (&mut self)
+
Drop GPIO Port: unexport
+
Trait Implementations
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/gpio/struct.SyncPort.html b/kawaii/kawaii-rs/doc/kawaii/gpio/struct.SyncPort.html
new file mode 100644
index 0000000..840525e
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/gpio/struct.SyncPort.html
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+ kawaii::gpio::SyncPort - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct SyncPort {
+ pub port: Port ,
+ // some fields omitted
+} Fields
+
+ port: Port
+ Methods
+
+
Constructs a new synchronised GPIO Port.
+
+
+
+number GPIO Port number of pin.
+direction GPIO Port direction.
+
+
+
Read from GPIO SyncPort sysfs file
+
+
Write to GPIO SyncPort sysfs file
+
Trait Implementations
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/index.html b/kawaii/kawaii-rs/doc/kawaii/index.html
new file mode 100644
index 0000000..5519383
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/index.html
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+ kawaii - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/measure/Measure.t.html b/kawaii/kawaii-rs/doc/kawaii/measure/Measure.t.html
new file mode 100644
index 0000000..77498b8
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/measure/Measure.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.Measure.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/measure/struct.Measure.html b/kawaii/kawaii-rs/doc/kawaii/measure/struct.Measure.html
new file mode 100644
index 0000000..687fb0c
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/measure/struct.Measure.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii/struct.Measure.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/sidebar-items.js b/kawaii/kawaii-rs/doc/kawaii/sidebar-items.js
new file mode 100644
index 0000000..6f578c0
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"mod":[["gpio",""]],"struct":[["Measure",""]]});
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii/struct.Measure.html b/kawaii/kawaii-rs/doc/kawaii/struct.Measure.html
new file mode 100644
index 0000000..f752b65
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii/struct.Measure.html
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+ kawaii::Measure - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct Measure {
+ pub min: u64 ,
+ pub max: u64 ,
+ pub name: String ,
+ // some fields omitted
+} Fields
+
+ min: u64
+
+
+ max: u64
+
+
+ name: String
+ Methods
+fn new (name: String ) -> Self
+
Constructs a new Measure.
+
+
+
+name Name of measured component.
+
+
fn start (&mut self)
+
fn pause (&mut self)
+
fn stop (&mut self)
+
Stop measurement and calculate time difference
+
Trait Implementations
+
+
Formats the value using the given formatter.
+
+fn drop (&mut self)
+
Print measure results and write times to file
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_clean.v.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_clean.v.html
new file mode 100644
index 0000000..4d9ef95
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_clean.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.emergency_stop_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_get_state.v.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_get_state.v.html
new file mode 100644
index 0000000..ede2680
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_get_state.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.emergency_stop_get_state.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_init.v.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_init.v.html
new file mode 100644
index 0000000..090b850
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/emergency_stop_init.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.emergency_stop_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_clean.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_clean.html
new file mode 100644
index 0000000..c286cd4
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_clean.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.emergency_stop_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_get_state.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_get_state.html
new file mode 100644
index 0000000..dbd278a
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_get_state.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.emergency_stop_get_state.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_init.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_init.html
new file mode 100644
index 0000000..b9d8371
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop/fn.emergency_stop_init.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.emergency_stop_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_clean.v.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_clean.v.html
new file mode 100644
index 0000000..4d9ef95
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_clean.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.emergency_stop_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_get_state.v.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_get_state.v.html
new file mode 100644
index 0000000..ede2680
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_get_state.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.emergency_stop_get_state.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_init.v.html b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_init.v.html
new file mode 100644
index 0000000..090b850
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/emergency_stop_init.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.emergency_stop_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_clean.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_clean.html
new file mode 100644
index 0000000..adf2434
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_clean.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::emergency_stop_clean - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn emergency_stop_clean(emergency_stop: *mut EmergencyStop)Drops a EmergencyStop pointer on heap.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_get_state.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_get_state.html
new file mode 100644
index 0000000..8308e08
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_get_state.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::emergency_stop_get_state - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn emergency_stop_get_state( emergency_stop: *mut EmergencyStop ) -> bool Returns EmergencyStop pointer state.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_init.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_init.html
new file mode 100644
index 0000000..d7a91e7
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.emergency_stop_init.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::emergency_stop_init - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn emergency_stop_init(stop: u8 ) -> *mut EmergencyStopConstructs a new EmergencyStop on heap and returns pointer.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_clean.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_clean.html
new file mode 100644
index 0000000..fcd052d
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_clean.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::measure_clean - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn measure_clean(measure: *mut Measure)Drops a Measure pointer on heap.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_init.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_init.html
new file mode 100644
index 0000000..b729980
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_init.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::measure_init - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn measure_init(name: *const c_char ) -> *mut MeasureConstructs a new Measure on heap and returns pointer.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_pause.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_pause.html
new file mode 100644
index 0000000..cfa31da
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_pause.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::measure_pause - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn measure_pause(measure: *mut Measure)Pause measure on Measure pointer.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_start.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_start.html
new file mode 100644
index 0000000..2485458
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_start.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::measure_start - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn measure_start(measure: *mut Measure)Starts measure on Measure pointer.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_stop.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_stop.html
new file mode 100644
index 0000000..13260ba
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.measure_stop.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::measure_stop - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn measure_stop(measure: *mut Measure)Stop measure on Measure pointer.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_clean.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_clean.html
new file mode 100644
index 0000000..5814803
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_clean.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::ultrasonic_clean - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn ultrasonic_clean(ultrasonic: *mut Ultrasonic)Drops a Ultrasonic pointer on heap.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_get_distance.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_get_distance.html
new file mode 100644
index 0000000..3ed21db
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_get_distance.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::ultrasonic_get_distance - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn ultrasonic_get_distance(ultrasonic: *mut Ultrasonic) -> u32 Returns Ultrasonic pointer distance.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_init.html b/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_init.html
new file mode 100644
index 0000000..b3ab097
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/fn.ultrasonic_init.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api::ultrasonic_init - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#[no_mangle]
+
pub extern "C" fn ultrasonic_init( trigger: u8 , echo: u8 , temperature: u8 ) -> *mut UltrasonicConstructs a new Ultrasonic on heap and returns pointer.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/index.html b/kawaii/kawaii-rs/doc/kawaii_api/index.html
new file mode 100644
index 0000000..474f0db
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/index.html
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+ kawaii_api - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_clean.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_clean.html
new file mode 100644
index 0000000..14b72e5
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_clean.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.measure_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_init.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_init.html
new file mode 100644
index 0000000..18b5f0a
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_init.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.measure_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_pause.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_pause.html
new file mode 100644
index 0000000..b252633
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_pause.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.measure_pause.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_start.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_start.html
new file mode 100644
index 0000000..a71c8a4
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_start.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.measure_start.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_stop.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_stop.html
new file mode 100644
index 0000000..983fcf8
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/fn.measure_stop.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.measure_stop.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_clean.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_clean.v.html
new file mode 100644
index 0000000..fb6eef3
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_clean.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_init.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_init.v.html
new file mode 100644
index 0000000..21f55c6
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_init.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_pause.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_pause.v.html
new file mode 100644
index 0000000..0538f97
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_pause.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_pause.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_start.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_start.v.html
new file mode 100644
index 0000000..634fd82
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_start.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_start.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_stop.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_stop.v.html
new file mode 100644
index 0000000..aba8518
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure/measure_stop.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_stop.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure_clean.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure_clean.v.html
new file mode 100644
index 0000000..fb6eef3
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure_clean.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure_init.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure_init.v.html
new file mode 100644
index 0000000..21f55c6
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure_init.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure_pause.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure_pause.v.html
new file mode 100644
index 0000000..0538f97
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure_pause.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_pause.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure_start.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure_start.v.html
new file mode 100644
index 0000000..634fd82
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure_start.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_start.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/measure_stop.v.html b/kawaii/kawaii-rs/doc/kawaii_api/measure_stop.v.html
new file mode 100644
index 0000000..aba8518
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/measure_stop.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.measure_stop.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/sidebar-items.js b/kawaii/kawaii-rs/doc/kawaii_api/sidebar-items.js
new file mode 100644
index 0000000..d45c380
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"fn":[["emergency_stop_clean","Drops a `EmergencyStop` pointer on heap."],["emergency_stop_get_state","Returns `EmergencyStop` pointer state."],["emergency_stop_init","Constructs a new `EmergencyStop` on heap and returns pointer."],["measure_clean","Drops a `Measure` pointer on heap."],["measure_init","Constructs a new `Measure` on heap and returns pointer."],["measure_pause","Pause measure on `Measure` pointer."],["measure_start","Starts measure on `Measure` pointer."],["measure_stop","Stop measure on `Measure` pointer."],["ultrasonic_clean","Drops a `Ultrasonic` pointer on heap."],["ultrasonic_get_distance","Returns `Ultrasonic` pointer distance."],["ultrasonic_init","Constructs a new `Ultrasonic` on heap and returns pointer."]]});
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_clean.v.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_clean.v.html
new file mode 100644
index 0000000..5834d1d
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_clean.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.ultrasonic_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_get_distance.v.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_get_distance.v.html
new file mode 100644
index 0000000..fb004ba
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_get_distance.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.ultrasonic_get_distance.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_init.v.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_init.v.html
new file mode 100644
index 0000000..e6946c7
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_init.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.ultrasonic_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_clean.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_clean.html
new file mode 100644
index 0000000..5cc095c
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_clean.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.ultrasonic_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_get_distance.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_get_distance.html
new file mode 100644
index 0000000..e10feb3
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_get_distance.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.ultrasonic_get_distance.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_init.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_init.html
new file mode 100644
index 0000000..cb41f33
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/fn.ultrasonic_init.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to ../../kawaii_api/fn.ultrasonic_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_clean.v.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_clean.v.html
new file mode 100644
index 0000000..5834d1d
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_clean.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.ultrasonic_clean.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_get_distance.v.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_get_distance.v.html
new file mode 100644
index 0000000..fb004ba
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_get_distance.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.ultrasonic_get_distance.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_init.v.html b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_init.v.html
new file mode 100644
index 0000000..e6946c7
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/kawaii_api/ultrasonic_irq/ultrasonic_init.v.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to fn.ultrasonic_init.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/main.css b/kawaii/kawaii-rs/doc/main.css
new file mode 100644
index 0000000..c031019
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/main.css
@@ -0,0 +1,186 @@
+/**
+ * Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+ * file at the top-level directory of this distribution and at
+ * http://rust-lang.org/COPYRIGHT.
+ *
+ * Licensed under the Apache License, Version 2.0 or the MIT license
+ * , at your
+ * option. This file may not be copied, modified, or distributed
+ * except according to those terms.
+ */
+
+/* General structure and fonts */
+
+body {
+ background-color: white;
+ color: black;
+}
+
+h1, h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod) {
+ color: black;
+}
+h1.fqn {
+ border-bottom-color: #D5D5D5;
+}
+h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod) {
+ border-bottom-color: #DDDDDD;
+}
+.in-band {
+ background-color: white;
+}
+
+.docblock code, .docblock-short code {
+ background-color: #F5F5F5;
+}
+pre {
+ background-color: #F5F5F5;
+}
+
+.sidebar {
+ background-color: #F1F1F1;
+}
+
+.sidebar .current {
+ background-color: #fff;
+}
+
+.source .sidebar {
+ background-color: #fff;
+}
+
+.sidebar .location {
+ border-color: #000;
+ background-color: #fff;
+ color: #333;
+}
+
+.block a:hover {
+ background: #F5F5F5;
+}
+
+.line-numbers span { color: #c67e2d; }
+.line-numbers .line-highlighted {
+ background-color: #f6fdb0 !important;
+}
+
+:target { background: #FDFFD3; }
+.content .highlighted {
+ color: #000 !important;
+ background-color: #ccc;
+}
+.content .highlighted a, .content .highlighted span { color: #000 !important; }
+.content .highlighted.trait { background-color: #fece7e; }
+.content .highlighted.mod { background-color: #afc6e4; }
+.content .highlighted.enum { background-color: #b4d1b9; }
+.content .highlighted.struct { background-color: #e7b1a0; }
+.content .highlighted.fn { background-color: #c6afb3; }
+.content .highlighted.method { background-color: #c6afb3; }
+.content .highlighted.tymethod { background-color: #c6afb3; }
+.content .highlighted.type { background-color: #c6afb3; }
+
+.docblock h1, .docblock h2, .docblock h3, .docblock h4, .docblock h5 {
+ border-bottom-color: #DDD;
+}
+
+.docblock table {
+ border-color: #ddd;
+}
+
+.docblock table td {
+ border-top-color: #ddd;
+ border-bottom-color: #ddd;
+}
+
+.docblock table th {
+ border-top-color: #ddd;
+ border-bottom-color: #ddd;
+}
+
+.content span.primitive, .content a.primitive, .block a.current.primitive { color: #39a7bf; }
+.content span.externcrate,
+.content span.mod, .content a.mod, .block a.current.mod { color: #4d76ae; }
+.content span.fn, .content a.fn, .block a.current.fn,
+.content span.method, .content a.method, .block a.current.method,
+.content span.tymethod, .content a.tymethod, .block a.current.tymethod,
+.content .fnname { color: #8c6067; }
+
+pre.rust .comment { color: #8E908C; }
+pre.rust .doccomment { color: #4D4D4C; }
+
+nav {
+ border-bottom-color: #e0e0e0;
+}
+nav.main .current {
+ border-top-color: #000;
+ border-bottom-color: #000;
+}
+nav.main .separator {
+ border: 1px solid #000;
+}
+a {
+ color: #000;
+}
+
+.docblock a, .docblock-short a, .stability a {
+ color: #3873AD;
+}
+
+a.test-arrow {
+ color: #f5f5f5;
+}
+
+.content span.trait, .content a.trait, .block a.current.trait { color: #7c5af3; }
+
+.search-input {
+ color: #555;
+ box-shadow: 0 0 0 1px #e0e0e0, 0 0 0 2px transparent;
+ background-color: white;
+}
+
+.stab.unstable { background: #FFF5D6; border-color: #FFC600; }
+.stab.deprecated { background: #F3DFFF; border-color: #7F0087; }
+
+#help > div {
+ background: #e9e9e9;
+ border-color: #bfbfbf;;
+}
+
+#help dt {
+ border-color: #bfbfbf;
+ background: #fff;
+}
+
+.since {
+ color: grey;
+}
+
+.line-numbers :target { background-color: transparent; }
+
+/* Code highlighting */
+pre.rust .kw { color: #8959A8; }
+pre.rust .kw-2, pre.rust .prelude-ty { color: #4271AE; }
+pre.rust .number, pre.rust .string { color: #718C00; }
+pre.rust .self, pre.rust .bool-val, pre.rust .prelude-val,
+pre.rust .attribute, pre.rust .attribute .ident { color: #C82829; }
+pre.rust .macro, pre.rust .macro-nonterminal { color: #3E999F; }
+pre.rust .lifetime { color: #B76514; }
+pre.rust .question-mark {
+ color: #ff9011;
+}
+
+a.test-arrow {
+ background-color: rgba(78, 139, 202, 0.2);
+}
+
+a.test-arrow:hover{
+ background-color: #4e8bca;
+}
+
+.toggle-label {
+ color: #999;
+}
+
+:target > code {
+ background: #FDFFD3;
+}
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/main.js b/kawaii/kawaii-rs/doc/main.js
new file mode 100644
index 0000000..38f8368
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/main.js
@@ -0,0 +1,1296 @@
+/*!
+ * Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+ * file at the top-level directory of this distribution and at
+ * http://rust-lang.org/COPYRIGHT.
+ *
+ * Licensed under the Apache License, Version 2.0 or the MIT license
+ * , at your
+ * option. This file may not be copied, modified, or distributed
+ * except according to those terms.
+ */
+
+/*jslint browser: true, es5: true */
+/*globals $: true, rootPath: true */
+
+(function() {
+ "use strict";
+
+ // This mapping table should match the discriminants of
+ // `rustdoc::html::item_type::ItemType` type in Rust.
+ var itemTypes = ["mod",
+ "externcrate",
+ "import",
+ "struct",
+ "enum",
+ "fn",
+ "type",
+ "static",
+ "trait",
+ "impl",
+ "tymethod",
+ "method",
+ "structfield",
+ "variant",
+ "macro",
+ "primitive",
+ "associatedtype",
+ "constant",
+ "associatedconstant",
+ "union"];
+
+ function hasClass(elem, className) {
+ if (elem && className && elem.className) {
+ var elemClass = elem.className;
+ var start = elemClass.indexOf(className);
+ if (start == -1) {
+ return false;
+ } else if (elemClass.length == className.length) {
+ return true;
+ } else {
+ if (start > 0 && elemClass[start - 1] != ' ') {
+ return false;
+ }
+ var end = start + className.length;
+ if (end < elemClass.length && elemClass[end] != ' ') {
+ return false;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function addClass(elem, className) {
+ if (elem && className && !hasClass(elem, className)) {
+ if (elem.className && elem.className.length > 0) {
+ elem.className += ' ' + className;
+ } else {
+ elem.className = className;
+ }
+ }
+ }
+
+ function removeClass(elem, className) {
+ if (elem && className && elem.className) {
+ elem.className = (" " + elem.className + " ").replace(" " + className + " ", " ")
+ .trim();
+ }
+ }
+
+ function onEach(arr, func) {
+ if (arr && arr.length > 0 && func) {
+ for (var i = 0; i < arr.length; i++) {
+ func(arr[i]);
+ }
+ }
+ }
+
+ function isHidden(elem) {
+ return (elem.offsetParent === null)
+ }
+
+ // used for special search precedence
+ var TY_PRIMITIVE = itemTypes.indexOf("primitive");
+
+ onEach(document.getElementsByClassName('js-only'), function(e) {
+ removeClass(e, 'js-only');
+ });
+
+ function getQueryStringParams() {
+ var params = {};
+ window.location.search.substring(1).split("&").
+ map(function(s) {
+ var pair = s.split("=");
+ params[decodeURIComponent(pair[0])] =
+ typeof pair[1] === "undefined" ?
+ null : decodeURIComponent(pair[1]);
+ });
+ return params;
+ }
+
+ function browserSupportsHistoryApi() {
+ return document.location.protocol != "file:" &&
+ window.history && typeof window.history.pushState === "function";
+ }
+
+ function highlightSourceLines(ev) {
+ var i, from, to, match = window.location.hash.match(/^#?(\d+)(?:-(\d+))?$/);
+ if (match) {
+ from = parseInt(match[1], 10);
+ to = Math.min(50000, parseInt(match[2] || match[1], 10));
+ from = Math.min(from, to);
+ var elem = document.getElementById(from);
+ if (!elem) {
+ return;
+ }
+ if (ev === null) {
+ var x = document.getElementById(from);
+ if (x) {
+ x.scrollIntoView();
+ }
+ };
+ onEach(document.getElementsByClassName('line-numbers'), function(e) {
+ onEach(e.getElementsByTagName('span'), function(i_e) {
+ removeClass(i_e, 'line-highlighted');
+ });
+ })
+ for (i = from; i <= to; ++i) {
+ addClass(document.getElementById(i), 'line-highlighted');
+ }
+ }
+ }
+ highlightSourceLines(null);
+ window.onhashchange = highlightSourceLines;
+
+ // Gets the human-readable string for the virtual-key code of the
+ // given KeyboardEvent, ev.
+ //
+ // This function is meant as a polyfill for KeyboardEvent#key,
+ // since it is not supported in Trident. We also test for
+ // KeyboardEvent#keyCode because the handleShortcut handler is
+ // also registered for the keydown event, because Blink doesn't fire
+ // keypress on hitting the Escape key.
+ //
+ // So I guess you could say things are getting pretty interoperable.
+ function getVirtualKey(ev) {
+ if ("key" in ev && typeof ev.key != "undefined")
+ return ev.key;
+
+ var c = ev.charCode || ev.keyCode;
+ if (c == 27)
+ return "Escape";
+ return String.fromCharCode(c);
+ }
+
+ function handleShortcut(ev) {
+ if (document.activeElement.tagName === "INPUT")
+ return;
+
+ // Don't interfere with browser shortcuts
+ if (ev.ctrlKey || ev.altKey || ev.metaKey)
+ return;
+
+ var help = document.getElementById("help");
+ switch (getVirtualKey(ev)) {
+ case "Escape":
+ var search = document.getElementById("search");
+ if (!hasClass(help, "hidden")) {
+ ev.preventDefault();
+ addClass(help, "hidden");
+ removeClass(document.body, "blur");
+ } else if (!hasClass(search, "hidden")) {
+ ev.preventDefault();
+ addClass(search, "hidden");
+ removeClass(document.getElementById("main"), "hidden");
+ }
+ break;
+
+ case "s":
+ case "S":
+ ev.preventDefault();
+ focusSearchBar();
+ break;
+
+ case "+":
+ ev.preventDefault();
+ toggleAllDocs();
+ break;
+
+ case "?":
+ if (ev.shiftKey && hasClass(help, "hidden")) {
+ ev.preventDefault();
+ removeClass(help, "hidden");
+ addClass(document.body, "blur");
+ }
+ break;
+ }
+ }
+
+ document.onkeypress = handleShortcut;
+ document.onkeydown = handleShortcut;
+ document.onclick = function(ev) {
+ if (hasClass(ev.target, 'collapse-toggle')) {
+ collapseDocs(ev.target);
+ } else if (hasClass(ev.target.parentNode, 'collapse-toggle')) {
+ collapseDocs(ev.target.parentNode);
+ } else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) {
+ var prev_id = 0;
+
+ var set_fragment = function (name) {
+ if (browserSupportsHistoryApi()) {
+ history.replaceState(null, null, '#' + name);
+ window.hashchange();
+ } else {
+ location.replace('#' + name);
+ }
+ };
+
+ var cur_id = parseInt(ev.target.id, 10);
+
+ if (ev.shiftKey && prev_id) {
+ if (prev_id > cur_id) {
+ var tmp = prev_id;
+ prev_id = cur_id;
+ cur_id = tmp;
+ }
+
+ set_fragment(prev_id + '-' + cur_id);
+ } else {
+ prev_id = cur_id;
+
+ set_fragment(cur_id);
+ }
+ } else if (!hasClass(document.getElementById("help"), "hidden")) {
+ addClass(document.getElementById("help"), "hidden");
+ removeClass(document.body, "blur");
+ }
+ };
+
+ var x = document.getElementsByClassName('version-selector');
+ if (x.length > 0) {
+ x[0].onchange = function() {
+ var i, match,
+ url = document.location.href,
+ stripped = '',
+ len = rootPath.match(/\.\.\//g).length + 1;
+
+ for (i = 0; i < len; ++i) {
+ match = url.match(/\/[^\/]*$/);
+ if (i < len - 1) {
+ stripped = match[0] + stripped;
+ }
+ url = url.substring(0, url.length - match[0].length);
+ }
+
+ url += '/' + document.getElementsByClassName('version-selector')[0].value + stripped;
+
+ document.location.href = url;
+ };
+ }
+
+ /**
+ * A function to compute the Levenshtein distance between two strings
+ * Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported
+ * Full License can be found at http://creativecommons.org/licenses/by-sa/3.0/legalcode
+ * This code is an unmodified version of the code written by Marco de Wit
+ * and was found at http://stackoverflow.com/a/18514751/745719
+ */
+ var levenshtein = (function() {
+ var row2 = [];
+ return function(s1, s2) {
+ if (s1 === s2) {
+ return 0;
+ }
+ var s1_len = s1.length, s2_len = s2.length;
+ if (s1_len && s2_len) {
+ var i1 = 0, i2 = 0, a, b, c, c2, row = row2;
+ while (i1 < s1_len) {
+ row[i1] = ++i1;
+ }
+ while (i2 < s2_len) {
+ c2 = s2.charCodeAt(i2);
+ a = i2;
+ ++i2;
+ b = i2;
+ for (i1 = 0; i1 < s1_len; ++i1) {
+ c = a + (s1.charCodeAt(i1) !== c2 ? 1 : 0);
+ a = row[i1];
+ b = b < a ? (b < c ? b + 1 : c) : (a < c ? a + 1 : c);
+ row[i1] = b;
+ }
+ }
+ return b;
+ }
+ return s1_len + s2_len;
+ };
+ })();
+
+ function initSearch(rawSearchIndex) {
+ var currentResults, index, searchIndex;
+ var MAX_LEV_DISTANCE = 3;
+ var params = getQueryStringParams();
+
+ // Populate search bar with query string search term when provided,
+ // but only if the input bar is empty. This avoid the obnoxious issue
+ // where you start trying to do a search, and the index loads, and
+ // suddenly your search is gone!
+ if (document.getElementsByClassName("search-input")[0].value === "") {
+ document.getElementsByClassName("search-input")[0].value = params.search || '';
+ }
+
+ /**
+ * Executes the query and builds an index of results
+ * @param {[Object]} query [The user query]
+ * @param {[type]} max [The maximum results returned]
+ * @param {[type]} searchWords [The list of search words to query
+ * against]
+ * @return {[type]} [A search index of results]
+ */
+ function execQuery(query, max, searchWords) {
+ var valLower = query.query.toLowerCase(),
+ val = valLower,
+ typeFilter = itemTypeFromName(query.type),
+ results = [],
+ split = valLower.split("::");
+
+ // remove empty keywords
+ for (var j = 0; j < split.length; ++j) {
+ split[j].toLowerCase();
+ if (split[j] === "") {
+ split.splice(j, 1);
+ }
+ }
+
+ function typePassesFilter(filter, type) {
+ // No filter
+ if (filter < 0) return true;
+
+ // Exact match
+ if (filter === type) return true;
+
+ // Match related items
+ var name = itemTypes[type];
+ switch (itemTypes[filter]) {
+ case "constant":
+ return (name == "associatedconstant");
+ case "fn":
+ return (name == "method" || name == "tymethod");
+ case "type":
+ return (name == "primitive");
+ }
+
+ // No match
+ return false;
+ }
+
+ // quoted values mean literal search
+ var nSearchWords = searchWords.length;
+ if ((val.charAt(0) === "\"" || val.charAt(0) === "'") &&
+ val.charAt(val.length - 1) === val.charAt(0))
+ {
+ val = val.substr(1, val.length - 2);
+ for (var i = 0; i < nSearchWords; ++i) {
+ if (searchWords[i] === val) {
+ // filter type: ... queries
+ if (typePassesFilter(typeFilter, searchIndex[i].ty)) {
+ results.push({id: i, index: -1});
+ }
+ }
+ if (results.length === max) {
+ break;
+ }
+ }
+ // searching by type
+ } else if (val.search("->") > -1) {
+ var trimmer = function (s) { return s.trim(); };
+ var parts = val.split("->").map(trimmer);
+ var input = parts[0];
+ // sort inputs so that order does not matter
+ var inputs = input.split(",").map(trimmer).sort().toString();
+ var output = parts[1];
+
+ for (var i = 0; i < nSearchWords; ++i) {
+ var type = searchIndex[i].type;
+ if (!type) {
+ continue;
+ }
+
+ // sort index inputs so that order does not matter
+ var typeInputs = type.inputs.map(function (input) {
+ return input.name;
+ }).sort();
+
+ // allow searching for void (no output) functions as well
+ var typeOutput = type.output ? type.output.name : "";
+ if ((inputs === "*" || inputs === typeInputs.toString()) &&
+ (output === "*" || output == typeOutput)) {
+ results.push({id: i, index: -1, dontValidate: true});
+ }
+ }
+ } else {
+ // gather matching search results up to a certain maximum
+ val = val.replace(/\_/g, "");
+ for (var i = 0; i < split.length; ++i) {
+ for (var j = 0; j < nSearchWords; ++j) {
+ var lev_distance;
+ if (searchWords[j].indexOf(split[i]) > -1 ||
+ searchWords[j].indexOf(val) > -1 ||
+ searchWords[j].replace(/_/g, "").indexOf(val) > -1)
+ {
+ // filter type: ... queries
+ if (typePassesFilter(typeFilter, searchIndex[j].ty)) {
+ results.push({
+ id: j,
+ index: searchWords[j].replace(/_/g, "").indexOf(val),
+ lev: 0,
+ });
+ }
+ } else if (
+ (lev_distance = levenshtein(searchWords[j], val)) <=
+ MAX_LEV_DISTANCE) {
+ if (typePassesFilter(typeFilter, searchIndex[j].ty)) {
+ results.push({
+ id: j,
+ index: 0,
+ // we want lev results to go lower than others
+ lev: lev_distance,
+ });
+ }
+ }
+ if (results.length === max) {
+ break;
+ }
+ }
+ }
+ }
+
+ var nresults = results.length;
+ for (var i = 0; i < nresults; ++i) {
+ results[i].word = searchWords[results[i].id];
+ results[i].item = searchIndex[results[i].id] || {};
+ }
+ // if there are no results then return to default and fail
+ if (results.length === 0) {
+ return [];
+ }
+
+ results.sort(function sortResults(aaa, bbb) {
+ var a, b;
+
+ // Sort by non levenshtein results and then levenshtein results by the distance
+ // (less changes required to match means higher rankings)
+ a = (aaa.lev);
+ b = (bbb.lev);
+ if (a !== b) { return a - b; }
+
+ // sort by crate (non-current crate goes later)
+ a = (aaa.item.crate !== window.currentCrate);
+ b = (bbb.item.crate !== window.currentCrate);
+ if (a !== b) { return a - b; }
+
+ // sort by exact match (mismatch goes later)
+ a = (aaa.word !== valLower);
+ b = (bbb.word !== valLower);
+ if (a !== b) { return a - b; }
+
+ // sort by item name length (longer goes later)
+ a = aaa.word.length;
+ b = bbb.word.length;
+ if (a !== b) { return a - b; }
+
+ // sort by item name (lexicographically larger goes later)
+ a = aaa.word;
+ b = bbb.word;
+ if (a !== b) { return (a > b ? +1 : -1); }
+
+ // sort by index of keyword in item name (no literal occurrence goes later)
+ a = (aaa.index < 0);
+ b = (bbb.index < 0);
+ if (a !== b) { return a - b; }
+ // (later literal occurrence, if any, goes later)
+ a = aaa.index;
+ b = bbb.index;
+ if (a !== b) { return a - b; }
+
+ // special precedence for primitive pages
+ if ((aaa.item.ty === TY_PRIMITIVE) && (bbb.item.ty !== TY_PRIMITIVE)) {
+ return -1;
+ }
+ if ((bbb.item.ty === TY_PRIMITIVE) && (aaa.item.ty !== TY_PRIMITIVE)) {
+ return 1;
+ }
+
+ // sort by description (no description goes later)
+ a = (aaa.item.desc === '');
+ b = (bbb.item.desc === '');
+ if (a !== b) { return a - b; }
+
+ // sort by type (later occurrence in `itemTypes` goes later)
+ a = aaa.item.ty;
+ b = bbb.item.ty;
+ if (a !== b) { return a - b; }
+
+ // sort by path (lexicographically larger goes later)
+ a = aaa.item.path;
+ b = bbb.item.path;
+ if (a !== b) { return (a > b ? +1 : -1); }
+
+ // que sera, sera
+ return 0;
+ });
+
+ // remove duplicates, according to the data provided
+ for (var i = results.length - 1; i > 0; i -= 1) {
+ if (results[i].word === results[i - 1].word &&
+ results[i].item.ty === results[i - 1].item.ty &&
+ results[i].item.path === results[i - 1].item.path &&
+ (results[i].item.parent || {}).name === (results[i - 1].item.parent || {}).name)
+ {
+ results[i].id = -1;
+ }
+ }
+ for (var i = 0; i < results.length; ++i) {
+ var result = results[i],
+ name = result.item.name.toLowerCase(),
+ path = result.item.path.toLowerCase(),
+ parent = result.item.parent;
+
+ // this validation does not make sense when searching by types
+ if (result.dontValidate) {
+ continue;
+ }
+
+ var valid = validateResult(name, path, split, parent);
+ if (!valid) {
+ result.id = -1;
+ }
+ }
+ return results;
+ }
+
+ /**
+ * Validate performs the following boolean logic. For example:
+ * "File::open" will give IF A PARENT EXISTS => ("file" && "open")
+ * exists in (name || path || parent) OR => ("file" && "open") exists in
+ * (name || path )
+ *
+ * This could be written functionally, but I wanted to minimise
+ * functions on stack.
+ *
+ * @param {[string]} name [The name of the result]
+ * @param {[string]} path [The path of the result]
+ * @param {[string]} keys [The keys to be used (["file", "open"])]
+ * @param {[object]} parent [The parent of the result]
+ * @return {[boolean]} [Whether the result is valid or not]
+ */
+ function validateResult(name, path, keys, parent) {
+ for (var i = 0; i < keys.length; ++i) {
+ // each check is for validation so we negate the conditions and invalidate
+ if (!(
+ // check for an exact name match
+ name.toLowerCase().indexOf(keys[i]) > -1 ||
+ // then an exact path match
+ path.toLowerCase().indexOf(keys[i]) > -1 ||
+ // next if there is a parent, check for exact parent match
+ (parent !== undefined &&
+ parent.name.toLowerCase().indexOf(keys[i]) > -1) ||
+ // lastly check to see if the name was a levenshtein match
+ levenshtein(name.toLowerCase(), keys[i]) <=
+ MAX_LEV_DISTANCE)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function getQuery() {
+ var matches, type, query, raw =
+ document.getElementsByClassName('search-input')[0].value;
+ query = raw;
+
+ matches = query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i);
+ if (matches) {
+ type = matches[1].replace(/^const$/, 'constant');
+ query = query.substring(matches[0].length);
+ }
+
+ return {
+ raw: raw,
+ query: query,
+ type: type,
+ id: query + type
+ };
+ }
+
+ function initSearchNav() {
+ var hoverTimeout;
+
+ var click_func = function(e) {
+ var el = e.target;
+ // to retrieve the real "owner" of the event.
+ while (el.tagName !== 'TR') {
+ el = el.parentNode;
+ }
+ var dst = e.target.getElementsByTagName('a');
+ if (dst.length < 1) {
+ return;
+ }
+ dst = dst[0];
+ if (window.location.pathname === dst.pathname) {
+ addClass(document.getElementById('search'), 'hidden');
+ removeClass(document.getElementById('main'), 'hidden');
+ document.location.href = dst.href;
+ }
+ };
+ var mouseover_func = function(e) {
+ var el = e.target;
+ // to retrieve the real "owner" of the event.
+ while (el.tagName !== 'TR') {
+ el = el.parentNode;
+ }
+ clearTimeout(hoverTimeout);
+ hoverTimeout = setTimeout(function() {
+ onEach(document.getElementsByClassName('search-results'), function(e) {
+ onEach(e.getElementsByClassName('result'), function(i_e) {
+ removeClass(i_e, 'highlighted');
+ });
+ });
+ addClass(el, 'highlighted');
+ }, 20);
+ };
+ onEach(document.getElementsByClassName('search-results'), function(e) {
+ onEach(e.getElementsByClassName('result'), function(i_e) {
+ i_e.onclick = click_func;
+ i_e.onmouseover = mouseover_func;
+ });
+ });
+
+ var search_input = document.getElementsByClassName('search-input')[0];
+ search_input.onkeydown = null;
+ search_input.onkeydown = function(e) {
+ var actives = [];
+ onEach(document.getElementsByClassName('search-results'), function(e) {
+ onEach(document.getElementsByClassName('highlighted'), function(e) {
+ actives.push(e);
+ });
+ });
+
+ if (e.which === 38) { // up
+ if (!actives.length || !actives[0].previousElementSibling) {
+ return;
+ }
+
+ addClass(actives[0].previousElementSibling, 'highlighted');
+ removeClass(actives[0], 'highlighted');
+ } else if (e.which === 40) { // down
+ if (!actives.length) {
+ var results = document.getElementsByClassName('search-results');
+ if (results.length > 0) {
+ var res = results[0].getElementsByClassName('result');
+ if (res.length > 0) {
+ addClass(res[0], 'highlighted');
+ }
+ }
+ } else if (actives[0].nextElementSibling) {
+ addClass(actives[0].nextElementSibling, 'highlighted');
+ removeClass(actives[0], 'highlighted');
+ }
+ } else if (e.which === 13) { // return
+ if (actives.length) {
+ document.location.href = actives[0].getElementsByTagName('a')[0].href;
+ }
+ } else if (actives.length > 0) {
+ removeClass(actives[0], 'highlighted');
+ }
+ };
+ }
+
+ function escape(content) {
+ var h1 = document.createElement('h1');
+ h1.textContent = content;
+ return h1.innerHTML;
+ }
+
+ function showResults(results) {
+ var output, shown, query = getQuery();
+
+ currentResults = query.id;
+ output = 'Results for ' + escape(query.query) +
+ (query.type ? ' (type: ' + escape(query.type) + ')' : '') + ' ';
+ output += '';
+
+ if (results.length > 0) {
+ shown = [];
+
+ results.forEach(function(item) {
+ var name, type, href, displayPath;
+
+ if (shown.indexOf(item) !== -1) {
+ return;
+ }
+
+ shown.push(item);
+ name = item.name;
+ type = itemTypes[item.ty];
+
+ if (type === 'mod') {
+ displayPath = item.path + '::';
+ href = rootPath + item.path.replace(/::/g, '/') + '/' +
+ name + '/index.html';
+ } else if (type === "primitive") {
+ displayPath = "";
+ href = rootPath + item.path.replace(/::/g, '/') +
+ '/' + type + '.' + name + '.html';
+ } else if (type === "externcrate") {
+ displayPath = "";
+ href = rootPath + name + '/index.html';
+ } else if (item.parent !== undefined) {
+ var myparent = item.parent;
+ var anchor = '#' + type + '.' + name;
+ var parentType = itemTypes[myparent.ty];
+ if (parentType === "primitive") {
+ displayPath = myparent.name + '::';
+ } else {
+ displayPath = item.path + '::' + myparent.name + '::';
+ }
+ href = rootPath + item.path.replace(/::/g, '/') +
+ '/' + parentType +
+ '.' + myparent.name +
+ '.html' + anchor;
+ } else {
+ displayPath = item.path + '::';
+ href = rootPath + item.path.replace(/::/g, '/') +
+ '/' + type + '.' + name + '.html';
+ }
+
+ output += '' +
+ '' +
+ displayPath + '' +
+ name + ' ' +
+ '' +
+ '' + escape(item.desc) +
+ ' ';
+ });
+ } else {
+ output += 'No results :( Try on DuckDuckGo? ';
+ }
+
+ output += "";
+ addClass(document.getElementById('main'), 'hidden');
+ var search = document.getElementById('search');
+ removeClass(search, 'hidden');
+ search.innerHTML = output;
+ var tds = search.getElementsByTagName('td');
+ var td_width = 0;
+ if (tds.length > 0) {
+ td_width = tds[0].offsetWidth;
+ }
+ var width = search.offsetWidth - 40 - td_width;
+ onEach(search.getElementsByClassName('desc'), function(e) {
+ e.style.width = width + 'px';
+ });
+ initSearchNav();
+ }
+
+ function search(e) {
+ var query,
+ filterdata = [],
+ obj, i, len,
+ results = [],
+ maxResults = 200,
+ resultIndex;
+ var params = getQueryStringParams();
+
+ query = getQuery();
+ if (e) {
+ e.preventDefault();
+ }
+
+ if (!query.query || query.id === currentResults) {
+ return;
+ }
+
+ // Update document title to maintain a meaningful browser history
+ document.title = "Results for " + query.query + " - Rust";
+
+ // Because searching is incremental by character, only the most
+ // recent search query is added to the browser history.
+ if (browserSupportsHistoryApi()) {
+ if (!history.state && !params.search) {
+ history.pushState(query, "", "?search=" + encodeURIComponent(query.raw));
+ } else {
+ history.replaceState(query, "", "?search=" + encodeURIComponent(query.raw));
+ }
+ }
+
+ resultIndex = execQuery(query, 20000, index);
+ len = resultIndex.length;
+ for (i = 0; i < len; ++i) {
+ if (resultIndex[i].id > -1) {
+ obj = searchIndex[resultIndex[i].id];
+ filterdata.push([obj.name, obj.ty, obj.path, obj.desc]);
+ results.push(obj);
+ }
+ if (results.length >= maxResults) {
+ break;
+ }
+ }
+
+ showResults(results);
+ }
+
+ function itemTypeFromName(typename) {
+ for (var i = 0; i < itemTypes.length; ++i) {
+ if (itemTypes[i] === typename) { return i; }
+ }
+ return -1;
+ }
+
+ function buildIndex(rawSearchIndex) {
+ searchIndex = [];
+ var searchWords = [];
+ for (var crate in rawSearchIndex) {
+ if (!rawSearchIndex.hasOwnProperty(crate)) { continue; }
+
+ searchWords.push(crate);
+ searchIndex.push({
+ crate: crate,
+ ty: 1, // == ExternCrate
+ name: crate,
+ path: "",
+ desc: rawSearchIndex[crate].doc,
+ type: null,
+ });
+
+ // an array of [(Number) item type,
+ // (String) name,
+ // (String) full path or empty string for previous path,
+ // (String) description,
+ // (Number | null) the parent path index to `paths`]
+ // (Object | null) the type of the function (if any)
+ var items = rawSearchIndex[crate].items;
+ // an array of [(Number) item type,
+ // (String) name]
+ var paths = rawSearchIndex[crate].paths;
+
+ // convert `paths` into an object form
+ var len = paths.length;
+ for (var i = 0; i < len; ++i) {
+ paths[i] = {ty: paths[i][0], name: paths[i][1]};
+ }
+
+ // convert `items` into an object form, and construct word indices.
+ //
+ // before any analysis is performed lets gather the search terms to
+ // search against apart from the rest of the data. This is a quick
+ // operation that is cached for the life of the page state so that
+ // all other search operations have access to this cached data for
+ // faster analysis operations
+ var len = items.length;
+ var lastPath = "";
+ for (var i = 0; i < len; ++i) {
+ var rawRow = items[i];
+ var row = {crate: crate, ty: rawRow[0], name: rawRow[1],
+ path: rawRow[2] || lastPath, desc: rawRow[3],
+ parent: paths[rawRow[4]], type: rawRow[5]};
+ searchIndex.push(row);
+ if (typeof row.name === "string") {
+ var word = row.name.toLowerCase();
+ searchWords.push(word);
+ } else {
+ searchWords.push("");
+ }
+ lastPath = row.path;
+ }
+ }
+ return searchWords;
+ }
+
+ function startSearch() {
+ var searchTimeout;
+ var callback = function() {
+ var search_input = document.getElementsByClassName('search-input');
+ if (search_input.length < 1) { return; }
+ search_input = search_input[0];
+ clearTimeout(searchTimeout);
+ if (search_input.value.length === 0) {
+ if (browserSupportsHistoryApi()) {
+ history.replaceState("", "std - Rust", "?search=");
+ }
+ var main = document.getElementById('main');
+ if (hasClass(main, 'content')) {
+ removeClass(main, 'hidden');
+ }
+ var search_c = document.getElementById('search');
+ if (hasClass(search_c, 'content')) {
+ addClass(search_c, 'hidden');
+ }
+ } else {
+ searchTimeout = setTimeout(search, 500);
+ }
+ };
+ var search_input = document.getElementsByClassName("search-input")[0];
+ search_input.onkeyup = callback;
+ search_input.oninput = callback;
+ document.getElementsByClassName("search-form")[0].onsubmit = function(e){
+ e.preventDefault();
+ clearTimeout(searchTimeout);
+ search();
+ };
+ search_input.onchange = function(e) {
+ // Do NOT e.preventDefault() here. It will prevent pasting.
+ clearTimeout(searchTimeout);
+ // zero-timeout necessary here because at the time of event handler execution the
+ // pasted content is not in the input field yet. Shouldn’t make any difference for
+ // change, though.
+ setTimeout(search, 0);
+ };
+ search_input.onpaste = search_input.onchange;
+
+ // Push and pop states are used to add search results to the browser
+ // history.
+ if (browserSupportsHistoryApi()) {
+ // Store the previous so we can revert back to it later.
+ var previousTitle = document.title;
+
+ window.onpopstate = function(e) {
+ var params = getQueryStringParams();
+ // When browsing back from search results the main page
+ // visibility must be reset.
+ if (!params.search) {
+ var main = document.getElementById('main');
+ if (hasClass(main, 'content')) {
+ removeClass(main, 'hidden');
+ }
+ var search_c = document.getElementById('search');
+ if (hasClass(search_c, 'content')) {
+ addClass(search_c, 'hidden');
+ }
+ }
+ // Revert to the previous title manually since the History
+ // API ignores the title parameter.
+ document.title = previousTitle;
+ // When browsing forward to search results the previous
+ // search will be repeated, so the currentResults are
+ // cleared to ensure the search is successful.
+ currentResults = null;
+ // Synchronize search bar with query string state and
+ // perform the search. This will empty the bar if there's
+ // nothing there, which lets you really go back to a
+ // previous state with nothing in the bar.
+ if (params.search) {
+ document.getElementsByClassName('search-input')[0].value = params.search;
+ } else {
+ document.getElementsByClassName('search-input')[0].value = '';
+ }
+ // Some browsers fire 'onpopstate' for every page load
+ // (Chrome), while others fire the event only when actually
+ // popping a state (Firefox), which is why search() is
+ // called both here and at the end of the startSearch()
+ // function.
+ search();
+ };
+ }
+ search();
+ }
+
+ index = buildIndex(rawSearchIndex);
+ startSearch();
+
+ // Draw a convenient sidebar of known crates if we have a listing
+ if (rootPath === '../') {
+ var sidebar = document.getElementsByClassName('sidebar')[0];
+ var div = document.createElement('div');
+ div.className = 'block crate';
+ div.innerHTML = 'Crates ';
+ var ul = document.createElement('ul');
+ div.appendChild(ul);
+
+ var crates = [];
+ for (var crate in rawSearchIndex) {
+ if (!rawSearchIndex.hasOwnProperty(crate)) { continue; }
+ crates.push(crate);
+ }
+ crates.sort();
+ for (var i = 0; i < crates.length; ++i) {
+ var klass = 'crate';
+ if (crates[i] === window.currentCrate) {
+ klass += ' current';
+ }
+ var link = document.createElement('a');
+ link.href = '../' + crates[i] + '/index.html';
+ link.title = rawSearchIndex[crates[i]].doc;
+ link.className = klass;
+ link.textContent = crates[i];
+
+ var li = document.createElement('li');
+ li.appendChild(link);
+ ul.appendChild(li);
+ }
+ sidebar.appendChild(div);
+ }
+ }
+
+ window.initSearch = initSearch;
+
+ // delayed sidebar rendering.
+ function initSidebarItems(items) {
+ var sidebar = document.getElementsByClassName('sidebar')[0];
+ var current = window.sidebarCurrent;
+
+ function block(shortty, longty) {
+ var filtered = items[shortty];
+ if (!filtered) { return; }
+
+ var div = document.createElement('div');
+ div.className = 'block ' + shortty;
+ var h3 = document.createElement('h3');
+ h3.textContent = longty;
+ div.appendChild(h3);
+ var ul = document.createElement('ul');
+
+ for (var i = 0; i < filtered.length; ++i) {
+ var item = filtered[i];
+ var name = item[0];
+ var desc = item[1]; // can be null
+
+ var klass = shortty;
+ if (name === current.name && shortty === current.ty) {
+ klass += ' current';
+ }
+ var path;
+ if (shortty === 'mod') {
+ path = name + '/index.html';
+ } else {
+ path = shortty + '.' + name + '.html';
+ }
+ var link = document.createElement('a');
+ link.href = current.relpath + path;
+ link.title = desc;
+ link.className = klass;
+ link.textContent = name;
+ var li = document.createElement('li');
+ li.appendChild(link);
+ ul.appendChild(li);
+ }
+ div.appendChild(ul);
+ sidebar.appendChild(div);
+ }
+
+ block("primitive", "Primitive Types");
+ block("mod", "Modules");
+ block("macro", "Macros");
+ block("struct", "Structs");
+ block("enum", "Enums");
+ block("constant", "Constants");
+ block("static", "Statics");
+ block("trait", "Traits");
+ block("fn", "Functions");
+ block("type", "Type Definitions");
+ }
+
+ window.initSidebarItems = initSidebarItems;
+
+ window.register_implementors = function(imp) {
+ var list = document.getElementById('implementors-list');
+ var libs = Object.getOwnPropertyNames(imp);
+ for (var i = 0; i < libs.length; ++i) {
+ if (libs[i] === currentCrate) { continue; }
+ var structs = imp[libs[i]];
+ for (var j = 0; j < structs.length; ++j) {
+ var code = document.createElement('code');
+ code.innerHTML = structs[j];
+
+ var x = code.getElementsByTagName('a');
+ for (var k = 0; k < x.length; k++) {
+ var href = x[k].getAttribute('href');
+ if (href && href.indexOf('http') !== 0) {
+ x[k].setAttribute('href', rootPath + href);
+ }
+ }
+ var li = document.createElement('li');
+ li.appendChild(code);
+ list.appendChild(li);
+ }
+ }
+ };
+ if (window.pending_implementors) {
+ window.register_implementors(window.pending_implementors);
+ }
+
+ function labelForToggleButton(sectionIsCollapsed) {
+ if (sectionIsCollapsed) {
+ // button will expand the section
+ return "+";
+ }
+ // button will collapse the section
+ // note that this text is also set in the HTML template in render.rs
+ return "\u2212"; // "\u2212" is '−' minus sign
+ }
+
+ function onEveryMatchingChild(elem, className, func) {
+ if (elem && className && func) {
+ for (var i = 0; i < elem.childNodes.length; i++) {
+ if (hasClass(elem.childNodes[i], className)) {
+ func(elem.childNodes[i]);
+ } else {
+ onEveryMatchingChild(elem.childNodes[i], className, func);
+ }
+ }
+ }
+ }
+
+ function toggleAllDocs() {
+ var toggle = document.getElementById("toggle-all-docs");
+ if (hasClass(toggle, "will-expand")) {
+ removeClass(toggle, "will-expand");
+ onEveryMatchingChild(toggle, "inner", function(e) {
+ e.innerHTML = labelForToggleButton(false);
+ });
+ toggle.title = "collapse all docs";
+ onEach(document.getElementsByClassName("docblock"), function(e) {
+ e.style.display = 'block';
+ });
+ onEach(document.getElementsByClassName("toggle-label"), function(e) {
+ e.style.display = 'none';
+ });
+ onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
+ removeClass(e, "collapsed");
+ });
+ onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
+ onEveryMatchingChild(e, "inner", function(i_e) {
+ i_e.innerHTML = labelForToggleButton(false);
+ });
+ });
+ } else {
+ addClass(toggle, "will-expand");
+ onEveryMatchingChild(toggle, "inner", function(e) {
+ e.innerHTML = labelForToggleButton(true);
+ });
+ toggle.title = "expand all docs";
+ onEach(document.getElementsByClassName("docblock"), function(e) {
+ e.style.display = 'none';
+ });
+ onEach(document.getElementsByClassName("toggle-label"), function(e) {
+ e.style.display = 'inline-block';
+ });
+ onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
+ addClass(e, "collapsed");
+ });
+ onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
+ onEveryMatchingChild(e, "inner", function(i_e) {
+ i_e.innerHTML = labelForToggleButton(true);
+ });
+ });
+ }
+ }
+
+ function collapseDocs(toggle) {
+ if (!toggle || !toggle.parentNode) {
+ return;
+ }
+ var relatedDoc = toggle.parentNode.nextElementSibling;
+ if (hasClass(relatedDoc, "stability")) {
+ relatedDoc = relatedDoc.nextElementSibling;
+ }
+ if (hasClass(relatedDoc, "docblock")) {
+ if (!isHidden(relatedDoc)) {
+ relatedDoc.style.display = 'none';
+ onEach(toggle.childNodes, function(e) {
+ if (hasClass(e, 'toggle-label')) {
+ e.style.display = 'inline-block';
+ }
+ if (hasClass(e, 'inner')) {
+ e.innerHTML = labelForToggleButton(true);
+ }
+ });
+ addClass(toggle.parentNode, 'collapsed');
+ } else {
+ relatedDoc.style.display = 'block';
+ removeClass(toggle.parentNode, 'collapsed');
+ onEach(toggle.childNodes, function(e) {
+ if (hasClass(e, 'toggle-label')) {
+ e.style.display = 'none';
+ }
+ if (hasClass(e, 'inner')) {
+ e.innerHTML = labelForToggleButton(false);
+ }
+ });
+ }
+ }
+ }
+
+ var x = document.getElementById('toggle-all-docs');
+ if (x) {
+ x.onclick = toggleAllDocs;
+ }
+
+ function insertAfter(newNode, referenceNode) {
+ referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
+ }
+
+ var toggle = document.createElement('a');
+ toggle.href = 'javascript:void(0)';
+ toggle.className = 'collapse-toggle';
+ toggle.innerHTML = "["+labelForToggleButton(false)+" ]";
+
+ var func = function(e) {
+ var next = e.nextElementSibling;
+ if (!next) {
+ return;
+ }
+ if (hasClass(next, 'docblock') ||
+ (hasClass(next, 'stability') &&
+ hasClass(next.nextElementSibling, 'docblock'))) {
+ insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
+ }
+ }
+ onEach(document.getElementsByClassName('method'), func);
+ onEach(document.getElementsByClassName('impl-items'), function(e) {
+ onEach(e.getElementsByClassName('associatedconstant'), func);
+ });
+
+ var span = document.createElement('span');
+ span.className = 'toggle-label';
+ span.style.display = 'none';
+ span.innerHTML = ' Expand description';
+
+ var mainToggle = toggle.cloneNode(true);
+ mainToggle.appendChild(span);
+
+ var wrapper = document.createElement('div');
+ wrapper.className = 'toggle-wrapper';
+ wrapper.appendChild(mainToggle);
+
+ onEach(document.getElementById('main').getElementsByClassName('docblock'), function(e) {
+ if (e.parentNode.id === "main") {
+ e.parentNode.insertBefore(wrapper, e);
+ }
+ });
+
+ onEach(document.getElementsByClassName('docblock'), function(e) {
+ if (hasClass(e, 'autohide')) {
+ var wrap = e.previousElementSibling;
+ if (wrap && hasClass(wrap, 'toggle-wrapper')) {
+ var toggle = wrap.childNodes[0];
+ if (e.childNodes[0].tagName === 'H3') {
+ onEach(toggle.getElementsByClassName('toggle-label'), function(i_e) {
+ i_e.innerHTML = " Show " + e.childNodes[0].innerHTML;
+ });
+ }
+ e.style.display = 'none';
+ addClass(wrap, 'collapsed');
+ onEach(toggle.getElementsByClassName('inner'), function(e) {
+ e.innerHTML = labelForToggleButton(true);
+ });
+ onEach(toggle.getElementsByClassName('toggle-label'), function(e) {
+ e.style.display = 'block';
+ });
+ }
+ }
+ })
+
+ var span = document.createElement('span');
+ span.className = 'toggle-label';
+ span.style.display = 'none';
+ span.innerHTML = ' Expand attributes';
+ toggle.appendChild(span);
+
+ var wrapper = document.createElement('div');
+ wrapper.className = 'toggle-wrapper toggle-attributes';
+ wrapper.appendChild(toggle);
+ onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
+ onEach(e.getElementsByClassName('attributes'), function(i_e) {
+ i_e.parentNode.insertBefore(wrapper, i_e);
+ collapseDocs(i_e.previousSibling.childNodes[0]);
+ });
+ });
+}());
+
+// Sets the focus on the search bar at the top of the page
+function focusSearchBar() {
+ document.getElementsByClassName('search-input')[0].focus();
+}
diff --git a/kawaii/kawaii-rs/doc/normalize.css b/kawaii/kawaii-rs/doc/normalize.css
new file mode 100644
index 0000000..2804c26
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/normalize.css
@@ -0,0 +1 @@
+/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}
diff --git a/kawaii/kawaii-rs/doc/rustdoc.css b/kawaii/kawaii-rs/doc/rustdoc.css
new file mode 100644
index 0000000..969cc4e
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/rustdoc.css
@@ -0,0 +1,775 @@
+/**
+ * Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+ * file at the top-level directory of this distribution and at
+ * http://rust-lang.org/COPYRIGHT.
+ *
+ * Licensed under the Apache License, Version 2.0 or the MIT license
+ * , at your
+ * option. This file may not be copied, modified, or distributed
+ * except according to those terms.
+ */
+
+/* See FiraSans-LICENSE.txt for the Fira Sans license. */
+@font-face {
+ font-family: 'Fira Sans';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Fira Sans'), url("FiraSans-Regular.woff") format('woff');
+}
+@font-face {
+ font-family: 'Fira Sans';
+ font-style: normal;
+ font-weight: 500;
+ src: local('Fira Sans Medium'), url("FiraSans-Medium.woff") format('woff');
+}
+
+/* See SourceSerifPro-LICENSE.txt for the Source Serif Pro license and
+ * Heuristica-LICENSE.txt for the Heuristica license. */
+@font-face {
+ font-family: 'Source Serif Pro';
+ font-style: normal;
+ font-weight: 400;
+ src: local('Source Serif Pro'), url("SourceSerifPro-Regular.woff") format('woff');
+}
+@font-face {
+ font-family: 'Source Serif Pro';
+ font-style: italic;
+ font-weight: 400;
+ src: url("Heuristica-Italic.woff") format('woff');
+}
+@font-face {
+ font-family: 'Source Serif Pro';
+ font-style: normal;
+ font-weight: 700;
+ src: local('Source Serif Pro Bold'), url("SourceSerifPro-Bold.woff") format('woff');
+}
+
+/* See SourceCodePro-LICENSE.txt for the Source Code Pro license. */
+@font-face {
+ font-family: 'Source Code Pro';
+ font-style: normal;
+ font-weight: 400;
+ /* Avoid using locally installed font because bad versions are in circulation:
+ * see https://github.com/rust-lang/rust/issues/24355 */
+ src: url("SourceCodePro-Regular.woff") format('woff');
+}
+@font-face {
+ font-family: 'Source Code Pro';
+ font-style: normal;
+ font-weight: 600;
+ src: url("SourceCodePro-Semibold.woff") format('woff');
+}
+
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+/* General structure and fonts */
+
+body {
+ font: 16px/1.4 "Source Serif Pro", Georgia, Times, "Times New Roman", serif;
+ margin: 0;
+ position: relative;
+ padding: 10px 15px 20px 15px;
+
+ -webkit-font-feature-settings: "kern", "liga";
+ -moz-font-feature-settings: "kern", "liga";
+ font-feature-settings: "kern", "liga";
+}
+
+h1 {
+ font-size: 1.5em;
+}
+h2 {
+ font-size: 1.4em;
+}
+h3 {
+ font-size: 1.3em;
+}
+h1, h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant) {
+ font-weight: 500;
+ margin: 20px 0 15px 0;
+ padding-bottom: 6px;
+}
+h1.fqn {
+ border-bottom: 1px dashed;
+ margin-top: 0;
+ position: relative;
+}
+h2, h3:not(.impl):not(.method):not(.type):not(.tymethod), h4:not(.method):not(.type):not(.tymethod):not(.associatedconstant) {
+ border-bottom: 1px solid;
+}
+h3.impl, h3.method, h4.method, h3.type, h4.type, h4.associatedconstant {
+ font-weight: 600;
+ margin-top: 10px;
+ margin-bottom: 10px;
+ position: relative;
+}
+h3.impl, h3.method, h3.type {
+ margin-top: 15px;
+}
+h1, h2, h3, h4, .sidebar, a.source, .search-input, .content table :not(code)>a, .collapse-toggle {
+ font-family: "Fira Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+ol, ul {
+ padding-left: 25px;
+}
+ul ul, ol ul, ul ol, ol ol {
+ margin-bottom: 0;
+}
+
+p {
+ margin: 0 0 .6em 0;
+}
+
+code, pre {
+ font-family: "Source Code Pro", Menlo, Monaco, Consolas, "DejaVu Sans Mono", Inconsolata, monospace;
+ white-space: pre-wrap;
+}
+.docblock code, .docblock-short code {
+ border-radius: 3px;
+ padding: 0 0.2em;
+}
+.docblock pre code, .docblock-short pre code {
+ padding: 0;
+}
+pre {
+ padding: 14px;
+}
+
+.source .content pre {
+ padding: 20px;
+}
+
+img {
+ max-width: 100%;
+}
+
+.source .content {
+ margin-top: 50px;
+ max-width: none;
+ overflow: visible;
+ margin-left: 0px;
+ min-width: 70em;
+}
+
+nav.sub {
+ font-size: 16px;
+ text-transform: uppercase;
+}
+
+.sidebar {
+ width: 200px;
+ position: absolute;
+ left: 0;
+ top: 0;
+ min-height: 100%;
+}
+
+.sidebar .current {
+ margin-right: -20px;
+}
+
+.content, nav { max-width: 960px; }
+
+/* Everything else */
+
+.js-only, .hidden { display: none !important; }
+
+.sidebar {
+ padding: 10px;
+}
+.sidebar img {
+ margin: 20px auto;
+ display: block;
+}
+
+.sidebar .location {
+ border: 1px solid;
+ font-size: 17px;
+ margin: 30px 0 20px 0;
+ text-align: center;
+ word-wrap: break-word;
+}
+
+.location:empty {
+ border: none;
+}
+
+.location a:first-child { font-weight: 500; }
+
+.block {
+ padding: 0 10px;
+ margin-bottom: 14px;
+}
+.block h2, .block h3 {
+ margin-top: 0;
+ margin-bottom: 8px;
+ text-align: center;
+}
+.block ul, .block li {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.block a {
+ display: block;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ line-height: 15px;
+ padding: 7px 5px;
+ font-size: 14px;
+ font-weight: 300;
+ transition: border 500ms ease-out;
+}
+
+.content {
+ padding: 15px 0;
+}
+
+.source .content pre.rust {
+ white-space: pre;
+ overflow: auto;
+ padding-left: 0;
+}
+#search {
+ margin-left: 230px;
+}
+.content pre.line-numbers {
+ float: left;
+ border: none;
+ position: relative;
+
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.line-numbers span { cursor: pointer; }
+
+.docblock-short p {
+ display: inline;
+}
+
+.docblock-short.nowrap {
+ display: block;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.docblock-short p {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ margin: 0;
+}
+.docblock-short code { white-space: nowrap; }
+
+.docblock h1, .docblock h2, .docblock h3, .docblock h4, .docblock h5 {
+ border-bottom: 1px solid;
+}
+
+.docblock h1 { font-size: 1.3em; }
+.docblock h2 { font-size: 1.15em; }
+.docblock h3, .docblock h4, .docblock h5 { font-size: 1em; }
+
+.docblock {
+ margin-left: 24px;
+}
+
+.content .out-of-band {
+ font-size: 23px;
+ margin: 0px;
+ padding: 0px;
+ text-align: right;
+ display: inline-block;
+ font-weight: normal;
+ position: absolute;
+ right: 0;
+}
+
+h3.impl > .out-of-band {
+ font-size: 21px;
+}
+
+h4 > code, h3 > code, .invisible > code {
+ position: inherit;
+}
+
+.in-band, code {
+ z-index: 5;
+}
+
+.invisible {
+ background: rgba(0, 0, 0, 0);
+ width: 100%;
+ display: inline-block;
+}
+
+.content .in-band {
+ margin: 0px;
+ padding: 0px;
+ display: inline-block;
+}
+
+#main { position: relative; }
+#main > .since {
+ top: inherit;
+ font-family: "Fira Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+.content table {
+ border-spacing: 0 5px;
+ border-collapse: separate;
+}
+.content td { vertical-align: top; }
+.content td:first-child { padding-right: 20px; }
+.content td p:first-child { margin-top: 0; }
+.content td h1, .content td h2 { margin-left: 0; font-size: 1.1em; }
+
+.docblock table {
+ border: 1px solid;
+ margin: .5em 0;
+ border-collapse: collapse;
+ width: 100%;
+}
+
+.docblock table td {
+ padding: .5em;
+ border-top: 1px dashed;
+ border-bottom: 1px dashed;
+}
+
+.docblock table th {
+ padding: .5em;
+ text-align: left;
+ border-top: 1px solid;
+ border-bottom: 1px solid;
+}
+
+.fields + table {
+ margin-bottom: 1em;
+}
+
+.content .item-list {
+ list-style-type: none;
+ padding: 0;
+}
+
+.content .item-list li { margin-bottom: 3px; }
+
+.content .multi-column {
+ -moz-column-count: 5;
+ -moz-column-gap: 2.5em;
+ -webkit-column-count: 5;
+ -webkit-column-gap: 2.5em;
+ column-count: 5;
+ column-gap: 2.5em;
+}
+.content .multi-column li { width: 100%; display: inline-block; }
+
+.content .method {
+ font-size: 1em;
+ position: relative;
+}
+/* Shift "where ..." part of method or fn definition down a line */
+.content .method .where,
+.content .fn .where,
+.content .where.fmt-newline {
+ display: block;
+ color: #4E4C4C;
+ font-size: 0.8em;
+}
+
+.content .methods > div { margin-left: 40px; }
+
+.content .impl-items .docblock, .content .impl-items .stability {
+ margin-left: 40px;
+}
+.content .impl-items .method, .content .impl-items > .type, .impl-items > .associatedconstant {
+ margin-left: 20px;
+}
+
+.content .stability code {
+ font-size: 90%;
+}
+
+nav {
+ border-bottom: 1px solid;
+ padding-bottom: 10px;
+ margin-bottom: 10px;
+}
+nav.main {
+ padding: 20px 0;
+ text-align: center;
+}
+nav.main .current {
+ border-top: 1px solid;
+ border-bottom: 1px solid;
+}
+nav.main .separator {
+ border: 1px solid;
+ display: inline-block;
+ height: 23px;
+ margin: 0 20px;
+}
+nav.sum { text-align: right; }
+nav.sub form { display: inline; }
+
+nav.sub, .content {
+ margin-left: 230px;
+}
+
+a {
+ text-decoration: none;
+ background: transparent;
+}
+
+.docblock a:hover, .docblock-short a:hover, .stability a {
+ text-decoration: underline;
+}
+
+.content span.enum, .content a.enum, .block a.current.enum { color: #5e9766; }
+.content span.struct, .content a.struct, .block a.current.struct { color: #df3600; }
+.content span.type, .content a.type, .block a.current.type { color: #e57300; }
+.content span.macro, .content a.macro, .block a.current.macro { color: #068000; }
+.block a.current.crate { font-weight: 500; }
+
+.search-input {
+ width: 100%;
+ /* Override Normalize.css: we have margins and do
+ not want to overflow - the `moz` attribute is necessary
+ until Firefox 29, too early to drop at this point */
+ -moz-box-sizing: border-box !important;
+ box-sizing: border-box !important;
+ outline: none;
+ border: none;
+ border-radius: 1px;
+ margin-top: 5px;
+ padding: 10px 16px;
+ font-size: 17px;
+ transition: border-color 300ms ease;
+ transition: border-radius 300ms ease-in-out;
+ transition: box-shadow 300ms ease-in-out;
+}
+
+.search-input:focus {
+ border-color: #66afe9;
+ border-radius: 2px;
+ border: 0;
+ outline: 0;
+ box-shadow: 0 0 8px #078dd8;
+}
+
+.search-results .desc {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ display: block;
+}
+
+.search-results a {
+ display: block;
+}
+
+.content .search-results td:first-child { padding-right: 0; }
+.content .search-results td:first-child a { padding-right: 10px; }
+
+tr.result span.primitive::after { content: ' (primitive type)'; font-style: italic; color: black;
+}
+
+body.blur > :not(#help) {
+ filter: blur(8px);
+ -webkit-filter: blur(8px);
+ opacity: .7;
+}
+
+#help {
+ width: 100%;
+ height: 100vh;
+ position: fixed;
+ top: 0;
+ left: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+#help > div {
+ flex: 0 0 auto;
+ box-shadow: 0 0 6px rgba(0,0,0,.2);
+ width: 550px;
+ height: 330px;
+ border: 1px solid;
+}
+#help dt {
+ float: left;
+ border-radius: 4px;
+ border: 1px solid;
+ width: 23px;
+ text-align: center;
+ clear: left;
+ display: block;
+ margin-top: -1px;
+}
+#help dd { margin: 5px 33px; }
+#help .infos { padding-left: 0; }
+#help h1, #help h2 { margin-top: 0; }
+#help > div div {
+ width: 50%;
+ float: left;
+ padding: 20px;
+}
+
+.stab {
+ display: table;
+ border-width: 1px;
+ border-style: solid;
+ padding: 3px;
+ margin-bottom: 5px;
+ font-size: 90%;
+}
+.stab p {
+ display: inline;
+}
+
+.stab summary {
+ display: list-item;
+}
+
+.stab .microscope {
+ font-size: 1.5em;
+}
+
+.module-item .stab {
+ display: inline;
+ border-width: 0;
+ padding: 0;
+ margin: 0;
+ background: inherit !important;
+}
+
+.module-item.unstable {
+ opacity: 0.65;
+}
+
+.since {
+ font-weight: normal;
+ font-size: initial;
+ position: absolute;
+ right: 0;
+ top: 0;
+}
+
+.variants_table {
+ width: 100%;
+}
+
+.variants_table tbody tr td:first-child {
+ width: 1%; /* make the variant name as small as possible */
+}
+
+td.summary-column {
+ width: 100%;
+}
+
+.summary {
+ padding-right: 0px;
+}
+
+pre.rust .question-mark {
+ font-weight: bold;
+}
+
+pre.rust { position: relative; }
+a.test-arrow {
+ display: inline-block;
+ position: absolute;
+ padding: 5px 10px 5px 10px;
+ border-radius: 5px;
+ font-size: 130%;
+ top: 5px;
+ right: 5px;
+}
+a.test-arrow:hover{
+ text-decoration: none;
+}
+
+.section-header:hover a:after {
+ content: '\2002\00a7\2002';
+}
+
+.section-header:hover a {
+ text-decoration: none;
+}
+
+.section-header a {
+ color: inherit;
+}
+
+.collapse-toggle {
+ font-weight: 300;
+ position: absolute;
+ left: -23px;
+ color: #999;
+ top: 0;
+}
+
+h3 > .collapse-toggle, h4 > .collapse-toggle {
+ font-size: 0.8em;
+ top: 5px;
+}
+
+.toggle-wrapper > .collapse-toggle {
+ left: -24px;
+ margin-top: 0px;
+}
+
+.toggle-wrapper {
+ position: relative;
+}
+
+.toggle-wrapper.collapsed {
+ height: 1em;
+ transition: height .2s;
+}
+
+.collapse-toggle > .inner {
+ display: inline-block;
+ width: 1.2ch;
+ text-align: center;
+}
+
+.ghost {
+ display: none;
+}
+
+.ghost + .since {
+ position: initial;
+ display: table-cell;
+}
+
+.since + .srclink {
+ display: table-cell;
+ padding-left: 10px;
+}
+
+span.since {
+ position: initial;
+ font-size: 20px;
+ margin-right: 5px;
+}
+
+.toggle-wrapper > .collapse-toggle {
+ left: 0;
+}
+
+.variant + .toggle-wrapper > a {
+ margin-top: 5px;
+}
+
+.sub-variant, .sub-variant > h3 {
+ margin-top: 0 !important;
+}
+
+.enum > .toggle-wrapper + .docblock, .struct > .toggle-wrapper + .docblock {
+ margin-left: 30px;
+ margin-bottom: 20px;
+ margin-top: 5px;
+}
+
+.enum > .collapsed, .struct > .collapsed {
+ margin-bottom: 25px;
+}
+
+.enum .variant, .struct .structfield {
+ display: block;
+}
+
+.attributes {
+ display: block;
+ margin: 0px 0px 0px 30px !important;
+}
+.toggle-attributes.collapsed {
+ margin-bottom: 5px;
+}
+
+:target > code {
+ opacity: 1;
+}
+
+/* Media Queries */
+
+@media (max-width: 700px) {
+ body {
+ padding-top: 0px;
+ }
+
+ .sidebar {
+ height: 40px;
+ min-height: 40px;
+ width: 100%;
+ margin: 0px;
+ padding: 0px;
+ position: static;
+ }
+
+ .sidebar .location {
+ float: right;
+ margin: 0px;
+ padding: 3px 10px 1px 10px;
+ min-height: 39px;
+ background: inherit;
+ text-align: left;
+ font-size: 24px;
+ }
+
+ .sidebar .location:empty {
+ padding: 0;
+ }
+
+ .sidebar img {
+ width: 35px;
+ margin-top: 5px;
+ margin-bottom: 0px;
+ float: left;
+ }
+
+ nav.sub {
+ margin: 0 auto;
+ }
+
+ .sidebar .block {
+ display: none;
+ }
+
+ .content {
+ margin-left: 0px;
+ }
+
+ .content .in-band {
+ width: 100%;
+ }
+
+ .content .out-of-band {
+ display: none;
+ }
+
+ .toggle-wrapper > .collapse-toggle {
+ left: 0px;
+ }
+
+ .toggle-wrapper {
+ height: 1.5em;
+ }
+}
+
+@media print {
+ nav.sub, .content .out-of-band, .collapse-toggle {
+ display: none;
+ }
+}
diff --git a/kawaii/kawaii-rs/doc/search-index.js b/kawaii/kawaii-rs/doc/search-index.js
new file mode 100644
index 0000000..06dbe7d
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/search-index.js
@@ -0,0 +1,6 @@
+var searchIndex = {};
+searchIndex["emergency_stop"] = {"doc":"","items":[[3,"EmergencyStop","emergency_stop","",null,null],[12,"state","","",0,null],[11,"fmt","","",0,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"new","","Constructs a new `EmergencyStop` and starts poll thread.",0,{"inputs":[{"name":"u8"}],"output":{"name":"result"}}],[11,"drop","","Set emergency stop and join poll thread.",0,{"inputs":[{"name":"self"}],"output":null}]],"paths":[[3,"EmergencyStop"]]};
+searchIndex["kawaii"] = {"doc":"","items":[[3,"Measure","kawaii","",null,null],[12,"min","","",0,null],[12,"max","","",0,null],[12,"name","","",0,null],[0,"gpio","","",null,null],[3,"Port","kawaii::gpio","",null,null],[12,"number","","",1,null],[12,"direction","","",1,null],[3,"SyncPort","","",null,null],[12,"port","","",2,null],[3,"AsyncPort","","",null,null],[12,"port","","",3,null],[12,"edge","","",3,null],[4,"Direction","","",null,null],[13,"Out","","",4,null],[13,"In","","",4,null],[4,"Edge","","",null,null],[13,"None","","",5,null],[13,"Rising","","",5,null],[13,"Falling","","",5,null],[13,"Both","","",5,null],[4,"Value","","",null,null],[13,"High","","",6,null],[13,"Low","","",6,null],[11,"clone","","",4,{"inputs":[{"name":"self"}],"output":{"name":"direction"}}],[11,"fmt","","",4,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"from_str","","",4,{"inputs":[{"name":"str"}],"output":{"name":"option"}}],[11,"as_str","","",4,{"inputs":[{"name":"self"}],"output":{"name":"str"}}],[11,"clone","","",5,{"inputs":[{"name":"self"}],"output":{"name":"edge"}}],[11,"fmt","","",5,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"from_str","","",5,{"inputs":[{"name":"str"}],"output":{"name":"option"}}],[11,"as_str","","",5,{"inputs":[{"name":"self"}],"output":{"name":"str"}}],[11,"clone","","",6,{"inputs":[{"name":"self"}],"output":{"name":"value"}}],[11,"fmt","","",6,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"from_str","","",6,{"inputs":[{"name":"str"}],"output":{"name":"option"}}],[11,"from_buffer","","",6,null],[11,"from_char","","",6,{"inputs":[{"name":"u8"}],"output":{"name":"option"}}],[11,"as_str","","",6,{"inputs":[{"name":"self"}],"output":{"name":"str"}}],[11,"fmt","","",1,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"fmt","","",2,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"fmt","","",3,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"new","","Constructs a new GPIO `Port`.",1,{"inputs":[{"name":"u8"},{"name":"direction"}],"output":{"name":"result"}}],[11,"drop","","Drop GPIO `Port`: unexport",1,{"inputs":[{"name":"self"}],"output":null}],[11,"new","","Constructs a new synchronised GPIO `Port`.",2,{"inputs":[{"name":"u8"},{"name":"direction"}],"output":{"name":"result"}}],[11,"read","","Read from GPIO `SyncPort` sysfs file",2,{"inputs":[{"name":"self"}],"output":{"name":"result"}}],[11,"write","","Write to GPIO `SyncPort` sysfs file",2,{"inputs":[{"name":"self"},{"name":"value"}],"output":{"name":"result"}}],[11,"new","","Constructs a new asynchronous GPIO `Port`.",3,{"inputs":[{"name":"u8"},{"name":"edge"}],"output":{"name":"result"}}],[11,"poll","","Read asynchronous from GPIO `AsyncPort` sysfs file",3,{"inputs":[{"name":"self"},{"name":"option"}],"output":{"name":"result"}}],[11,"poll_measure","","Read asynchronous from GPIO `AsyncPort` sysfs file with measure support (ignore poll time)",3,{"inputs":[{"name":"self"},{"name":"option"},{"name":"measure"}],"output":{"name":"result"}}],[11,"fmt","kawaii","",0,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"new","","Constructs a new `Measure`.",0,{"inputs":[{"name":"string"}],"output":{"name":"self"}}],[11,"start","","Start measurement",0,{"inputs":[{"name":"self"}],"output":null}],[11,"pause","","Pause measurement",0,{"inputs":[{"name":"self"}],"output":null}],[11,"stop","","Stop measurement and calculate time difference",0,{"inputs":[{"name":"self"}],"output":null}],[11,"drop","","Print measure results and write times to file",0,{"inputs":[{"name":"self"}],"output":null}]],"paths":[[3,"Measure"],[3,"Port"],[3,"SyncPort"],[3,"AsyncPort"],[4,"Direction"],[4,"Edge"],[4,"Value"]]};
+searchIndex["kawaii_api"] = {"doc":"","items":[[5,"emergency_stop_init","kawaii_api","Constructs a new `EmergencyStop` on heap and returns pointer.",null,null],[5,"emergency_stop_clean","","Drops a `EmergencyStop` pointer on heap.",null,null],[5,"emergency_stop_get_state","","Returns `EmergencyStop` pointer state.",null,null],[5,"ultrasonic_init","","Constructs a new `Ultrasonic` on heap and returns pointer.",null,null],[5,"ultrasonic_clean","","Drops a `Ultrasonic` pointer on heap.",null,null],[5,"ultrasonic_get_distance","","Returns `Ultrasonic` pointer distance.",null,null],[5,"measure_init","","Constructs a new `Measure` on heap and returns pointer.",null,null],[5,"measure_clean","","Drops a `Measure` pointer on heap.",null,null],[5,"measure_start","","Starts measure on `Measure` pointer.",null,null],[5,"measure_pause","","Pause measure on `Measure` pointer.",null,null],[5,"measure_stop","","Stop measure on `Measure` pointer.",null,null]],"paths":[]};
+searchIndex["ultrasonic_irq"] = {"doc":"","items":[[3,"UltrasonicEcho","ultrasonic_irq","",null,null],[3,"UltrasonicTrigger","","",null,null],[3,"Ultrasonic","","",null,null],[12,"distance","","",0,null],[11,"fmt","","",1,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"fmt","","",2,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"fmt","","",0,{"inputs":[{"name":"self"},{"name":"formatter"}],"output":{"name":"result"}}],[11,"new","","Constructs a new `Ultrasonic` and start threads.",0,{"inputs":[{"name":"u8"},{"name":"u8"},{"name":"u8"}],"output":{"name":"result"}}],[11,"drop","","Drop sync channels and join threads.",0,{"inputs":[{"name":"self"}],"output":null}]],"paths":[[3,"Ultrasonic"],[3,"UltrasonicEcho"],[3,"UltrasonicTrigger"]]};
+initSearch(searchIndex);
diff --git a/kawaii/kawaii-rs/doc/src/emergency_stop/lib.rs.html b/kawaii/kawaii-rs/doc/src/emergency_stop/lib.rs.html
new file mode 100644
index 0000000..deefd79
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/emergency_stop/lib.rs.html
@@ -0,0 +1,312 @@
+
+
+
+
+
+
+
+
+
+ lib.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+
+extern crate kawaii ;
+
+use std ::time ::Duration ;
+use std ::thread ;
+use std ::thread ::JoinHandle ;
+use std ::sync ::Arc ;
+use std ::sync ::atomic ::{AtomicBool , Ordering };
+
+use self ::kawaii ::gpio ::{AsyncPort , Edge , Value };
+
+#[cfg (feature = "measure" )]
+use self ::kawaii ::Measure ;
+
+#[derive (Debug )]
+pub struct EmergencyStop {
+ thread : Option < JoinHandle < ()>> ,
+ pub state : Arc < AtomicBool > ,
+}
+
+impl EmergencyStop {
+
+
+
+
+ pub fn new (stop_port : u8 ) -> std ::io ::Result < Self > {
+ let name = format ! ("EmergencyStop(port = {})" , stop_port );
+ let state = Arc ::new (AtomicBool ::new (false ));
+ let mut port = AsyncPort ::new (stop_port , Edge ::Both )? ;
+
+ let state_clone = state .clone ();
+ let thread = thread ::Builder ::new ()
+ .name (name )
+ .spawn (move || EmergencyStop ::thread (& mut port , state_clone ))? ;
+
+ Ok (EmergencyStop {
+ thread : Some (thread ),
+ state : state ,
+ })
+ }
+
+
+ fn thread (port : & mut AsyncPort , state : Arc < AtomicBool > ) {
+ #[cfg (feature = "measure" )]
+ let mut measure = Measure ::new (format ! ("EmergencyStop(port = {})" , port .port .number ));
+
+
+ port .poll (Some (Duration ::new (0 , 0 ))).is_ok ();
+
+ while ! state .load (Ordering ::Relaxed ) {
+ #[cfg (feature = "measure" )]
+ measure .start ();
+
+ let timeout = Some (Duration ::new (1 , 0 ));
+
+ #[cfg (not (feature = "measure" ))]
+ let value = port .poll (timeout );
+
+ #[cfg (feature = "measure" )]
+ let value = port .poll_measure (timeout , & mut measure );
+
+
+ match value {
+ Ok (value ) => {
+ if let Some (value ) = value {
+ match value {
+ Value ::High => {
+ #[cfg (debug_assertions )]
+ println ! ("EmergencyStop! ({:?})" , value );
+
+ state .store (true , Ordering ::Relaxed );
+ }
+ _ => {
+ #[cfg (debug_assertions )]
+ println ! ("EmergencyStop ignored: ({:?})" , value );
+ }
+ }
+ }
+ }
+ Err (e ) => {
+ #[cfg (debug_assertions )]
+ println ! ("EmergencyStop! ({:?})" , e );
+
+ state .store (true , Ordering ::Relaxed );
+ }
+ }
+
+ #[cfg (feature = "measure" )]
+ measure .stop ();
+ }
+ }
+}
+
+impl Drop for EmergencyStop {
+
+ fn drop (& mut self ) {
+ self .state .store (true , Ordering ::Relaxed );
+
+ if let Some (thread ) = self .thread .take () {
+ thread .join ().is_ok ();
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii/gpio.rs.html b/kawaii/kawaii-rs/doc/src/kawaii/gpio.rs.html
new file mode 100644
index 0000000..f95234b
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii/gpio.rs.html
@@ -0,0 +1,748 @@
+
+
+
+
+
+
+
+
+
+ gpio.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+
+extern crate std ;
+extern crate nix ;
+
+use std ::fmt ;
+use std ::time ::Duration ;
+use std ::io ::prelude ::* ;
+use std ::io ::{Error , ErrorKind , SeekFrom };
+use std ::fs ::File ;
+use std ::path ::Path ;
+
+use std ::os ::unix ::io ::RawFd ;
+
+#[cfg (feature = "measure" )]
+use measure ::Measure ;
+
+fn duration_to_ms (duration : Duration ) -> u64 {
+ duration .as_secs () * 1_000u64 + duration .subsec_nanos () as u64 / 1_000_000u64
+}
+
+#[derive (Clone , Copy , Debug )]
+pub enum Direction {
+ Out ,
+ In ,
+}
+impl Direction {
+ pub fn from_str (s : & str ) -> Option < Direction > {
+ match s {
+ "out" => Some (Direction ::Out ),
+ "in" => Some (Direction ::In ),
+ _ => None ,
+ }
+ }
+
+ pub fn as_str (& self ) -> & 'static str {
+ match * self {
+ Direction ::Out => "out" ,
+ Direction ::In => "in" ,
+ }
+ }
+}
+
+#[derive (Clone , Copy , Debug )]
+pub enum Edge {
+ None ,
+ Rising ,
+ Falling ,
+ Both ,
+}
+impl Edge {
+ pub fn from_str (s : & str ) -> Option < Edge > {
+ match s {
+ "none" => Some (Edge ::None ),
+ "rising" => Some (Edge ::Rising ),
+ "falling" => Some (Edge ::Falling ),
+ "both" => Some (Edge ::Both ),
+ _ => None ,
+ }
+ }
+
+ pub fn as_str (& self ) -> & 'static str {
+ match * self {
+ Edge ::None => "none" ,
+ Edge ::Rising => "rising" ,
+ Edge ::Falling => "falling" ,
+ Edge ::Both => "both" ,
+ }
+ }
+}
+
+#[derive (Clone , Copy , Debug )]
+pub enum Value {
+ High ,
+ Low ,
+}
+impl Value {
+ pub fn from_str (s : & str ) -> Option < Value > {
+ match s {
+ "1" => Some (Value ::High ),
+ "0" => Some (Value ::Low ),
+ _ => None ,
+ }
+ }
+
+ pub fn from_buffer (b : & [u8 ; 1 ]) -> Option < Self > {
+ Value ::from_char (b [0 ])
+ }
+
+ pub fn from_char (c : u8 ) -> Option < Self > {
+ match c {
+ 48 => Some (Value ::Low ),
+ 49 => Some (Value ::High ),
+ _ => None ,
+ }
+ }
+
+ pub fn as_str (& self ) -> & 'static str {
+ match * self {
+ Value ::High => "1" ,
+ Value ::Low => "0" ,
+ }
+ }
+}
+
+#[derive (Debug )]
+pub struct Port {
+ pub number : u8 ,
+ pub direction : Direction ,
+}
+
+#[derive (Debug )]
+pub struct SyncPort {
+ pub port : Port ,
+ file : File ,
+ buffer : [u8 ; 1 ],
+}
+pub struct AsyncPort {
+ pub port : Port ,
+ pub edge : Edge ,
+ file : RawFd ,
+ fds : [nix ::poll ::PollFd ; 1 ],
+ buffer : [u8 ; 1 ],
+}
+
+impl fmt ::Debug for AsyncPort {
+ fn fmt (& self , f : & mut fmt ::Formatter ) -> fmt ::Result {
+ write ! (f ,
+ "AsyncPort {{ port: {:?}, edge: {:?}, file: {:?}, fds: [?], buffer: {:?} }}" ,
+ self .port ,
+ self .edge ,
+ self .file ,
+ self .buffer )
+ }
+}
+
+impl Port {
+
+
+
+
+
+ pub fn new (number : u8 , direction : Direction ) -> std ::io ::Result < Port > {
+ let port = Port {
+ number : number ,
+ direction : direction ,
+ };
+
+ port .init ()? ;
+ Ok (port )
+ }
+
+
+ fn init (& self ) -> std ::io ::Result < ()> {
+ self .export ().ok ();
+ self .set_direction ()? ;
+
+ Ok (())
+ }
+
+
+ pub fn drop (& mut self ) {
+ self .unexport ().ok ();
+ }
+
+ fn write_path (path : & str , value : & str ) -> std ::io ::Result < ()> {
+ File ::create (Path ::new (path ))?
+ .write_all (value .as_bytes ())
+ }
+
+
+
+ fn export (& self ) -> std ::io ::Result < ()> {
+ Port ::write_path ("/sys/class/gpio/export" , self .number .to_string ().as_str ())
+ }
+
+ fn unexport (& self ) -> std ::io ::Result < ()> {
+ Port ::write_path ("/sys/class/gpio/unexport" , self .number .to_string ().as_str ())
+ }
+
+
+ fn set_direction (& self ) -> std ::io ::Result < ()> {
+ Port ::write_path (format ! ("/sys/class/gpio/gpio{}/direction" , self .number ).as_str (),
+ self .direction .as_str ())
+ }
+}
+
+impl SyncPort {
+
+
+
+
+
+ pub fn new (number : u8 , direction : Direction ) -> std ::io ::Result < SyncPort > {
+ Ok (SyncPort {
+ port : Port ::new (number , direction )? ,
+ file : SyncPort ::open (number , direction )? ,
+ buffer : [0 ; 1 ],
+ })
+ }
+
+
+ fn open (number : u8 , direction : Direction ) -> std ::io ::Result < File > {
+ let path = format ! ("/sys/class/gpio/gpio{}/value" , number );
+ let path = Path ::new (path .as_str ());
+
+ Ok (match direction {
+ Direction ::Out => File ::create (path )? ,
+ Direction ::In => File ::open (path )? ,
+ })
+ }
+
+
+ pub fn read (& mut self ) -> std ::io ::Result < Value > {
+ self .file .seek (SeekFrom ::Start (0 ))? ;
+ self .file .read_exact (& mut self .buffer )? ;
+
+ Value ::from_buffer (& self .buffer ).ok_or (Error ::new (ErrorKind ::InvalidData ,
+ "Unrecognized GPIO Value" ))
+ }
+
+
+ pub fn write (& mut self , value : Value ) -> std ::io ::Result < ()> {
+ self .file .write_all (value .as_str ().as_bytes ())
+ }
+}
+
+impl AsyncPort {
+
+
+
+
+
+ pub fn new (number : u8 , edge : Edge ) -> std ::io ::Result < AsyncPort > {
+ let port = Port ::new (number , Direction ::In )? ;
+ let file = AsyncPort ::open (number )? ;
+ let port = AsyncPort {
+ port : port ,
+ edge : edge ,
+ file : file ,
+ fds : [nix ::poll ::PollFd ::new (file , nix ::poll ::POLLPRI , nix ::poll ::EventFlags ::empty ())],
+ buffer : [0 ; 1 ],
+ };
+
+ port .init ()? ;
+ Ok (port )
+ }
+
+
+ fn init (& self ) -> std ::io ::Result < ()> {
+ self .set_edge ()? ;
+
+ Ok (())
+ }
+
+
+ fn open (number : u8 ) -> std ::io ::Result < RawFd > {
+ nix ::fcntl ::open (format ! ("/sys/class/gpio/gpio{}/value" , number ).as_str (),
+ nix ::fcntl ::O_RDONLY ,
+ nix ::sys ::stat ::Mode ::empty ())
+ .or (Err (Error ::new (ErrorKind ::Other , "open failed" )))
+ }
+
+ fn get_timeout (timeout : Option < Duration > ) -> i32 {
+ match timeout {
+ None => - 1 ,
+ Some (t ) => duration_to_ms (t ) as i32 ,
+ }
+ }
+
+
+ fn nix_poll (& mut self , timeout : i32 ) -> nix ::Result < i32 > {
+ nix ::poll ::poll (& mut self .fds , timeout )
+ }
+
+
+ fn poll_read (& mut self , poll : nix ::Result < i32 > ) -> std ::io ::Result < Option < Value >> {
+ let poll = poll .or (Err (Error ::new (ErrorKind ::Other , "poll failed" )))? ;
+
+ if poll == 0 {
+ return Ok (None );
+ }
+
+ nix ::unistd ::lseek (self .file , 0 , nix ::unistd ::Whence ::SeekSet )
+ .or (Err (Error ::new (ErrorKind ::Other , "lseek failed" )))? ;
+
+ nix ::unistd ::read (self .file , & mut self .buffer )
+ .or (Err (Error ::new (ErrorKind ::Other , "read failed" )))? ;
+
+ Value ::from_buffer (& self .buffer ).map_or (Err (Error ::new (ErrorKind ::InvalidData ,
+ "Unrecognized GPIO Value" )),
+ | v | Ok (Some (v )))
+ }
+
+
+ pub fn poll (& mut self , timeout : Option < Duration > ) -> std ::io ::Result < Option < Value >> {
+ let poll = self .nix_poll (Self ::get_timeout (timeout ));
+
+ self .poll_read (poll )
+ }
+
+
+ #[cfg (feature = "measure" )]
+ pub fn poll_measure (& mut self ,
+ timeout : Option < Duration > ,
+ measure : & mut Measure )
+ -> std ::io ::Result < Option < Value >> {
+ let timeout = Self ::get_timeout (timeout );
+
+ measure .pause ();
+ let poll = self .nix_poll (timeout );
+ measure .start ();
+
+ self .poll_read (poll )
+ }
+
+
+ fn set_edge (& self ) -> std ::io ::Result < ()> {
+ Port ::write_path (format ! ("/sys/class/gpio/gpio{}/edge" , self .port .number ).as_str (),
+ self .edge .as_str ())
+ }
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii/lib.rs.html b/kawaii/kawaii-rs/doc/src/kawaii/lib.rs.html
new file mode 100644
index 0000000..1870b88
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii/lib.rs.html
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+ lib.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+2
+3
+4
+5
+6
+7
+
+pub mod gpio ;
+
+#[cfg (feature = "measure" )]
+mod measure ;
+
+#[cfg (feature = "measure" )]
+pub use measure ::Measure ;
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii/measure.rs.html b/kawaii/kawaii-rs/doc/src/kawaii/measure.rs.html
new file mode 100644
index 0000000..be8d40a
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii/measure.rs.html
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+
+
+ measure.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+
+extern crate regex ;
+extern crate separator ;
+extern crate time ;
+
+use std ;
+use std ::fs ::File ;
+use std ::io ::prelude ::* ;
+use std ::io ::{Error , ErrorKind };
+
+use self ::regex ::Regex ;
+use self ::separator ::Separatable ;
+use self ::time ::precise_time_ns ;
+
+#[derive (Debug )]
+pub struct Measure {
+ pub min : u64 ,
+ pub max : u64 ,
+ time : u64 ,
+ last : u64 ,
+ data : Vec < u64 > ,
+ pub name : String ,
+}
+
+impl Measure {
+
+
+
+
+ pub fn new (name : String ) -> Self {
+ Measure {
+ min : u64 ::max_value (),
+ max : 0u64 ,
+ time : 0u64 ,
+ last : 0u64 ,
+ data : Vec ::with_capacity (1_000_000 ),
+ name : name ,
+ }
+ }
+
+
+ pub fn start (& mut self ) {
+ self .last = precise_time_ns ();
+ }
+
+
+ pub fn pause (& mut self ) {
+ if self .last == 0 {
+ #[cfg (debug_assertions )]
+ println ! ("WARNING: {:?} pause called without start!" , self );
+
+ return ;
+ }
+
+ self .time += self .time_diff ();
+ }
+
+
+ pub fn stop (& mut self ) {
+ if self .last == 0 {
+ #[cfg (debug_assertions )]
+ println ! ("WARNING: {:?} stop called without start!" , self );
+
+ return ;
+ }
+
+ self .time += self .time_diff ();
+ self .data .push (self .time );
+
+ if self .time < self .min {
+ self .min = self .time ;
+ }
+
+ if self .time > self .max {
+ self .max = self .time ;
+ }
+
+ self .time = 0u64 ;
+ self .last = 0u64 ;
+ }
+
+ fn time_diff (& mut self ) -> u64 {
+ let current_time = precise_time_ns ();
+ let time_diff = current_time - self .last ;
+ self .last = current_time ;
+
+ time_diff
+ }
+
+ fn write_data (& self ) -> std ::io ::Result < ()> {
+ let re = Regex ::new (r"[^\w\-.]" )
+ .or (Err (Error ::new (ErrorKind ::Other , "Create filename regex failed." )))? ;
+
+ let file_name = format ! ("measure_{}.txt" , self .name );
+ let file_name = re .replace_all (file_name .as_str (), "_" ).to_string ();
+ println ! ("{}: Write data to {}" , self .name , file_name );
+
+ let mut file = File ::create (file_name )? ;
+
+ for value in & self .data {
+ file .write_fmt (format_args ! ("{}\n" , value ))? ;
+ }
+
+ Ok (())
+ }
+}
+
+impl Drop for Measure {
+
+ fn drop (& mut self ) {
+ println ! ("{}:\n\tmin: {} ns\n\tmax: {} ns" ,
+ self .name ,
+ self .min .separated_string (),
+ self .max .separated_string ());
+
+ if let Err (e ) = self .write_data () {
+ println ! ("{}: Write measure data failed: {}" , self .name , e );
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii_api/emergency_stop.rs.html b/kawaii/kawaii-rs/doc/src/kawaii_api/emergency_stop.rs.html
new file mode 100644
index 0000000..90a577a
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii_api/emergency_stop.rs.html
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+ emergency_stop.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
+extern crate emergency_stop ;
+
+use self ::emergency_stop ::EmergencyStop ;
+
+use std ::mem ::transmute ;
+use std ::ptr ::null_mut ;
+use std ::sync ::atomic ::Ordering ;
+
+
+#[no_mangle ]
+pub extern "C" fn emergency_stop_init (stop : u8 ) -> * mut EmergencyStop {
+ match EmergencyStop ::new (stop ) {
+ Err (_) => null_mut (),
+ Ok (emergency_stop ) => unsafe { transmute (Box ::new (emergency_stop )) },
+ }
+}
+
+
+#[no_mangle ]
+pub extern "C" fn emergency_stop_clean (emergency_stop : * mut EmergencyStop ) {
+ let _emergency_stop : Box < EmergencyStop > = unsafe { transmute (emergency_stop ) };
+}
+
+
+#[no_mangle ]
+pub extern "C" fn emergency_stop_get_state (emergency_stop : * mut EmergencyStop ) -> bool {
+ let emergency_stop = unsafe { & mut * emergency_stop };
+
+ emergency_stop .state .load (Ordering ::Relaxed )
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii_api/lib.rs.html b/kawaii/kawaii-rs/doc/src/kawaii_api/lib.rs.html
new file mode 100644
index 0000000..71cbdd8
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii_api/lib.rs.html
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+ lib.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+
+#! [feature (integer_atomics )]
+
+mod emergency_stop ;
+mod ultrasonic_irq ;
+
+#[cfg (feature = "measure" )]
+mod measure ;
+
+pub use emergency_stop ::* ;
+pub use ultrasonic_irq ::* ;
+
+#[cfg (feature = "measure" )]
+pub use measure ::* ;
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii_api/measure.rs.html b/kawaii/kawaii-rs/doc/src/kawaii_api/measure.rs.html
new file mode 100644
index 0000000..63b4672
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii_api/measure.rs.html
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+ measure.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+
+extern crate kawaii ;
+
+use self ::kawaii ::Measure ;
+
+use std ::ffi ::CStr ;
+use std ::ptr ::null_mut ;
+use std ::mem ::transmute ;
+use std ::os ::raw ::c_char ;
+
+
+#[no_mangle ]
+pub extern "C" fn measure_init (name : * const c_char ) -> * mut Measure {
+ if name .is_null () {
+ return null_mut ();
+ }
+
+ unsafe {
+ match CStr ::from_ptr (name ).to_str () {
+ Err (_) => null_mut (),
+ Ok (name ) => transmute (Box ::new (Measure ::new (String ::from (name )))),
+ }
+ }
+}
+
+
+#[no_mangle ]
+pub extern "C" fn measure_clean (measure : * mut Measure ) {
+ let _measure : Box < Measure > = unsafe { transmute (measure ) };
+}
+
+
+#[no_mangle ]
+pub extern "C" fn measure_start (measure : * mut Measure ) {
+ let measure = unsafe { & mut * measure };
+
+ measure .start ();
+}
+
+
+#[no_mangle ]
+pub extern "C" fn measure_pause (measure : * mut Measure ) {
+ let measure = unsafe { & mut * measure };
+
+ measure .pause ();
+}
+
+
+#[no_mangle ]
+pub extern "C" fn measure_stop (measure : * mut Measure ) {
+ let measure = unsafe { & mut * measure };
+
+ measure .stop ();
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/kawaii_api/ultrasonic_irq.rs.html b/kawaii/kawaii-rs/doc/src/kawaii_api/ultrasonic_irq.rs.html
new file mode 100644
index 0000000..2e5aac6
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/kawaii_api/ultrasonic_irq.rs.html
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+ ultrasonic_irq.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+
+extern crate ultrasonic_irq ;
+
+use std ::mem ::transmute ;
+use std ::ptr ::null_mut ;
+use std ::sync ::atomic ::Ordering ;
+
+use self ::ultrasonic_irq ::Ultrasonic ;
+
+
+#[no_mangle ]
+pub extern "C" fn ultrasonic_init (trigger : u8 , echo : u8 , temperature : u8 ) -> * mut Ultrasonic {
+ match Ultrasonic ::new (trigger , echo , temperature ) {
+ Err (_) => null_mut (),
+ Ok (ultrasonic ) => unsafe { transmute (Box ::new (ultrasonic )) },
+ }
+}
+
+
+#[no_mangle ]
+pub extern "C" fn ultrasonic_clean (ultrasonic : * mut Ultrasonic ) {
+ let _ultrasonic : Box < Ultrasonic > = unsafe { transmute (ultrasonic ) };
+}
+
+
+#[no_mangle ]
+pub extern "C" fn ultrasonic_get_distance (ultrasonic : * mut Ultrasonic ) -> u32 {
+ let ultrasonic = unsafe { & mut * ultrasonic };
+
+ ultrasonic .distance .load (Ordering ::Relaxed )
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/src/ultrasonic_irq/lib.rs.html b/kawaii/kawaii-rs/doc/src/ultrasonic_irq/lib.rs.html
new file mode 100644
index 0000000..ee9a0fa
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/src/ultrasonic_irq/lib.rs.html
@@ -0,0 +1,532 @@
+
+
+
+
+
+
+
+
+
+ lib.rs.html -- source
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+
+#! [feature (integer_atomics )]
+
+extern crate time ;
+extern crate shuteye ;
+extern crate kawaii ;
+
+use std ::time ::Duration ;
+use std ::thread ;
+use std ::thread ::JoinHandle ;
+use std ::sync ::mpsc ::{Sender , Receiver };
+use std ::sync ::mpsc ;
+use std ::sync ::Arc ;
+use std ::sync ::atomic ::{AtomicU32 , Ordering };
+
+use self ::kawaii ::gpio ::{SyncPort , AsyncPort , Direction , Edge , Value };
+
+#[cfg (feature = "measure" )]
+use self ::kawaii ::Measure ;
+
+use self ::time ::precise_time_ns ;
+use self ::shuteye ::sleep ;
+
+#[derive (Debug )]
+struct ThreadData < T > {
+ thread : JoinHandle < T > ,
+ tx : Sender < ()> ,
+}
+
+#[derive (Debug )]
+pub struct UltrasonicEcho {
+ echo : AsyncPort ,
+ temperature : u8 ,
+ timestamp : u64 ,
+ distance : Arc < AtomicU32 > ,
+}
+
+#[derive (Debug )]
+pub struct UltrasonicTrigger {
+ trigger : SyncPort ,
+}
+
+#[derive (Debug )]
+pub struct Ultrasonic {
+ trigger : Option < ThreadData < ()>> ,
+ echo : Option < ThreadData < ()>> ,
+ pub distance : Arc < AtomicU32 > ,
+}
+
+impl Ultrasonic {
+
+
+
+
+
+
+
+
+
+
+ pub fn new (trigger_port : u8 , echo_port : u8 , temperature : u8 ) -> std ::io ::Result < Ultrasonic > {
+ let distance = Arc ::new (AtomicU32 ::new (u32 ::max_value ()));
+
+
+ let echo = UltrasonicEcho {
+ echo : AsyncPort ::new (echo_port , Edge ::Both )? ,
+ temperature : temperature ,
+ timestamp : 0 ,
+ distance : distance .clone (),
+ };
+ let (tx , rx ): (Sender < ()> , Receiver < ()> ) = mpsc ::channel ();
+ let name = format ! ("Ultrasonic::echo(port = {})" , echo_port );
+ let echo = ThreadData ::< ()> {
+ thread : thread ::Builder ::new ()
+ .name (name )
+ .spawn (move || echo .thread (rx ))? ,
+ tx : tx ,
+ };
+
+
+ let trigger = UltrasonicTrigger { trigger : SyncPort ::new (trigger_port , Direction ::Out )? };
+ let (tx , rx ): (Sender < ()> , Receiver < ()> ) = mpsc ::channel ();
+ let name = format ! ("Ultrasonic::trigger(port = {})" , trigger_port );
+ let trigger = ThreadData ::< ()> {
+ thread : thread ::Builder ::new ()
+ .name (name )
+ .spawn (move || trigger .thread (rx ))? ,
+ tx : tx ,
+ };
+
+ Ok (Ultrasonic {
+ trigger : Some (trigger ),
+ echo : Some (echo ),
+ distance : distance ,
+ })
+ }
+}
+
+impl Drop for Ultrasonic {
+
+ fn drop (& mut self ) {
+ if let Some (echo ) = self .echo .take () {
+ echo .tx .send (()).is_ok ();
+ echo .thread .join ().is_ok ();
+ }
+
+ if let Some (trigger ) = self .trigger .take () {
+ trigger .tx .send (()).is_ok ();
+ trigger .thread .join ().is_ok ();
+ }
+ }
+}
+
+impl UltrasonicTrigger {
+
+ fn thread (mut self , stop_rx : Receiver < ()> ) {
+ #[cfg (feature = "measure" )]
+ let mut measure = Measure ::new (format ! ("Ultrasonic::trigger(port = {})" , self .trigger .port .number ));
+
+ while stop_rx .try_recv ().is_err () {
+ #[cfg (feature = "measure" )]
+ measure .start ();
+ self .trigger .write (Value ::Low ).is_ok ();
+ #[cfg (feature = "measure" )]
+ measure .pause ();
+
+
+ sleep (Duration ::new (0 , 10_000 ));
+
+ #[cfg (feature = "measure" )]
+ measure .start ();
+ self .trigger .write (Value ::High ).is_ok ();
+ #[cfg (feature = "measure" )]
+ measure .stop ();
+
+
+ sleep (Duration ::new (0 , 20_000_000 ));
+ }
+ }
+}
+
+impl UltrasonicEcho {
+
+ fn thread (mut self , stop_rx : Receiver < ()> ) {
+ #[cfg (feature = "measure" )]
+ let mut measure = Measure ::new (format ! ("Ultrasonic::echo(port = {})" , self .echo .port .number ));
+
+ while stop_rx .try_recv ().is_err () {
+ #[cfg (feature = "measure" )]
+ measure .start ();
+
+ #[cfg (not (feature = "measure" ))]
+ let value = self .echo .poll (Some (Duration ::new (1 , 0 )));
+
+ #[cfg (feature = "measure" )]
+ let value = self .echo .poll_measure (Some (Duration ::new (1 , 0 )), & mut measure );
+
+ match value {
+ Ok (value ) => {
+ if let Some (value ) = value {
+ self .on_value_changed (value );
+ }
+ }
+ Err (_e ) => {
+ #[cfg (debug_assertions )]
+ println ! ("POLL failed: e = {:?}" , _e );
+ }
+ }
+
+ #[cfg (feature = "measure" )]
+ measure .stop ();
+ }
+ }
+
+
+ fn on_value_changed (& mut self , value : Value ) {
+ match value {
+ Value ::High => {
+
+
+ if self .timestamp > 0 {
+ #[cfg (debug_assertions )]
+ println ! ("{:?}" , self );
+
+ self .calc_distance ();
+ }
+
+ self .timestamp = precise_time_ns ();
+ }
+ Value ::Low => {
+
+ if self .timestamp == 0 {
+ #[cfg (debug_assertions )]
+ println ! ("{:?}" , self );
+ }
+
+ self .calc_distance ();
+ }
+ }
+ }
+
+
+ fn calc_distance (& mut self ) {
+ let time_diff = precise_time_ns () - self .timestamp ;
+ let distance = (3315 + self .temperature as u64 * 6 ) * time_diff / 20_000_000 ;
+ self .distance .store (distance as u32 , Ordering ::Relaxed );
+
+ #[cfg (debug_assertions )]
+ println ! ("time diff: {}\tdistance: {}mm" , time_diff , distance );
+
+ self .timestamp = 0u64 ;
+ }
+}
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/Ultrasonic.t.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/Ultrasonic.t.html
new file mode 100644
index 0000000..b6ccdbb
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/Ultrasonic.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.Ultrasonic.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/UltrasonicEcho.t.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/UltrasonicEcho.t.html
new file mode 100644
index 0000000..b744cfb
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/UltrasonicEcho.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.UltrasonicEcho.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/UltrasonicTrigger.t.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/UltrasonicTrigger.t.html
new file mode 100644
index 0000000..53ed021
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/UltrasonicTrigger.t.html
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Redirecting to struct.UltrasonicTrigger.html ...
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/index.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/index.html
new file mode 100644
index 0000000..06942cb
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/index.html
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+ ultrasonic_irq - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/sidebar-items.js b/kawaii/kawaii-rs/doc/ultrasonic_irq/sidebar-items.js
new file mode 100644
index 0000000..c4bb2bb
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/sidebar-items.js
@@ -0,0 +1 @@
+initSidebarItems({"struct":[["Ultrasonic",""],["UltrasonicEcho",""],["UltrasonicTrigger",""]]});
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.Ultrasonic.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.Ultrasonic.html
new file mode 100644
index 0000000..a8fa4ba
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.Ultrasonic.html
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+ ultrasonic_irq::Ultrasonic - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct Ultrasonic {
+ pub distance: Arc <AtomicU32 >,
+ // some fields omitted
+} Fields
+
+ distance: Arc <AtomicU32 >
+ Methods
+fn new (trigger_port: u8 , echo_port: u8 , temperature: u8 ) -> Result <Ultrasonic >
+
Constructs a new Ultrasonic and start threads.
+
+
+
+UltrasonicTrigger
+UltrasonicEcho
+
+
+
+
+trigger_port GPIO Port number of trigger pin.
+echo_port GPIO Port number of echo pin.
+temperature Room temperature in °C.
+
+
Trait Implementations
+
+
Formats the value using the given formatter.
+
+fn drop (&mut self)
+
Drop sync channels and join threads.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.UltrasonicEcho.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.UltrasonicEcho.html
new file mode 100644
index 0000000..e6ac662
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.UltrasonicEcho.html
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+ ultrasonic_irq::UltrasonicEcho - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct UltrasonicEcho { /* fields omitted */ } Trait Implementations
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.UltrasonicTrigger.html b/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.UltrasonicTrigger.html
new file mode 100644
index 0000000..458586b
--- /dev/null
+++ b/kawaii/kawaii-rs/doc/ultrasonic_irq/struct.UltrasonicTrigger.html
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+ ultrasonic_irq::UltrasonicTrigger - Rust
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pub struct UltrasonicTrigger { /* fields omitted */ } Trait Implementations
+
+
Formats the value using the given formatter.
+
+
+
+
+
+
+
+
Help
+
+
+
Keyboard Shortcuts
+
+
+ ?
+ Show this help dialog
+ S
+ Focus the search field
+ ⇤
+ Move up in search results
+ ⇥
+ Move down in search results
+ ⏎
+ Go to active search result
+ +
+ Collapse/expand all sections
+
+
+
+
+
Search Tricks
+
+
+ Prefix searches with a type followed by a colon (e.g.
+ fn:) to restrict the search to a given type.
+
+
+
+ Accepted types are: fn, mod,
+ struct, enum,
+ trait, type, macro,
+ and const.
+
+
+
+ Search functions by type signature (e.g.
+ vec -> usize or * -> vec)
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file