aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2022-06-19 19:47:51 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2022-06-19 19:47:51 +0530
commit4fd287655a72b9aea14cdac715ad5b90ed082ed2 (patch)
tree65d393bc0e699dd12d05b29ba568e04cea666207 /circuitpython/frozen/Adafruit_CircuitPython_SimpleIO
parent0150f70ce9c39e9e6dd878766c0620c85e47bed0 (diff)
add circuitpython code
Diffstat (limited to 'circuitpython/frozen/Adafruit_CircuitPython_SimpleIO')
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pre-commit-config.yaml42
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pylintrc436
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.readthedocs.yaml15
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/CODE_OF_CONDUCT.md135
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSE21
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/CC-BY-4.0.txt324
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/MIT.txt19
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/Unlicense.txt20
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst76
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.icobin0 -> 4414 bytes
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst5
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/conf.py175
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst16
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst45
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst.license3
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/requirements.txt5
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_map_range_simpletest.py25
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_shift_in_out_demo.py38
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_tone_demo.py18
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/requirements.txt5
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/setup.py54
-rw-r--r--circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/simpleio.py252
26 files changed, 1741 insertions, 0 deletions
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pre-commit-config.yaml b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pre-commit-config.yaml
new file mode 100644
index 0000000..1b9fadc
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pre-commit-config.yaml
@@ -0,0 +1,42 @@
+# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
+#
+# SPDX-License-Identifier: Unlicense
+
+repos:
+- repo: https://github.com/python/black
+ rev: 20.8b1
+ hooks:
+ - id: black
+- repo: https://github.com/fsfe/reuse-tool
+ rev: v0.12.1
+ hooks:
+ - id: reuse
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v2.3.0
+ hooks:
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+- repo: https://github.com/pycqa/pylint
+ rev: v2.11.1
+ hooks:
+ - id: pylint
+ name: pylint (library code)
+ types: [python]
+ args:
+ - --disable=consider-using-f-string
+ exclude: "^(docs/|examples/|tests/|setup.py$)"
+ - id: pylint
+ name: pylint (example code)
+ description: Run pylint rules on "examples/*.py" files
+ types: [python]
+ files: "^examples/"
+ args:
+ - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
+ - id: pylint
+ name: pylint (test code)
+ description: Run pylint rules on "tests/*.py" files
+ types: [python]
+ files: "^tests/"
+ args:
+ - --disable=missing-docstring,consider-using-f-string,duplicate-code
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pylintrc b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pylintrc
new file mode 100644
index 0000000..cfd1c41
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.pylintrc
@@ -0,0 +1,436 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+[MASTER]
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code
+extension-pkg-whitelist=
+
+# Add files or directories to the blacklist. They should be base names, not
+# paths.
+ignore=CVS
+
+# Add files or directories matching the regex patterns to the blacklist. The
+# regex matches against base names, not paths.
+ignore-patterns=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Use multiple processes to speed up Pylint.
+jobs=1
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Specify a configuration file.
+#rcfile=
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
+confidence=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once).You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use"--disable=all --enable=classes
+# --disable=W"
+# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call
+disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation,unspecified-encoding
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+enable=
+
+
+[REPORTS]
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (RP0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details
+#msg-template=
+
+# Set the output format. Available formats are text, parseable, colorized, json
+# and msvs (visual studio).You can also give a reporter class, eg
+# mypackage.mymodule.MyReporterClass.
+output-format=text
+
+# Tells whether to display a full report or only the messages
+reports=no
+
+# Activate the evaluation score.
+score=yes
+
+
+[REFACTORING]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+
+[LOGGING]
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format
+logging-modules=logging
+
+
+[SPELLING]
+
+# Spelling dictionary name. Available dictionaries: none. To make it working
+# install python-enchant package.
+spelling-dict=
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to indicated private dictionary in
+# --spelling-private-dict-file option instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+# notes=FIXME,XXX,TODO
+notes=FIXME,XXX
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# This flag controls whether pylint should warn about no-member and similar
+# checks whenever an opaque object is returned when inferring. The inference
+# can return multiple potential results while evaluating a Python object, but
+# some branches might not be evaluated, which results in partial inference. In
+# that case, it might be useful to still emit no-member and other checks for
+# the rest of the inferred objects.
+ignore-on-opaque-inference=yes
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis. It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=board
+
+# Show a hint with possible names when a member name was not found. The aspect
+# of finding the hint is based on edit distance.
+missing-member-hint=yes
+
+# The minimum edit distance a name should have in order to be considered a
+# similar match for a missing member name.
+missing-member-hint-distance=1
+
+# The total number of similar names that should be taken in consideration when
+# showing a hint for a missing member.
+missing-member-max-choices=1
+
+
+[VARIABLES]
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+# Tells whether unused global variables should be treated as a violation.
+allow-global-unused-variables=yes
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,_cb
+
+# A regular expression matching the name of dummy variables (i.e. expectedly
+# not used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore
+ignored-argument-names=_.*|^ignored_|^unused_
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,future.builtins
+
+
+[FORMAT]
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+# expected-line-ending-format=
+expected-line-ending-format=LF
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Number of spaces of indent required inside a hanging or continued line.
+indent-after-paren=4
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# List of optional constructs for which whitespace checking is disabled. `dict-
+# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
+# `trailing-comma` allows a space between comma and closing bracket: (a, ).
+# `empty-line` allows space-only lines.
+no-space-check=trailing-comma,dict-separator
+
+# Allow the body of a class to be on the same line as the declaration if body
+# contains single statement.
+single-line-class-stmt=no
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+
+[SIMILARITIES]
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
+
+# Ignore imports when computing similarities.
+ignore-imports=yes
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+
+[BASIC]
+
+# Naming hint for argument names
+argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct argument names
+argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Naming hint for attribute names
+attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct attribute names
+attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# Naming hint for class attribute names
+class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Regular expression matching correct class attribute names
+class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
+
+# Naming hint for class names
+# class-name-hint=[A-Z_][a-zA-Z0-9]+$
+class-name-hint=[A-Z_][a-zA-Z0-9_]+$
+
+# Regular expression matching correct class names
+# class-rgx=[A-Z_][a-zA-Z0-9]+$
+class-rgx=[A-Z_][a-zA-Z0-9_]+$
+
+# Naming hint for constant names
+const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Regular expression matching correct constant names
+const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+# Naming hint for function names
+function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct function names
+function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Good variable names which should always be accepted, separated by a comma
+# good-names=i,j,k,ex,Run,_
+good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_
+
+# Include a hint for the correct naming format with invalid-name
+include-naming-hint=no
+
+# Naming hint for inline iteration names
+inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
+
+# Regular expression matching correct inline iteration names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Naming hint for method names
+method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct method names
+method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Naming hint for module names
+module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression matching correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+property-classes=abc.abstractproperty
+
+# Naming hint for variable names
+variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+# Regular expression matching correct variable names
+variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
+
+
+[IMPORTS]
+
+# Allow wildcard imports from modules that define __all__.
+allow-wildcard-with-all=no
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=optparse,tkinter.tix
+
+# Create a graph of external dependencies in the given file (report RP0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report RP0402 must not be disabled)
+import-graph=
+
+# Create a graph of internal dependencies in the given file (report RP0402 must
+# not be disabled)
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant
+
+
+[CLASSES]
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,_fields,_replace,_source,_make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=mcs
+
+
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of attributes for a class (see R0902).
+# max-attributes=7
+max-attributes=11
+
+# Maximum number of boolean expressions in a if statement
+max-bool-expr=5
+
+# Maximum number of branch for function / method body
+max-branches=12
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=1
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "Exception"
+overgeneral-exceptions=Exception
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.readthedocs.yaml b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.readthedocs.yaml
new file mode 100644
index 0000000..f8b2891
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/.readthedocs.yaml
@@ -0,0 +1,15 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+python:
+ version: "3.x"
+ install:
+ - requirements: docs/requirements.txt
+ - requirements: requirements.txt
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/CODE_OF_CONDUCT.md b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..8a55c07
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/CODE_OF_CONDUCT.md
@@ -0,0 +1,135 @@
+<!--
+SPDX-FileCopyrightText: 2014 Coraline Ada Ehmke
+SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries
+SPDX-License-Identifier: CC-BY-4.0
+-->
+
+# Adafruit Community Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and leaders pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, gender identity and expression, level or type of
+experience, education, socio-economic status, nationality, personal appearance,
+race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+We are committed to providing a friendly, safe and welcoming environment for
+all.
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Be kind and courteous to others
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Collaborating with other community members
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and sexual attention or advances
+* The use of inappropriate images, including in a community member's avatar
+* The use of inappropriate language, including in a community member's nickname
+* Any spamming, flaming, baiting or other attention-stealing behavior
+* Excessive or unwelcome helping; answering outside the scope of the question
+ asked
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Promoting or spreading disinformation, lies, or conspiracy theories against
+ a person, group, organisation, project, or community
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate
+
+The goal of the standards and moderation guidelines outlined here is to build
+and maintain a respectful community. We ask that you don’t just aim to be
+"technically unimpeachable", but rather try to be your best self.
+
+We value many things beyond technical expertise, including collaboration and
+supporting others within our community. Providing a positive experience for
+other community members can have a much more significant impact than simply
+providing the correct answer.
+
+## Our Responsibilities
+
+Project leaders are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project leaders have the right and responsibility to remove, edit, or
+reject messages, comments, commits, code, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any community member for other behaviors that they deem
+inappropriate, threatening, offensive, or harmful.
+
+## Moderation
+
+Instances of behaviors that violate the Adafruit Community Code of Conduct
+may be reported by any member of the community. Community members are
+encouraged to report these situations, including situations they witness
+involving other community members.
+
+You may report in the following ways:
+
+In any situation, you may send an email to <support@adafruit.com>.
+
+On the Adafruit Discord, you may send an open message from any channel
+to all Community Moderators by tagging @community moderators. You may
+also send an open message from any channel, or a direct message to
+@kattni#1507, @tannewt#4653, @Dan Halbert#1614, @cater#2442,
+@sommersoft#0222, @Mr. Certainly#0472 or @Andon#8175.
+
+Email and direct message reports will be kept confidential.
+
+In situations on Discord where the issue is particularly egregious, possibly
+illegal, requires immediate action, or violates the Discord terms of service,
+you should also report the message directly to Discord.
+
+These are the steps for upholding our community’s standards of conduct.
+
+1. Any member of the community may report any situation that violates the
+Adafruit Community Code of Conduct. All reports will be reviewed and
+investigated.
+2. If the behavior is an egregious violation, the community member who
+committed the violation may be banned immediately, without warning.
+3. Otherwise, moderators will first respond to such behavior with a warning.
+4. Moderators follow a soft "three strikes" policy - the community member may
+be given another chance, if they are receptive to the warning and change their
+behavior.
+5. If the community member is unreceptive or unreasonable when warned by a
+moderator, or the warning goes unheeded, they may be banned for a first or
+second offense. Repeated offenses will result in the community member being
+banned.
+
+## Scope
+
+This Code of Conduct and the enforcement policies listed above apply to all
+Adafruit Community venues. This includes but is not limited to any community
+spaces (both public and private), the entire Adafruit Discord server, and
+Adafruit GitHub repositories. Examples of Adafruit Community spaces include
+but are not limited to meet-ups, audio chats on the Adafruit Discord, or
+interaction at a conference.
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. As a community
+member, you are representing our community, and are expected to behave
+accordingly.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 1.4, available at
+<https://www.contributor-covenant.org/version/1/4/code-of-conduct.html>,
+and the [Rust Code of Conduct](https://www.rust-lang.org/en-US/conduct.html).
+
+For other projects adopting the Adafruit Community Code of
+Conduct, please contact the maintainers of those projects for enforcement.
+If you wish to use this code of conduct for your own project, consider
+explicitly mentioning your moderation policy or making a copy with your
+own moderation policy so as to avoid confusion.
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSE b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSE
new file mode 100644
index 0000000..de855cb
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Scott Shawcroft for Adafruit Industries
+
+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/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/CC-BY-4.0.txt b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/CC-BY-4.0.txt
new file mode 100644
index 0000000..3f92dfc
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/CC-BY-4.0.txt
@@ -0,0 +1,324 @@
+Creative Commons Attribution 4.0 International Creative Commons Corporation
+("Creative Commons") is not a law firm and does not provide legal services
+or legal advice. Distribution of Creative Commons public licenses does not
+create a lawyer-client or other relationship. Creative Commons makes its licenses
+and related information available on an "as-is" basis. Creative Commons gives
+no warranties regarding its licenses, any material licensed under their terms
+and conditions, or any related information. Creative Commons disclaims all
+liability for damages resulting from their use to the fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and conditions
+that creators and other rights holders may use to share original works of
+authorship and other material subject to copyright and certain other rights
+specified in the public license below. The following considerations are for
+informational purposes only, are not exhaustive, and do not form part of our
+licenses.
+
+Considerations for licensors: Our public licenses are intended for use by
+those authorized to give the public permission to use material in ways otherwise
+restricted by copyright and certain other rights. Our licenses are irrevocable.
+Licensors should read and understand the terms and conditions of the license
+they choose before applying it. Licensors should also secure all rights necessary
+before applying our licenses so that the public can reuse the material as
+expected. Licensors should clearly mark any material not subject to the license.
+This includes other CC-licensed material, or material used under an exception
+or limitation to copyright. More considerations for licensors : wiki.creativecommons.org/Considerations_for_licensors
+
+Considerations for the public: By using one of our public licenses, a licensor
+grants the public permission to use the licensed material under specified
+terms and conditions. If the licensor's permission is not necessary for any
+reason–for example, because of any applicable exception or limitation to copyright–then
+that use is not regulated by the license. Our licenses grant only permissions
+under copyright and certain other rights that a licensor has authority to
+grant. Use of the licensed material may still be restricted for other reasons,
+including because others have copyright or other rights in the material. A
+licensor may make special requests, such as asking that all changes be marked
+or described. Although not required by our licenses, you are encouraged to
+respect those requests where reasonable. More considerations for the public
+: wiki.creativecommons.org/Considerations_for_licensees Creative Commons Attribution
+4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree to
+be bound by the terms and conditions of this Creative Commons Attribution
+4.0 International Public License ("Public License"). To the extent this Public
+License may be interpreted as a contract, You are granted the Licensed Rights
+in consideration of Your acceptance of these terms and conditions, and the
+Licensor grants You such rights in consideration of benefits the Licensor
+receives from making the Licensed Material available under these terms and
+conditions.
+
+Section 1 – Definitions.
+
+a. Adapted Material means material subject to Copyright and Similar Rights
+that is derived from or based upon the Licensed Material and in which the
+Licensed Material is translated, altered, arranged, transformed, or otherwise
+modified in a manner requiring permission under the Copyright and Similar
+Rights held by the Licensor. For purposes of this Public License, where the
+Licensed Material is a musical work, performance, or sound recording, Adapted
+Material is always produced where the Licensed Material is synched in timed
+relation with a moving image.
+
+b. Adapter's License means the license You apply to Your Copyright and Similar
+Rights in Your contributions to Adapted Material in accordance with the terms
+and conditions of this Public License.
+
+c. Copyright and Similar Rights means copyright and/or similar rights closely
+related to copyright including, without limitation, performance, broadcast,
+sound recording, and Sui Generis Database Rights, without regard to how the
+rights are labeled or categorized. For purposes of this Public License, the
+rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
+
+d. Effective Technological Measures means those measures that, in the absence
+of proper authority, may not be circumvented under laws fulfilling obligations
+under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996,
+and/or similar international agreements.
+
+e. Exceptions and Limitations means fair use, fair dealing, and/or any other
+exception or limitation to Copyright and Similar Rights that applies to Your
+use of the Licensed Material.
+
+f. Licensed Material means the artistic or literary work, database, or other
+material to which the Licensor applied this Public License.
+
+g. Licensed Rights means the rights granted to You subject to the terms and
+conditions of this Public License, which are limited to all Copyright and
+Similar Rights that apply to Your use of the Licensed Material and that the
+Licensor has authority to license.
+
+h. Licensor means the individual(s) or entity(ies) granting rights under this
+Public License.
+
+i. Share means to provide material to the public by any means or process that
+requires permission under the Licensed Rights, such as reproduction, public
+display, public performance, distribution, dissemination, communication, or
+importation, and to make material available to the public including in ways
+that members of the public may access the material from a place and at a time
+individually chosen by them.
+
+j. Sui Generis Database Rights means rights other than copyright resulting
+from Directive 96/9/EC of the European Parliament and of the Council of 11
+March 1996 on the legal protection of databases, as amended and/or succeeded,
+as well as other essentially equivalent rights anywhere in the world.
+
+k. You means the individual or entity exercising the Licensed Rights under
+this Public License. Your has a corresponding meaning.
+
+Section 2 – Scope.
+
+ a. License grant.
+
+1. Subject to the terms and conditions of this Public License, the Licensor
+hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive,
+irrevocable license to exercise the Licensed Rights in the Licensed Material
+to:
+
+ A. reproduce and Share the Licensed Material, in whole or in part; and
+
+ B. produce, reproduce, and Share Adapted Material.
+
+2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions
+and Limitations apply to Your use, this Public License does not apply, and
+You do not need to comply with its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section 6(a).
+
+4. Media and formats; technical modifications allowed. The Licensor authorizes
+You to exercise the Licensed Rights in all media and formats whether now known
+or hereafter created, and to make technical modifications necessary to do
+so. The Licensor waives and/or agrees not to assert any right or authority
+to forbid You from making technical modifications necessary to exercise the
+Licensed Rights, including technical modifications necessary to circumvent
+Effective Technological Measures. For purposes of this Public License, simply
+making modifications authorized by this Section 2(a)(4) never produces Adapted
+Material.
+
+ 5. Downstream recipients.
+
+A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed
+Material automatically receives an offer from the Licensor to exercise the
+Licensed Rights under the terms and conditions of this Public License.
+
+B. No downstream restrictions. You may not offer or impose any additional
+or different terms or conditions on, or apply any Effective Technological
+Measures to, the Licensed Material if doing so restricts exercise of the Licensed
+Rights by any recipient of the Licensed Material.
+
+6. No endorsement. Nothing in this Public License constitutes or may be construed
+as permission to assert or imply that You are, or that Your use of the Licensed
+Material is, connected with, or sponsored, endorsed, or granted official status
+by, the Licensor or others designated to receive attribution as provided in
+Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+1. Moral rights, such as the right of integrity, are not licensed under this
+Public License, nor are publicity, privacy, and/or other similar personality
+rights; however, to the extent possible, the Licensor waives and/or agrees
+not to assert any such rights held by the Licensor to the limited extent necessary
+to allow You to exercise the Licensed Rights, but not otherwise.
+
+2. Patent and trademark rights are not licensed under this Public License.
+
+3. To the extent possible, the Licensor waives any right to collect royalties
+from You for the exercise of the Licensed Rights, whether directly or through
+a collecting society under any voluntary or waivable statutory or compulsory
+licensing scheme. In all other cases the Licensor expressly reserves any right
+to collect such royalties.
+
+Section 3 – License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the following
+conditions.
+
+ a. Attribution.
+
+1. If You Share the Licensed Material (including in modified form), You must:
+
+A. retain the following if it is supplied by the Licensor with the Licensed
+Material:
+
+i. identification of the creator(s) of the Licensed Material and any others
+designated to receive attribution, in any reasonable manner requested by the
+Licensor (including by pseudonym if designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of warranties;
+
+v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
+
+B. indicate if You modified the Licensed Material and retain an indication
+of any previous modifications; and
+
+C. indicate the Licensed Material is licensed under this Public License, and
+include the text of, or the URI or hyperlink to, this Public License.
+
+2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner
+based on the medium, means, and context in which You Share the Licensed Material.
+For example, it may be reasonable to satisfy the conditions by providing a
+URI or hyperlink to a resource that includes the required information.
+
+3. If requested by the Licensor, You must remove any of the information required
+by Section 3(a)(1)(A) to the extent reasonably practicable.
+
+4. If You Share Adapted Material You produce, the Adapter's License You apply
+must not prevent recipients of the Adapted Material from complying with this
+Public License.
+
+Section 4 – Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that apply to
+Your use of the Licensed Material:
+
+a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract,
+reuse, reproduce, and Share all or a substantial portion of the contents of
+the database;
+
+b. if You include all or a substantial portion of the database contents in
+a database in which You have Sui Generis Database Rights, then the database
+in which You have Sui Generis Database Rights (but not its individual contents)
+is Adapted Material; and
+
+c. You must comply with the conditions in Section 3(a) if You Share all or
+a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not replace
+Your obligations under this Public License where the Licensed Rights include
+other Copyright and Similar Rights.
+
+Section 5 – Disclaimer of Warranties and Limitation of Liability.
+
+a. Unless otherwise separately undertaken by the Licensor, to the extent possible,
+the Licensor offers the Licensed Material as-is and as-available, and makes
+no representations or warranties of any kind concerning the Licensed Material,
+whether express, implied, statutory, or other. This includes, without limitation,
+warranties of title, merchantability, fitness for a particular purpose, non-infringement,
+absence of latent or other defects, accuracy, or the presence or absence of
+errors, whether or not known or discoverable. Where disclaimers of warranties
+are not allowed in full or in part, this disclaimer may not apply to You.
+
+b. To the extent possible, in no event will the Licensor be liable to You
+on any legal theory (including, without limitation, negligence) or otherwise
+for any direct, special, indirect, incidental, consequential, punitive, exemplary,
+or other losses, costs, expenses, or damages arising out of this Public License
+or use of the Licensed Material, even if the Licensor has been advised of
+the possibility of such losses, costs, expenses, or damages. Where a limitation
+of liability is not allowed in full or in part, this limitation may not apply
+to You.
+
+c. The disclaimer of warranties and limitation of liability provided above
+shall be interpreted in a manner that, to the extent possible, most closely
+approximates an absolute disclaimer and waiver of all liability.
+
+Section 6 – Term and Termination.
+
+a. This Public License applies for the term of the Copyright and Similar Rights
+licensed here. However, if You fail to comply with this Public License, then
+Your rights under this Public License terminate automatically.
+
+b. Where Your right to use the Licensed Material has terminated under Section
+6(a), it reinstates:
+
+1. automatically as of the date the violation is cured, provided it is cured
+within 30 days of Your discovery of the violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+c. For the avoidance of doubt, this Section 6(b) does not affect any right
+the Licensor may have to seek remedies for Your violations of this Public
+License.
+
+d. For the avoidance of doubt, the Licensor may also offer the Licensed Material
+under separate terms or conditions or stop distributing the Licensed Material
+at any time; however, doing so will not terminate this Public License.
+
+ e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
+
+Section 7 – Other Terms and Conditions.
+
+a. The Licensor shall not be bound by any additional or different terms or
+conditions communicated by You unless expressly agreed.
+
+b. Any arrangements, understandings, or agreements regarding the Licensed
+Material not stated herein are separate from and independent of the terms
+and conditions of this Public License.
+
+Section 8 – Interpretation.
+
+a. For the avoidance of doubt, this Public License does not, and shall not
+be interpreted to, reduce, limit, restrict, or impose conditions on any use
+of the Licensed Material that could lawfully be made without permission under
+this Public License.
+
+b. To the extent possible, if any provision of this Public License is deemed
+unenforceable, it shall be automatically reformed to the minimum extent necessary
+to make it enforceable. If the provision cannot be reformed, it shall be severed
+from this Public License without affecting the enforceability of the remaining
+terms and conditions.
+
+c. No term or condition of this Public License will be waived and no failure
+to comply consented to unless expressly agreed to by the Licensor.
+
+d. Nothing in this Public License constitutes or may be interpreted as a limitation
+upon, or waiver of, any privileges and immunities that apply to the Licensor
+or You, including from the legal processes of any jurisdiction or authority.
+
+Creative Commons is not a party to its public licenses. Notwithstanding, Creative
+Commons may elect to apply one of its public licenses to material it publishes
+and in those instances will be considered the "Licensor." The text of the
+Creative Commons public licenses is dedicated to the public domain under the
+CC0 Public Domain Dedication. Except for the limited purpose of indicating
+that material is shared under a Creative Commons public license or as otherwise
+permitted by the Creative Commons policies published at creativecommons.org/policies,
+Creative Commons does not authorize the use of the trademark "Creative Commons"
+or any other trademark or logo of Creative Commons without its prior written
+consent including, without limitation, in connection with any unauthorized
+modifications to any of its public licenses or any other arrangements, understandings,
+or agreements concerning use of licensed material. For the avoidance of doubt,
+this paragraph does not form part of the public licenses.
+
+Creative Commons may be contacted at creativecommons.org.
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/MIT.txt b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/MIT.txt
new file mode 100644
index 0000000..204b93d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/MIT.txt
@@ -0,0 +1,19 @@
+MIT License Copyright (c) <year> <copyright holders>
+
+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 (including the next
+paragraph) 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/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/Unlicense.txt b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/Unlicense.txt
new file mode 100644
index 0000000..24a8f90
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/LICENSES/Unlicense.txt
@@ -0,0 +1,20 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute
+this software, either in source code form or as a compiled binary, for any
+purpose, commercial or non-commercial, and by any means.
+
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and
+to the detriment of our heirs and successors. We intend this dedication to
+be an overt act of relinquishment in perpetuity of all present and future
+rights to this software under copyright law.
+
+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
+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. For more information,
+please refer to <https://unlicense.org/>
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst
new file mode 100644
index 0000000..2988777
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst
@@ -0,0 +1,76 @@
+
+Introduction
+============
+
+.. image:: https://readthedocs.org/projects/adafruit-circuitpython-simpleio/badge/?version=latest
+ :target: https://docs.circuitpython.org/projects/simpleio/en/latest/
+ :alt: Documentation Status
+
+.. image :: https://img.shields.io/discord/327254708534116352.svg
+ :target: https://adafru.it/discord
+ :alt: Discord
+
+.. image:: https://github.com/adafruit/Adafruit_CircuitPython_SimpleIO/workflows/Build%20CI/badge.svg
+ :target: https://github.com/adafruit/Adafruit_CircuitPython_SimpleIO/actions/
+ :alt: Build Status
+
+SimpleIO features a number of helpers to simplify hardware interactions. Many
+of the functions and classes are inspired by Arduino APIs to make it easier to
+move to CircuitPython from Arduino.
+
+Dependencies
+=============
+This driver depends on:
+
+* `Adafruit CircuitPython <https://github.com/adafruit/circuitpython>`_
+
+Please ensure all dependencies are available on the CircuitPython filesystem.
+This is easily achieved by downloading
+`the Adafruit library and driver bundle <https://circuitpython.org/libraries>`_.
+
+Installing from PyPI
+====================
+
+On supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from
+PyPI <https://pypi.org/project/adafruit-circuitpython-simpleio/>`_. To install for current user:
+
+.. code-block:: shell
+
+ pip3 install adafruit-circuitpython-simpleio
+
+To install system-wide (this may be required in some cases):
+
+.. code-block:: shell
+
+ sudo pip3 install adafruit-circuitpython-simpleio
+
+To install in a virtual environment in your current project:
+
+.. code-block:: shell
+
+ mkdir project-name && cd project-name
+ python3 -m venv .env
+ source .env/bin/activate
+ pip3 install adafruit-circuitpython-simpleio
+
+Usage Example
+=============
+
+See the examples in the `examples/` folder for usage.
+
+Documentation
+=============
+
+API documentation for this library can be found on `Read the Docs <https://docs.circuitpython.org/projects/simpleio/en/latest/>`_.
+
+Contributing
+============
+
+Contributions are welcome! Please read our `Code of Conduct
+<https://github.com/adafruit/Adafruit_CircuitPython_SimpleIO/blob/main/CODE_OF_CONDUCT.md>`_
+before contributing to help this project stay welcoming.
+
+Documentation
+=============
+
+For information on building library documentation, please check out `this guide <https://learn.adafruit.com/creating-and-sharing-a-circuitpython-library/sharing-our-docs-on-readthedocs#sphinx-5-1>`_.
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst.license
new file mode 100644
index 0000000..11cd75d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/README.rst.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
+
+SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico
new file mode 100644
index 0000000..5aca983
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico
Binary files differ
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico.license b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico.license
new file mode 100644
index 0000000..86a3fbf
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/_static/favicon.ico.license
@@ -0,0 +1,3 @@
+SPDX-FileCopyrightText: 2018 Phillip Torrone for Adafruit Industries
+
+SPDX-License-Identifier: CC-BY-4.0
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst
new file mode 100644
index 0000000..67c1b45
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst
@@ -0,0 +1,5 @@
+
+.. If you created a package, create one automodule per module in the package.
+
+.. automodule:: simpleio
+ :members:
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst.license
new file mode 100644
index 0000000..9aae48d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/api.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/conf.py b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/conf.py
new file mode 100644
index 0000000..46eb31f
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/conf.py
@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+import os
+import sys
+
+sys.path.insert(0, os.path.abspath(".."))
+
+# -- General configuration ------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.intersphinx",
+ "sphinx.ext.viewcode",
+]
+
+autodoc_mock_imports = ["pulseio"]
+
+intersphinx_mapping = {
+ "python": ("https://docs.python.org/3", None),
+ "CircuitPython": ("https://docs.circuitpython.org/en/latest/", None),
+}
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+source_suffix = ".rst"
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = "Adafruit CircuitPython SimpleIO Library"
+copyright = "2017 Scott Shawcroft"
+author = "Scott Shawcroft"
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = "1.0"
+# The full version, including alpha/beta/rc tags.
+release = "1.0"
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This patterns also effect to html_static_path and html_extra_path
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".env", "CODE_OF_CONDUCT.md"]
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#
+default_role = "any"
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#
+add_function_parentheses = True
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "sphinx"
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+# If this is True, todo emits a warning for each TODO entries. The default is False.
+todo_emit_warnings = True
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+#
+on_rtd = os.environ.get("READTHEDOCS", None) == "True"
+
+if not on_rtd: # only import and set the theme if we're building docs locally
+ try:
+ import sphinx_rtd_theme
+
+ html_theme = "sphinx_rtd_theme"
+ html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."]
+ except:
+ html_theme = "default"
+ html_theme_path = ["."]
+else:
+ html_theme_path = ["."]
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#
+html_favicon = "_static/favicon.ico"
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "AdafruitSimpleIOLibrarydoc"
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+ # The paper size ('letterpaper' or 'a4paper').
+ #
+ # 'papersize': 'letterpaper',
+ # The font size ('10pt', '11pt' or '12pt').
+ #
+ # 'pointsize': '10pt',
+ # Additional stuff for the LaTeX preamble.
+ #
+ # 'preamble': '',
+ # Latex figure (float) alignment
+ #
+ # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (
+ master_doc,
+ "AdafruitSimpleIOLibrary.tex",
+ "Adafruit SimpleIO Library Documentation",
+ "Scott Shawcroft",
+ "manual",
+ ),
+]
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (
+ master_doc,
+ "adafruitSimpleIOlibrary",
+ "Adafruit SimpleIO Library Documentation",
+ [author],
+ 1,
+ )
+]
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (
+ master_doc,
+ "AdafruitSimpleIOLibrary",
+ "Adafruit SimpleIO Library Documentation",
+ author,
+ "AdafruitSimpleIOLibrary",
+ "One line description of project.",
+ "Miscellaneous",
+ ),
+]
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst
new file mode 100644
index 0000000..61359aa
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst
@@ -0,0 +1,16 @@
+Simple tests
+-------------
+
+Ensure your device works with these simple tests.
+
+.. literalinclude:: ../examples/simpleio_tone_demo.py
+ :caption: examples/simpleio_tone_demo.py
+ :linenos:
+
+.. literalinclude:: ../examples/simpleio_shift_in_out_demo.py
+ :caption: examples/simpleio_shift_in_out_demo.py
+ :linenos:
+
+.. literalinclude:: ../examples/simpleio_map_range_simpletest.py
+ :caption: examples/simpleio_map_range_simpletest.py
+ :linenos:
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst.license
new file mode 100644
index 0000000..9aae48d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/examples.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst
new file mode 100644
index 0000000..28e5b1a
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst
@@ -0,0 +1,45 @@
+.. include:: ../README.rst
+
+Table of Contents
+=================
+
+.. toctree::
+ :maxdepth: 4
+ :hidden:
+
+ self
+
+.. toctree::
+ :caption: Examples
+
+ examples
+
+.. toctree::
+ :caption: API Reference
+ :maxdepth: 3
+
+ api
+
+.. toctree::
+ :caption: Tutorials
+
+.. toctree::
+ :caption: Related Products
+
+.. toctree::
+ :caption: Other Links
+
+ Download <https://github.com/adafruit/Adafruit_CircuitPython_SimpleIO/releases/latest>
+ CircuitPython Reference Documentation <https://docs.circuitpython.org>
+ CircuitPython Support Forum <https://forums.adafruit.com/viewforum.php?f=60>
+ Discord Chat <https://adafru.it/discord>
+ Adafruit Learning System <https://learn.adafruit.com>
+ Adafruit Blog <https://blog.adafruit.com>
+ Adafruit Store <https://www.adafruit.com>
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst.license b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst.license
new file mode 100644
index 0000000..9aae48d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/index.rst.license
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2020 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/requirements.txt b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/requirements.txt
new file mode 100644
index 0000000..88e6733
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/docs/requirements.txt
@@ -0,0 +1,5 @@
+# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+sphinx>=4.0.0
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_map_range_simpletest.py b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_map_range_simpletest.py
new file mode 100644
index 0000000..dd2f72e
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_map_range_simpletest.py
@@ -0,0 +1,25 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+# SPDX-License-Identifier: MIT
+
+"""
+'map_range_demo.py'.
+
+=================================================
+maps a number from one range to another
+"""
+import time
+import simpleio
+
+while True:
+ sensor_value = 150
+
+ # Map the sensor's range from 0<=sensor_value<=255 to 0<=sensor_value<=1023
+ print("original sensor value: ", sensor_value)
+ mapped_value = simpleio.map_range(sensor_value, 0, 255, 0, 1023)
+ print("mapped sensor value: ", mapped_value)
+ time.sleep(2)
+
+ # Map the new sensor value back to the old range
+ sensor_value = simpleio.map_range(mapped_value, 0, 1023, 0, 255)
+ print("original value returned: ", sensor_value)
+ time.sleep(2)
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_shift_in_out_demo.py b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_shift_in_out_demo.py
new file mode 100644
index 0000000..7a01f79
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_shift_in_out_demo.py
@@ -0,0 +1,38 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+# SPDX-License-Identifier: MIT
+
+"""
+'shift_in_out_demo.py'.
+
+=================================================
+shifts data into and out of a data pin
+"""
+
+import time
+import board
+import digitalio
+import simpleio
+
+# set up clock, data, and latch pins
+clk = digitalio.DigitalInOut(board.D12)
+data = digitalio.DigitalInOut(board.D11)
+latch = digitalio.DigitalInOut(board.D10)
+clk.direction = digitalio.Direction.OUTPUT
+latch.direction = digitalio.Direction.OUTPUT
+
+while True:
+ data_to_send = 256
+ # shifting 256 bits out of data pin
+ latch.value = False
+ data.direction = digitalio.Direction.OUTPUT
+ print("shifting out...")
+ simpleio.shift_out(data, clk, data_to_send, msb_first=False)
+ latch.value = True
+ time.sleep(3)
+
+ # shifting 256 bits into the data pin
+ latch.value = False
+ data.direction = digitalio.Direction.INPUT
+ print("shifting in...")
+ simpleio.shift_in(data, clk)
+ time.sleep(3)
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_tone_demo.py b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_tone_demo.py
new file mode 100644
index 0000000..4c3a8b4
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/examples/simpleio_tone_demo.py
@@ -0,0 +1,18 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+# SPDX-License-Identifier: MIT
+
+"""
+'tone_demo.py'.
+
+=================================================
+a short piezo song using tone()
+"""
+import time
+import board
+import simpleio
+
+
+while True:
+ for f in (262, 294, 330, 349, 392, 440, 494, 523):
+ simpleio.tone(board.A0, f, 0.25)
+ time.sleep(1)
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/requirements.txt b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/requirements.txt
new file mode 100644
index 0000000..17a850d
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/requirements.txt
@@ -0,0 +1,5 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+Adafruit-Blinka
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/setup.py b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/setup.py
new file mode 100644
index 0000000..bc63e8b
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/setup.py
@@ -0,0 +1,54 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+"""A setuptools based setup module.
+
+See:
+https://packaging.python.org/en/latest/distributing.html
+https://github.com/pypa/sampleproject
+"""
+
+# Always prefer setuptools over distutils
+from setuptools import setup, find_packages
+
+# To use a consistent encoding
+from codecs import open
+from os import path
+
+here = path.abspath(path.dirname(__file__))
+
+# Get the long description from the README file
+with open(path.join(here, "README.rst"), encoding="utf-8") as f:
+ long_description = f.read()
+
+setup(
+ name="adafruit-circuitpython-simpleio",
+ use_scm_version=True,
+ setup_requires=["setuptools_scm"],
+ description="CircuitPython helper library to simplify hardware interactions.",
+ long_description=long_description,
+ long_description_content_type="text/x-rst",
+ # The project's main homepage.
+ url="https://github.com/adafruit/Adafruit_CircuitPython_SimpleIO",
+ # Author details
+ author="Adafruit Industries",
+ author_email="circuitpython@adafruit.com",
+ install_requires=["Adafruit-Blinka"],
+ # Choose your license
+ license="MIT",
+ # See https://pypi.python.org/pypi?%3Aaction=list_classifiers
+ classifiers=[
+ "Development Status :: 3 - Alpha",
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries",
+ "Topic :: System :: Hardware",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python :: 3",
+ ],
+ # What does your project relate to?
+ keywords="adafruit simpleio servo map range bitwrite hardware micropython circuitpython",
+ # You can just specify the packages manually here if your project is
+ # simple. Or you can use find_packages().
+ py_modules=["simpleio"],
+)
diff --git a/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/simpleio.py b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/simpleio.py
new file mode 100644
index 0000000..5aa014c
--- /dev/null
+++ b/circuitpython/frozen/Adafruit_CircuitPython_SimpleIO/simpleio.py
@@ -0,0 +1,252 @@
+# SPDX-FileCopyrightText: 2017 Scott Shawcroft for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+"""
+`simpleio` - Simple, beginner friendly IO.
+=================================================
+
+The `simpleio` module contains classes to provide simple access to IO.
+
+* Author(s): Scott Shawcroft
+"""
+import time
+import sys
+import array
+import digitalio
+import pwmio
+
+try:
+ # RawSample was moved in CircuitPython 5.x.
+ if sys.implementation.version[0] >= 5:
+ import audiocore
+ else:
+ import audioio as audiocore
+ # Some boards have AudioOut (true DAC), others have PWMAudioOut.
+ try:
+ from audioio import AudioOut
+ except ImportError:
+ from audiopwmio import PWMAudioOut as AudioOut
+except ImportError:
+ pass # not always supported by every board!
+
+__version__ = "0.0.0-auto.0"
+__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_SimpleIO.git"
+
+
+def tone(pin, frequency, duration=1, length=100):
+ """
+ Generates a square wave of the specified frequency on a pin
+
+ :param ~microcontroller.Pin pin: Pin on which to output the tone
+ :param float frequency: Frequency of tone in Hz
+ :param int length: Variable size buffer (optional)
+ :param int duration: Duration of tone in seconds (optional)
+ """
+ if length * frequency > 350000:
+ length = 350000 // frequency
+ try:
+ # pin with PWM
+ # pylint: disable=no-member
+ with pwmio.PWMOut(
+ pin, frequency=int(frequency), variable_frequency=False
+ ) as pwm:
+ pwm.duty_cycle = 0x8000
+ time.sleep(duration)
+ # pylint: enable=no-member
+ except ValueError:
+ # pin without PWM
+ sample_length = length
+ square_wave = array.array("H", [0] * sample_length)
+ for i in range(sample_length / 2):
+ square_wave[i] = 0xFFFF
+ square_wave_sample = audiocore.RawSample(square_wave)
+ square_wave_sample.sample_rate = int(len(square_wave) * frequency)
+ with AudioOut(pin) as dac:
+ if not dac.playing:
+ dac.play(square_wave_sample, loop=True)
+ time.sleep(duration)
+ dac.stop()
+
+
+def bitWrite(x, n, b): # pylint: disable-msg=invalid-name
+ """
+ Based on the Arduino bitWrite function, changes a specific bit of a value to 0 or 1.
+ The return value is the original value with the changed bit.
+ This function is written for use with 8-bit shift registers
+
+ :param x: numeric value
+ :param n: position to change starting with least-significant (right-most) bit as 0
+ :param b: value to write (0 or 1)
+ """
+ if b == 1:
+ x |= 1 << n & 255
+ else:
+ x &= ~(1 << n) & 255
+ return x
+
+
+def shift_in(data_pin, clock, msb_first=True):
+ """
+ Shifts in a byte of data one bit at a time. Starts from either the LSB or
+ MSB.
+
+ .. warning:: Data and clock are swapped compared to other CircuitPython libraries
+ in order to match Arduino.
+
+ :param ~digitalio.DigitalInOut data_pin: pin on which to input each bit
+ :param ~digitalio.DigitalInOut clock: toggles to signal data_pin reads
+ :param bool msb_first: True when the first bit is most significant
+ :return: returns the value read
+ :rtype: int
+ """
+
+ value = 0
+ i = 0
+
+ for i in range(0, 8):
+ if msb_first:
+ value |= (data_pin.value) << (7 - i)
+ else:
+ value |= (data_pin.value) << i
+ # toggle clock True/False
+ clock.value = True
+ clock.value = False
+ i += 1
+ return value
+
+
+def shift_out(data_pin, clock, value, msb_first=True, bitcount=8):
+ """
+ Shifts out a byte of data one bit at a time. Data gets written to a data
+ pin. Then, the clock pulses hi then low
+
+ .. warning:: Data and clock are swapped compared to other CircuitPython libraries
+ in order to match Arduino.
+
+ :param ~digitalio.DigitalInOut data_pin: value bits get output on this pin
+ :param ~digitalio.DigitalInOut clock: toggled once the data pin is set
+ :param bool msb_first: True when the first bit is most significant
+ :param int value: byte to be shifted
+ :param unsigned bitcount: number of bits to shift
+
+ Example for Metro M0 Express:
+
+ .. code-block:: python
+
+ import digitalio
+ import simpleio
+ from board import *
+ clock = digitalio.DigitalInOut(D12)
+ data_pin = digitalio.DigitalInOut(D11)
+ latchPin = digitalio.DigitalInOut(D10)
+ clock.direction = digitalio.Direction.OUTPUT
+ data_pin.direction = digitalio.Direction.OUTPUT
+ latchPin.direction = digitalio.Direction.OUTPUT
+
+ while True:
+ valueSend = 500
+ # shifting out least significant bits
+ # must toggle latchPin.value before and after shift_out to push to IC chip
+ # this sample code was tested using
+ latchPin.value = False
+ simpleio.shift_out(data_pin, clock, (valueSend>>8), msb_first = False)
+ latchPin.value = True
+ time.sleep(1.0)
+ latchPin.value = False
+ simpleio.shift_out(data_pin, clock, valueSend, msb_first = False)
+ latchPin.value = True
+ time.sleep(1.0)
+
+ # shifting out most significant bits
+ latchPin.value = False
+ simpleio.shift_out(data_pin, clock, (valueSend>>8))
+ latchPin.value = True
+ time.sleep(1.0)
+ latchpin.value = False
+ simpleio.shift_out(data_pin, clock, valueSend)
+ latchpin.value = True
+ time.sleep(1.0)
+ """
+ if bitcount < 0 or bitcount > 32:
+ raise ValueError("bitcount must be in range 0..32 inclusive")
+
+ if msb_first:
+ bitsequence = lambda: range(bitcount - 1, -1, -1)
+ else:
+ bitsequence = lambda: range(0, bitcount)
+
+ for i in bitsequence():
+ tmpval = bool(value & (1 << i))
+ data_pin.value = tmpval
+ # toggle clock pin True/False
+ clock.value = True
+ clock.value = False
+
+
+class DigitalOut:
+ """
+ Simple digital output that is valid until reload.
+
+ :param pin microcontroller.Pin: output pin
+ :param value bool: default value
+ :param drive_mode digitalio.DriveMode: drive mode for the output
+ """
+
+ def __init__(self, pin, **kwargs):
+ self.iopin = digitalio.DigitalInOut(pin)
+ self.iopin.switch_to_output(**kwargs)
+
+ @property
+ def value(self):
+ """The digital logic level of the output pin."""
+ return self.iopin.value
+
+ @value.setter
+ def value(self, value):
+ self.iopin.value = value
+
+
+class DigitalIn:
+ """
+ Simple digital input that is valid until reload.
+
+ :param pin microcontroller.Pin: input pin
+ :param pull digitalio.Pull: pull configuration for the input
+ """
+
+ def __init__(self, pin, **kwargs):
+ self.iopin = digitalio.DigitalInOut(pin)
+ self.iopin.switch_to_input(**kwargs)
+
+ @property
+ def value(self):
+ """The digital logic level of the input pin."""
+ return self.iopin.value
+
+ @value.setter
+ def value(self, value): # pylint: disable-msg=no-self-use, unused-argument
+ raise AttributeError("Cannot set the value on a digital input.")
+
+
+def map_range(x, in_min, in_max, out_min, out_max):
+ """
+ Maps a number from one range to another.
+ Note: This implementation handles values < in_min differently than arduino's map function does.
+
+ :return: Returns value mapped to new range
+ :rtype: float
+ """
+ in_range = in_max - in_min
+ in_delta = x - in_min
+ if in_range != 0:
+ mapped = in_delta / in_range
+ elif in_delta != 0:
+ mapped = in_delta
+ else:
+ mapped = 0.5
+ mapped *= out_max - out_min
+ mapped += out_min
+ if out_min <= out_max:
+ return max(min(mapped, out_max), out_min)
+ return min(max(mapped, out_max), out_min)