re-upload; fork was detached
This commit is contained in:
parent
3fd7e2c4d5
commit
64700c7f37
17 changed files with 1678 additions and 0 deletions
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
__pycache__
|
||||
_build
|
||||
*.pyc
|
||||
.env
|
||||
build*
|
||||
bundles
|
||||
433
.pylintrc
Normal file
433
.pylintrc
Normal file
|
|
@ -0,0 +1,433 @@
|
|||
[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
|
||||
jobs=2
|
||||
|
||||
# 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
|
||||
|
||||
# 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=
|
||||
|
||||
# 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=no
|
||||
|
||||
# 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
|
||||
3
.readthedocs.yml
Normal file
3
.readthedocs.yml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
python:
|
||||
version: 3
|
||||
requirements_file: requirements.txt
|
||||
32
.travis.yml
Normal file
32
.travis.yml
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
# This is a common .travis.yml for generating library release zip files for
|
||||
# CircuitPython library releases using circuitpython-build-tools.
|
||||
# See https://github.com/adafruit/circuitpython-build-tools for detailed setup
|
||||
# instructions.
|
||||
|
||||
dist: trusty
|
||||
sudo: false
|
||||
language: python
|
||||
python:
|
||||
- "3.6"
|
||||
|
||||
cache:
|
||||
pip: true
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key: $GITHUB_TOKEN
|
||||
file_glob: true
|
||||
file: bundles/*
|
||||
skip_cleanup: true
|
||||
overwrite: true
|
||||
on:
|
||||
tags: true
|
||||
|
||||
install:
|
||||
- pip install pylint circuitpython-build-tools Sphinx sphinx-rtd-theme
|
||||
|
||||
script:
|
||||
- pylint adafruit_trellis/*.py
|
||||
- ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace examples/*.py)
|
||||
- circuitpython-build-bundles --filename_prefix adafruit-circuitpython-trellis --library_location .
|
||||
- cd docs && sphinx-build -E -W -b html . _build/html
|
||||
74
CODE_OF_CONDUCT.md
Normal file
74
CODE_OF_CONDUCT.md
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers 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 of experience,
|
||||
nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* 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 unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* 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 in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers 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 maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at support@adafruit.com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2017 Michael Schroeder
|
||||
|
||||
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.
|
||||
116
README.rst
Normal file
116
README.rst
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
Introduction
|
||||
============
|
||||
|
||||
.. image:: https://readthedocs.org/projects/adafruit-circuitpython-trellis/badge/?version=latest
|
||||
:target: https://circuitpython.readthedocs.io/projects/trellis/en/latest/
|
||||
:alt: Documentation Status
|
||||
|
||||
.. image:: https://img.shields.io/discord/327254708534116352.svg
|
||||
:target: https://discord.gg/nBQh6qu
|
||||
:alt: Discord
|
||||
|
||||
.. image:: https://travis-ci.org/adafruit/adafruit_CircuitPython_Trellis.svg?branch=master
|
||||
:target: https://travis-ci.org/adafruit/adafruit_CircuitPython_Trellis
|
||||
:alt: Build Status
|
||||
|
||||
This library will allow you to control the LEDs and read button presses on the `Adafruit Trellis
|
||||
Board <https://www.adafruit.com/product/1616>`_. It will work with a single Trellis board, or
|
||||
with a matrix of up to 8 Trellis boards.
|
||||
|
||||
For more details, see the `Adafruit Trellis Learn Guide <https://learn.adafruit.com/adafruit-trellis-diy-open-source-led-keypad>`_.
|
||||
|
||||
Dependencies
|
||||
=============
|
||||
This driver depends on:
|
||||
|
||||
* `Adafruit CircuitPython 2.0.0+ <https://github.com/adafruit/circuitpython>`_
|
||||
* `Bus Device <https://github.com/adafruit/Adafruit_CircuitPython_BusDevice>`_
|
||||
|
||||
Please ensure all dependencies are available on the CircuitPython filesystem.
|
||||
This is easily achieved by downloading
|
||||
`the Adafruit library and driver bundle <https://github.com/adafruit/Adafruit_CircuitPython_Bundle>`_.
|
||||
|
||||
Usage Example
|
||||
=============
|
||||
|
||||
.. code:: python
|
||||
|
||||
import time
|
||||
import busio
|
||||
from board import SCL, SDA
|
||||
from adafruit_trellis import trellis
|
||||
|
||||
# Create the I2C interface
|
||||
i2c = busio.I2C(SCL, SDA)
|
||||
|
||||
# Create a Trellis object for each board
|
||||
trellis = trellis.TRELLIS(i2c) # 0x70 when no I2C address is supplied
|
||||
|
||||
# Turn on every LED
|
||||
print('Turning all LEDs on...')
|
||||
trellis.fill(1)
|
||||
trellis.show()
|
||||
time.sleep(2)
|
||||
|
||||
# Turn off every LED
|
||||
print('Turning all LEDs off...')
|
||||
trellis.fill(0)
|
||||
trellis.show()
|
||||
time.sleep(2)
|
||||
|
||||
Contributing
|
||||
============
|
||||
|
||||
Contributions are welcome! Please read our `Code of Conduct
|
||||
<https://github.com/adafruit/adafruit_CircuitPython_Trellis/blob/master/CODE_OF_CONDUCT.md>`_
|
||||
before contributing to help this project stay welcoming.
|
||||
|
||||
Building locally
|
||||
================
|
||||
|
||||
Zip release files
|
||||
-----------------
|
||||
|
||||
To build this library locally you'll need to install the
|
||||
`circuitpython-build-tools <https://github.com/adafruit/circuitpython-build-tools>`_ package.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
python3 -m venv .env
|
||||
source .env/bin/activate
|
||||
pip install circuitpython-build-tools
|
||||
|
||||
Once installed, make sure you are in the virtual environment:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
source .env/bin/activate
|
||||
|
||||
Then run the build:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
circuitpython-build-bundles --filename_prefix adafruit-circuitpython-trellis --library_location .
|
||||
|
||||
Sphinx documentation
|
||||
-----------------------
|
||||
|
||||
Sphinx is used to build the documentation based on rST files and comments in the code. First,
|
||||
install dependencies (feel free to reuse the virtual environment from above):
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
python3 -m venv .env
|
||||
source .env/bin/activate
|
||||
pip install Sphinx sphinx-rtd-theme
|
||||
|
||||
Now, once you have the virtual environment activated:
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
cd docs
|
||||
sphinx-build -E -W -b html . _build/html
|
||||
|
||||
This will output the documentation to ``docs/_build/html``. Open the index.html in your browser to
|
||||
view them. It will also (due to -W) error out on any warning like Travis will. This is a good way to
|
||||
locally verify it will pass.
|
||||
264
adafruit_trellis/trellis.py
Normal file
264
adafruit_trellis/trellis.py
Normal file
|
|
@ -0,0 +1,264 @@
|
|||
# This is a library for the Adafruit Trellis w/HT16K33
|
||||
#
|
||||
# Designed specifically to work with the Adafruit Trellis
|
||||
# ----> https://www.adafruit.com/products/1616
|
||||
# ----> https://www.adafruit.com/products/1611
|
||||
#
|
||||
# These displays use I2C to communicate, 2 pins are required to
|
||||
# interface
|
||||
# Adafruit invests time and resources providing this open source code,
|
||||
# please support Adafruit and open-source hardware by purchasing
|
||||
# products from Adafruit!
|
||||
#
|
||||
# Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
# MIT license, all text above must be included in any redistribution
|
||||
#
|
||||
# Also utilized functions from the CircuitPython HT16K33 library
|
||||
# written by Radomir Dopieralski & Tony DiCola for Adafruit Industries
|
||||
# https://github.com/adafruit/Adafruit_CircuitPython_HT16K33
|
||||
#
|
||||
# CircuitPython Library Author: Michael Schroeder(sommersoft). No
|
||||
# affiliation to Adafruit is implied.
|
||||
"""
|
||||
`adafruit_trellis` - Adafruit Trellis Monochrome 4x4 LED Backlit Keypad
|
||||
====================================================
|
||||
|
||||
CircuitPython library to support Adafruit's Trellis Keypad.
|
||||
|
||||
* Author(s): Limor Fried, Radomir Dopieralski, Tony DiCola,
|
||||
and Michael Schroeder
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Hardware:**
|
||||
|
||||
* Adafruit `Trellis Monochrome 4x4 LED Backlit Keypad
|
||||
<https://www.adafruit.com/product/1616>`_ (Product ID: 1616)
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware (2.2.0+) for the ESP8622 and M0-based boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
|
||||
"""
|
||||
|
||||
__version__ = "1.0.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Trellis.git"
|
||||
|
||||
from micropython import const
|
||||
from adafruit_bus_device import i2c_device
|
||||
|
||||
# HT16K33 Command Contstants
|
||||
# pylint: disable=bad-whitespace, invalid-name
|
||||
_HT16K33_OSCILATOR_ON = const(0x21)
|
||||
_HT16K33_BLINK_CMD = const(0x80)
|
||||
_HT16K33_BLINK_DISPLAYON = const(0x01)
|
||||
_HT16K33_CMD_BRIGHTNESS = const(0xE0)
|
||||
_HT16K33_KEY_READ_CMD = const(0x40)
|
||||
|
||||
# LED Lookup Table
|
||||
ledLUT = (0x3A, 0x37, 0x35, 0x34,
|
||||
0x28, 0x29, 0x23, 0x24,
|
||||
0x16, 0x1B, 0x11, 0x10,
|
||||
0x0E, 0x0D, 0x0C, 0x02)
|
||||
|
||||
# Button Loookup Table
|
||||
buttonLUT = (0x07, 0x04, 0x02, 0x22,
|
||||
0x05, 0x06, 0x00, 0x01,
|
||||
0x03, 0x10, 0x30, 0x21,
|
||||
0x13, 0x12, 0x11, 0x31)
|
||||
# pylint: enable=bad-whitespace, invalid-name
|
||||
|
||||
class TRELLIS:
|
||||
"""
|
||||
Driver base for a single Trellis Board
|
||||
|
||||
:param ~busio.I2C i2c: The `busio.I2C` object to use. This is the only required parameter
|
||||
when using a single Trellis board.
|
||||
:param int address: The I2C address of the Trellis board you're using. Defaults to `0x70`
|
||||
which is the default address for Trellis boards. See Trellis product
|
||||
guide for using different/multiple I2C addresses.
|
||||
https://learn.adafruit.com/adafruit-trellis-diy-open-source-led-keypad
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import time
|
||||
import busio
|
||||
import board
|
||||
from adafruit_trellis import trellis
|
||||
|
||||
i2c = busio.I2C(board.SCL, board.SDA)
|
||||
trellis = trellis.TRELLIS(i2c)
|
||||
print('Starting button sensory loop...')
|
||||
while True:
|
||||
try:
|
||||
if trellis.read_buttons():
|
||||
for i in range(16):
|
||||
if trellis.just_pressed(i):
|
||||
print('Button', i + 1, 'was just pressed!')
|
||||
trellis.led_on(i)
|
||||
trellis.show()
|
||||
for i in range(16):
|
||||
if trellis.just_released(i):
|
||||
print('Button', i + 1, 'was just released!')
|
||||
trellis.led_off(i)
|
||||
trellis.show()
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
time.sleep(.1)
|
||||
"""
|
||||
def __init__(self, i2c, address=0x70):
|
||||
self.i2c_device = i2c_device.I2CDevice(i2c, address)
|
||||
self._temp = bytearray(1)
|
||||
self._led_buffer = bytearray(17)
|
||||
self._buttons_buffer = bytearray(6)
|
||||
self._last_buttons = bytearray(6)
|
||||
self._blink_rate = None
|
||||
self._brightness = None
|
||||
|
||||
self.fill(0)
|
||||
self._write_cmd(_HT16K33_OSCILATOR_ON)
|
||||
self.blink_rate(0)
|
||||
self.brightness(15)
|
||||
|
||||
def _write_cmd(self, byte):
|
||||
self._temp[0] = byte
|
||||
with self.i2c_device:
|
||||
self.i2c_device.write(self._temp)
|
||||
|
||||
def blink_rate(self, rate=None):
|
||||
"""
|
||||
Get or set the blink rate.
|
||||
|
||||
:param int rate: (Optional) Range 0-3. If no parameter is given, current
|
||||
blink rate is returned.
|
||||
|
||||
"""
|
||||
if rate is None:
|
||||
return self._blink_rate
|
||||
rate = rate & 0x03
|
||||
self._blink_rate = rate
|
||||
self._write_cmd(_HT16K33_BLINK_CMD |
|
||||
_HT16K33_BLINK_DISPLAYON | rate << 1)
|
||||
return None
|
||||
|
||||
def brightness(self, brightness):
|
||||
"""
|
||||
Get or set the brightness.
|
||||
|
||||
:param int brightness: (Optional) Range 0-15. If no parameter is given, current
|
||||
brightness is returned.
|
||||
|
||||
"""
|
||||
if brightness is None:
|
||||
return self._brightness
|
||||
brightness = brightness & 0x0F
|
||||
self._brightness = brightness
|
||||
self._write_cmd(_HT16K33_CMD_BRIGHTNESS | brightness)
|
||||
return None
|
||||
|
||||
def show(self):
|
||||
"""Refresh the LED buffer and show the changes."""
|
||||
with self.i2c_device:
|
||||
# Byte 0 is 0x00, address of LED data register. The remaining 16
|
||||
# bytes are the display register data to set.
|
||||
self.i2c_device.write(self._led_buffer)
|
||||
|
||||
def led_on(self, x):
|
||||
"""
|
||||
Turns an LED on. Must call `[trellis].show()` afterwards to update the matrix.
|
||||
|
||||
:param int x: LED number (1-16) to turn on.
|
||||
"""
|
||||
if 0 < x > 15:
|
||||
raise ValueError('LED number must be between 0-15 (pyhsical LED - 1)')
|
||||
led = ledLUT[x] >> 4
|
||||
mask = 1 << (ledLUT[x] & 0x0f)
|
||||
self._led_buffer[(led * 2) + 1] |= mask
|
||||
self._led_buffer[(led * 2) + 2] |= mask >> 8
|
||||
|
||||
def led_off(self, x):
|
||||
"""
|
||||
Turns an LED off. Must call `[trellis].show()` to update the matrix.
|
||||
|
||||
:param int x: LED number (0-15) to turn off.
|
||||
"""
|
||||
if 0 < x > 15:
|
||||
raise ValueError('LED number must be between 0-15 (pyhsical LED - 1)')
|
||||
led = ledLUT[x] >> 4
|
||||
mask = 1 << (ledLUT[x] & 0x0f)
|
||||
self._led_buffer[(led * 2) + 1] &= ~mask
|
||||
self._led_buffer[(led * 2) + 2] &= ~mask >> 8
|
||||
|
||||
def led_status(self, x):
|
||||
"""
|
||||
Gives the current status of an LED: True == ON, False == OFF.
|
||||
|
||||
:param int x: LED number (0-15) to check.
|
||||
"""
|
||||
if 1 < x > 16:
|
||||
raise ValueError('LED number must be between 0-15 (pyhsical LED - 1)')
|
||||
led = ledLUT[x] >> 4
|
||||
mask = 1 << (ledLUT[x] & 0x0f)
|
||||
return bool(((self._led_buffer[(led * 2) + 1] | \
|
||||
self._led_buffer[(led * 2) + 2] << 8) & mask) > 0)
|
||||
|
||||
def fill(self, color):
|
||||
"""
|
||||
Fill the whole board with the given color.
|
||||
|
||||
:param int color: 0 == OFF, > 0 == ON
|
||||
|
||||
"""
|
||||
fill = 0xff if color else 0x00
|
||||
for i in range(16):
|
||||
self._led_buffer[i+1] = fill
|
||||
|
||||
def read_buttons(self):
|
||||
"""Read the button matrix register on the Trellis"""
|
||||
self._last_buttons[:] = self._buttons_buffer[:]
|
||||
self._write_cmd(_HT16K33_KEY_READ_CMD)
|
||||
with self.i2c_device:
|
||||
self.i2c_device.readinto(self._buttons_buffer)
|
||||
return bool(self._last_buttons != self._buttons_buffer)
|
||||
|
||||
def _is_pressed(self, button):
|
||||
if button > 15:
|
||||
return None
|
||||
mask = 1 << (buttonLUT[button] & 0x0f)
|
||||
return self._buttons_buffer[(buttonLUT[button] >> 4)] & mask
|
||||
|
||||
def _was_pressed(self, button):
|
||||
if button > 15:
|
||||
return None
|
||||
mask = 1 << (buttonLUT[button] & 0x0f)
|
||||
return self._last_buttons[(buttonLUT[button] >> 4)] & mask
|
||||
|
||||
def just_pressed(self, button):
|
||||
"""
|
||||
Checks if a button was/is depressed. If return value is above zero then
|
||||
the button was/is depressed. Returns zero otherwise.
|
||||
|
||||
:param int x: Button number (0-15) to check.
|
||||
"""
|
||||
if button > 15:
|
||||
raise ValueError('Button must be between 0-15 (pyhsical button - 1)')
|
||||
# pylint: disable=invalid-unary-operand-type
|
||||
return self._is_pressed(button) & ~self._was_pressed(button)
|
||||
# pylint: enable=invalid-unary-operand-type
|
||||
|
||||
def just_released(self, button):
|
||||
"""
|
||||
Checks if a button was/is released. If return value is above zero then
|
||||
the button was/is released. Returns zero otherwise.
|
||||
|
||||
:param int x: Button number (0-15) to check.
|
||||
"""
|
||||
if button > 15:
|
||||
raise ValueError('Button must be between 0-15 (pyhsical button - 1)')
|
||||
# pylint: disable=invalid-unary-operand-type
|
||||
return ~self._is_pressed(button) & self._was_pressed(button)
|
||||
# pylint: enable=invalid-unary-operand-type
|
||||
362
adafruit_trellis/trellis_set.py
Normal file
362
adafruit_trellis/trellis_set.py
Normal file
|
|
@ -0,0 +1,362 @@
|
|||
# This is a library for the Adafruit Trellis w/HT16K33
|
||||
#
|
||||
# Designed specifically to work with the Adafruit Trellis
|
||||
# ----> https://www.adafruit.com/products/1616
|
||||
# ----> https://www.adafruit.com/products/1611
|
||||
#
|
||||
# These displays use I2C to communicate, 2 pins are required to
|
||||
# interface
|
||||
# Adafruit invests time and resources providing this open source code,
|
||||
# please support Adafruit and open-source hardware by purchasing
|
||||
# products from Adafruit!
|
||||
#
|
||||
# Written by Limor Fried/Ladyada for Adafruit Industries.
|
||||
# MIT license, all text above must be included in any redistribution
|
||||
#
|
||||
# Also utilized functions from the following two libraries:
|
||||
# - CircuitPython HT16K33 library written by Radomir Dopieralski &
|
||||
# Tony DiCola for Adafruit Industries
|
||||
# https://github.com/adafruit/Adafruit_CircuitPython_HT16K33
|
||||
#
|
||||
# - Python Trellis library written by Tony DiCola
|
||||
# https://github.com/tdicola/Adafruit_Trellis_Python
|
||||
#
|
||||
# CircuitPython Library Author: Michael Schroeder(sommersoft). No
|
||||
# affiliation to Adafruit is implied.
|
||||
"""
|
||||
`adafruit_trellis` - Adafruit Trellis Monochrome 4x4 LED Backlit Keypad
|
||||
====================================================
|
||||
|
||||
CircuitPython library to support Adafruit's Trellis Keypad.
|
||||
|
||||
* Author(s): Limor Fried, Radomir Dopieralski, Tony DiCola,
|
||||
and Michael Schroeder
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
|
||||
**Hardware:**
|
||||
|
||||
* Adafruit `Trellis Monochrome 4x4 LED Backlit Keypad
|
||||
<https://www.adafruit.com/product/1616>`_ (Product ID: 1616)
|
||||
|
||||
**Software and Dependencies:**
|
||||
|
||||
* Adafruit CircuitPython firmware (2.2.0+) for the ESP8622 and M0-based boards:
|
||||
https://github.com/adafruit/circuitpython/releases
|
||||
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
|
||||
* Adafruit_CircuitPython_Trellis base library (trellis.py)
|
||||
"""
|
||||
|
||||
__version__ = "1.0.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Trellis.git"
|
||||
|
||||
|
||||
class MATRIX(object):
|
||||
"""
|
||||
Driver base for a matrix of Trellis Boards (up to 8)
|
||||
See Trellis product guide for using different/multiple I2C addresses.
|
||||
https://learn.adafruit.com/adafruit-trellis-diy-open-source-led-keypad
|
||||
|
||||
:param ~trellis.TRELLIS object: A list of `trellis.TRELLIS` objects to
|
||||
use in the matrix. Each object needs its
|
||||
own I2C address.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import time
|
||||
import busio
|
||||
from board import SCL, SDA
|
||||
from adafruit_trellis import trellis
|
||||
from adafruit_trellis import trellis_set
|
||||
|
||||
i2c = busio.I2C(SCL, SDA)
|
||||
matrix1 = trellis.TRELLIS(i2c) #omitting the address defaults to 0x70
|
||||
matrix2 = trellis.TRELLIS(i2c, 0x72)
|
||||
trelly = trellis_set.MATRIX(matrix1, matrix2)
|
||||
|
||||
while True:
|
||||
try:
|
||||
if trelly.read_buttons():
|
||||
for i in range(32):
|
||||
if trelly.just_pressed(i):
|
||||
print('Button', i + 1, 'was just pressed!')
|
||||
trelly.led_on(i)
|
||||
trelly.show()
|
||||
for i in range(32):
|
||||
if trelly.just_released(i):
|
||||
print('Button', i + 1, 'was just released!')
|
||||
trelly.led_off(i)
|
||||
trelly.show()
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
time.sleep(.1)
|
||||
"""
|
||||
|
||||
def __init__(self, *matrices):
|
||||
self._matrices = []
|
||||
if not matrices:
|
||||
raise ValueError('You must include at least one Trellis object.')
|
||||
elif len(matrices) > 8:
|
||||
raise ValueError('A maximum of 8 Trellis objects can be used. You',
|
||||
'have attempted to use:', len(matrices))
|
||||
|
||||
for matrix in matrices:
|
||||
if matrix.__qualname__ != 'TRELLIS':
|
||||
raise ValueError('Only Trellis objects can be used with a MATRIX.',
|
||||
matrix, 'is not a Trellis object.')
|
||||
if matrix not in self._matrices:
|
||||
self._matrices.append(matrix)
|
||||
else:
|
||||
print(matrix, 'already added to matrices. Moving to next.')
|
||||
|
||||
def _get_matrix(self, position):
|
||||
"""
|
||||
Get the matrix for the associated global LED/key position.
|
||||
Returns a tuple with matrix, and local position inside that matrix.
|
||||
If position is not within the range of possible values, returns None.
|
||||
"""
|
||||
if position > (16 * len(self._matrices)) or position < 0:
|
||||
# pylint: disable=multiple-statements
|
||||
return None, None
|
||||
# pylint: enable=multiple-statements
|
||||
matrix = int(position / 16)
|
||||
offset = position % 16
|
||||
return self._matrices[matrix], offset
|
||||
|
||||
def blink_rate(self, rate, *matrices):
|
||||
"""
|
||||
Set the blink rate.
|
||||
|
||||
:param int brightness: Range 0-3.
|
||||
:param ~trellis.TRELLIS object(s): list of `trellis.TRELLIS` objects
|
||||
you wish to change the blink rate
|
||||
of. Only required if you don't want
|
||||
to update ALL `trellis_set.MATRIX`
|
||||
objects.
|
||||
|
||||
"""
|
||||
if not matrices:
|
||||
for matrix in self._matrices:
|
||||
matrix.blink_rate(rate)
|
||||
|
||||
for matrix in matrices:
|
||||
matrix.blink_rate(rate)
|
||||
|
||||
def brightness(self, brightness, *matrices):
|
||||
"""
|
||||
Set the brightness.
|
||||
|
||||
:param int brightness: Range 0-15.
|
||||
:param ~trellis.TRELLIS object(s): list of `trellis.TRELLIS` objects
|
||||
you wish to change the brightness
|
||||
of. Only required if you don't want
|
||||
to update ALL `trellis_set.MATRIX`
|
||||
objects.
|
||||
"""
|
||||
if not matrices:
|
||||
for matrix in self._matrices:
|
||||
matrix.brightness(brightness)
|
||||
|
||||
for matrix in matrices:
|
||||
matrix.brightness(brightness)
|
||||
|
||||
def show(self, *matrices):
|
||||
"""
|
||||
Refresh the matrix and show the changes.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` objects
|
||||
you wish refresh.
|
||||
Only required if you want to turn
|
||||
on an LED on a specific Trellis
|
||||
board.
|
||||
"""
|
||||
if not matrices:
|
||||
for matrix in self._matrices:
|
||||
matrix.show()
|
||||
|
||||
for matrix in matrices:
|
||||
matrix.show()
|
||||
|
||||
def led_on(self, x, *matrices):
|
||||
"""
|
||||
Turn on the specified LED in the display buffer. Must call
|
||||
`[trellis].show()` afterwards to update the matrix.
|
||||
|
||||
:param int x: Number of LED you wish to turn on. When not including
|
||||
specific `trellis.TRELLIS` objects (`*matrices` param),
|
||||
the range of `x` is 0 to the maximum number of LEDs you
|
||||
have (4 Trellis boards: 0-63). When using `*matrices`,
|
||||
the range of `x` is 0-15 for the LED on each Trellis.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` objects
|
||||
you wish to turn on the LED `x`.
|
||||
Only required if you want to turn
|
||||
on an LED on a specific Trellis
|
||||
board.
|
||||
"""
|
||||
if not matrices:
|
||||
# pylint: disable=multiple-statements
|
||||
matrix, led = self._get_matrix(x)
|
||||
# pylint: enable=multiple-statements
|
||||
if matrix is None:
|
||||
return False
|
||||
return matrix.led_on(led)
|
||||
|
||||
for matrix in matrices:
|
||||
return matrix.led_on(x)
|
||||
|
||||
def led_off(self, x, *matrices):
|
||||
"""
|
||||
Turn off the specified LED in the display buffer. Must call
|
||||
`[trellis].show()` afterwards to update the matrix.
|
||||
|
||||
:param int x: Number of LED you wish to turn off. When not including
|
||||
specific `trellis.TRELLIS` objects (`*matrices` param),
|
||||
the range of `x` is 0 to the maximum number of LEDs you
|
||||
have (4 Trellis boards: 0-63). When using `*matrices`,
|
||||
the range of `x` is 0-15 for the LED on each Trellis.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` objects
|
||||
you wish to turn off the LED `x`.
|
||||
Only required if you want to turn
|
||||
off an LED on a specific Trellis
|
||||
board.
|
||||
"""
|
||||
if not matrices:
|
||||
# pylint: disable=multiple-statements
|
||||
matrix, led = self._get_matrix(x)
|
||||
# pylint: enable=multiple-statements
|
||||
if matrix is None:
|
||||
return False
|
||||
return matrix.led_off(led)
|
||||
|
||||
for matrix in matrices:
|
||||
return matrix.led_off(x)
|
||||
|
||||
def led_status(self, x, *matrices):
|
||||
"""
|
||||
Gives the current status of an LED: True == ON, False == OFF
|
||||
|
||||
:param int x: Number of LED you wish to check. When not including
|
||||
specific `trellis.TRELLIS` objects (`*matrices` param),
|
||||
the range of `x` is 0 to the maximum number of LEDs you
|
||||
have (4 Trellis boards: 0-63). When using `*matrices`,
|
||||
the range of `x` is 0-15 for the LED on each Trellis.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` objects
|
||||
you wish to check the LED `x`.
|
||||
Only required if you want to check
|
||||
an LED on a specific Trellis board.
|
||||
"""
|
||||
if not matrices:
|
||||
# pylint: disable=multiple-statements
|
||||
matrix, led = self._get_matrix(x)
|
||||
# pylint: enable=multiple-statements
|
||||
if matrix is None:
|
||||
return False
|
||||
return matrix.led_status(led)
|
||||
|
||||
for matrix in matrices:
|
||||
return matrix.led_status(x)
|
||||
|
||||
def fill(self, color, *matrices):
|
||||
"""
|
||||
Fill the whole board/matrix with the given color.
|
||||
|
||||
:param int color: 0 == OFF, > 0 == ON
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` objects
|
||||
you wish to fill with the given color.
|
||||
Only required if you want to fill
|
||||
the color on a specific Trellis board.
|
||||
"""
|
||||
if not matrices:
|
||||
for matrix in self._matrices:
|
||||
matrix.fill(color)
|
||||
|
||||
for matrix in matrices:
|
||||
matrix.fill(color)
|
||||
|
||||
def read_buttons(self, *matrices):
|
||||
"""
|
||||
Read the button matrix register on the Trellis.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` object(s)
|
||||
you wish to read the button matrix of.
|
||||
Only required if you want to read the
|
||||
the buttons on a specific Trellis board.
|
||||
"""
|
||||
read_results = False
|
||||
if not matrices:
|
||||
for matrix in self._matrices:
|
||||
read_results |= matrix.read_buttons()
|
||||
else:
|
||||
for matrix in matrices:
|
||||
read_results |= matrix.read_buttons()
|
||||
|
||||
return read_results
|
||||
|
||||
def just_pressed(self, button, *matrices):
|
||||
"""
|
||||
Checks if a button was/is depressed. If return value is above zero then
|
||||
the button was/is depressed. Returns zero otherwise.
|
||||
|
||||
:param int button: Number of the button you wish to check.
|
||||
When not including specific `trellis.TRELLIS` objects
|
||||
(`*matrices` param), the range of `x` is 0 to the
|
||||
maximum number of buttons available (4 boards: 0-63).
|
||||
When using `*matrices`, the range of `button` is 0-15
|
||||
for the button on each Trellis.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` object you
|
||||
wish to check the button on.
|
||||
Only required if you want to read the
|
||||
the buttons on a specific Trellis board.
|
||||
"""
|
||||
if not matrices:
|
||||
# pylint: disable=multiple-statements
|
||||
matrix, key = self._get_matrix(button)
|
||||
# pylint: enable=multiple-statements
|
||||
if matrix is None:
|
||||
return False
|
||||
return matrix.just_pressed(key)
|
||||
|
||||
if len(matrices) > 1:
|
||||
raise ValueError('Only one matrix key can be checked at a time.')
|
||||
else:
|
||||
for matrix in matrices:
|
||||
return matrix.just_pressed(button)
|
||||
|
||||
def just_released(self, button, *matrices):
|
||||
"""
|
||||
Checks if a button was/is released. If return value is above zero then
|
||||
the button was/is released. Returns zero otherwise.
|
||||
|
||||
:param int button: Number of the button you wish to check.
|
||||
When not including specific `trellis.TRELLIS` objects
|
||||
(`*matrices` param), the range of `x` is 0 to the
|
||||
maximum number of buttons available (4 boards: 0-63).
|
||||
When using `*matrices`, the range of `button` is 0-15
|
||||
for the button on each Trellis.
|
||||
|
||||
:param ~trellis.TRELLIS *matrices: List of `trellis.TRELLIS` object you
|
||||
wish to check the button on.
|
||||
Only required if you want to read the
|
||||
the buttons on a specific Trellis board.
|
||||
"""
|
||||
if not matrices:
|
||||
# pylint: disable=multiple-statements
|
||||
matrix, key = self._get_matrix(button)
|
||||
# pylint: enable=multiple-statements
|
||||
if matrix is None:
|
||||
return False
|
||||
return matrix.just_released(key)
|
||||
|
||||
if len(matrices) > 1:
|
||||
raise ValueError('Only one matrix key can be checked at a time.')
|
||||
else:
|
||||
for matrix in matrices:
|
||||
return matrix.just_released(button)
|
||||
BIN
docs/_static/favicon.ico
vendored
Normal file
BIN
docs/_static/favicon.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
8
docs/api.rst
Normal file
8
docs/api.rst
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
.. If you created a package, create one automodule per module in the package.
|
||||
|
||||
.. automodule:: adafruit_trellis.trellis
|
||||
:members:
|
||||
|
||||
.. automodule:: adafruit_trellis.trellis_set
|
||||
:members:
|
||||
150
docs/conf.py
Normal file
150
docs/conf.py
Normal file
|
|
@ -0,0 +1,150 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
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.todo',
|
||||
]
|
||||
|
||||
# Uncomment the below if you use native CircuitPython modules such as
|
||||
# digitalio, micropython and busio. List the modules you use. Without it, the
|
||||
# autodoc module docs will fail to generate with a warning.
|
||||
# autodoc_mock_imports = ["digitalio", "busio"]
|
||||
|
||||
intersphinx_mapping = {'python': ('https://docs.python.org/3.4', None),'BusDevice': ('https://circuitpython.readthedocs.io/projects/bus_device/en/latest/', None),'Register': ('https://circuitpython.readthedocs.io/projects/register/en/latest/', None),'CircuitPython': ('https://circuitpython.readthedocs.io/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 = u'Adafruit Trellis Library'
|
||||
copyright = u'2017 Michael Schroeder'
|
||||
author = u'Michael Schroeder'
|
||||
|
||||
# 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 = u'1.0'
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
release = u'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']
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = 'AdafruitTrellisLibrarydoc'
|
||||
|
||||
# -- 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, 'AdafruitTrellisLibrary.tex', u'AdafruitTrellis Library Documentation',
|
||||
author, '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, 'AdafruitTrellislibrary', u'Adafruit Trellis 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, 'AdafruitTrellisLibrary', u'Adafruit Trellis Library Documentation',
|
||||
author, 'AdafruitTrellisLibrary', 'One line description of project.',
|
||||
'Miscellaneous'),
|
||||
]
|
||||
10
docs/examples.rst
Normal file
10
docs/examples.rst
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
Simple test
|
||||
------------
|
||||
|
||||
Ensure your device works with this simple test.
|
||||
|
||||
Single Adafruit Trellis Board
|
||||
|
||||
.. literalinclude:: ../examples/trellis_single_simpletest.py
|
||||
:caption: examples/trellis_single_simpletest.py
|
||||
:linenos:
|
||||
52
docs/index.rst
Normal file
52
docs/index.rst
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
.. 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
|
||||
|
||||
Adafruit Trellis Monochrome Driver PCB for 4x4 Keypad & 3mm LEDs <https://www.adafruit.com/product/1616>
|
||||
Silicone Elastomer 4x4 Button Keypad - for 3mm LEDs <https://www.adafruit.com/product/1611>
|
||||
Diffused Red 3mm LED (25 pack) <https://www.adafruit.com/product/777>
|
||||
Diffused Green 3mm LED (25 pack) <https://www.adafruit.com/product/779>
|
||||
Diffused Blue 3mm LED (25 pack) <https://www.adafruit.com/product/780>
|
||||
Diffused White 3mm LED (25 pack) <https://www.adafruit.com/product/778>
|
||||
|
||||
.. toctree::
|
||||
:caption: Other Links
|
||||
|
||||
Download <https://github.com/adafruit/adafruit_CircuitPython_Trellis/releases/latest>
|
||||
CircuitPython Reference Documentation <https://circuitpython.readthedocs.io>
|
||||
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`
|
||||
76
examples/trellis_set_simpletest.py
Normal file
76
examples/trellis_set_simpletest.py
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
# Basic example of turning on LEDs and handling Keypad
|
||||
# button activity.
|
||||
|
||||
# Import all board pins
|
||||
import time
|
||||
import busio
|
||||
from board import SCL, SDA
|
||||
from adafruit_trellis import trellis
|
||||
from adafruit_trellis import trellis_set
|
||||
|
||||
# Create the I2C interface
|
||||
i2c = busio.I2C(SCL, SDA)
|
||||
|
||||
# Create a Trellis object for each board
|
||||
matrix1 = trellis.TRELLIS(i2c, 0x72)
|
||||
matrix2 = trellis.TRELLIS(i2c) # 0x70 when no I2C address is supplied
|
||||
|
||||
# Create the Trellis matrix using the board
|
||||
# objects
|
||||
trellis = trellis_set.MATRIX(matrix1, matrix2)
|
||||
|
||||
# Turn on every LED
|
||||
print('Turning all LEDs on...')
|
||||
trellis.fill(1)
|
||||
trellis.show()
|
||||
time.sleep(2)
|
||||
|
||||
# Turn off every LED
|
||||
print('Turning all LEDs off...')
|
||||
trellis.fill(0)
|
||||
trellis.show()
|
||||
time.sleep(2)
|
||||
|
||||
# Turn on every LED, one at a time
|
||||
print('Turning on each LED, one at a time...')
|
||||
for i in range(32):
|
||||
trellis.led_on(i)
|
||||
trellis.show()
|
||||
time.sleep(.1)
|
||||
|
||||
# Turn off every LED, one at a time
|
||||
print('Turning off each LED, one at a time...')
|
||||
for i in range(31,0,-1):
|
||||
trellis.led_off(i)
|
||||
trellis.show()
|
||||
time.sleep(.1)
|
||||
|
||||
# Now start reading button activity
|
||||
# When a button is depressed (trellis.just_pressed),
|
||||
# the LED for that button will turn on.
|
||||
# When the button is relased (trellis.just_released),
|
||||
# the LED will turn off.
|
||||
print('Starting button sensory loop...')
|
||||
while True:
|
||||
# Make sure to take a break during each trellis.read_buttons
|
||||
# cycle. This allows for debouncing, and for the trellis driver
|
||||
# to write and read the buffer.
|
||||
time.sleep(.1)
|
||||
|
||||
try:
|
||||
if trellis.read_buttons():
|
||||
for i in range(32):
|
||||
if trellis.just_pressed(i):
|
||||
print('Button', i + 1, 'was just pressed!')
|
||||
trellis.led_on(i)
|
||||
trellis.show()
|
||||
for i in range(32):
|
||||
if trellis.just_released(i):
|
||||
print('Button', i + 1, 'was just released!')
|
||||
trellis.led_off(i)
|
||||
trellis.show()
|
||||
|
||||
# This allows the program to stop running when Ctrl+C is
|
||||
# pressed in the REPL
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
70
examples/trellis_single_simpletest.py
Normal file
70
examples/trellis_single_simpletest.py
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
# Basic example of turning on LEDs and handling Keypad
|
||||
# button activity.
|
||||
|
||||
# Import all board pins
|
||||
import time
|
||||
import busio
|
||||
from board import SCL, SDA
|
||||
from adafruit_trellis import trellis
|
||||
|
||||
# Create the I2C interface
|
||||
i2c = busio.I2C(SCL, SDA)
|
||||
|
||||
# Create a Trellis object for each board
|
||||
trellis = trellis.TRELLIS(i2c) # 0x70 when no I2C address is supplied
|
||||
|
||||
# Turn on every LED
|
||||
print('Turning all LEDs on...')
|
||||
trellis.fill(1)
|
||||
trellis.show()
|
||||
time.sleep(2)
|
||||
|
||||
# Turn off every LED
|
||||
print('Turning all LEDs off...')
|
||||
trellis.fill(0)
|
||||
trellis.show()
|
||||
time.sleep(2)
|
||||
|
||||
# Turn on every LED, one at a time
|
||||
print('Turning on each LED, one at a time...')
|
||||
for i in range(16):
|
||||
trellis.led_on(i)
|
||||
trellis.show()
|
||||
time.sleep(.1)
|
||||
|
||||
# Turn off every LED, one at a time
|
||||
print('Turning off each LED, one at a time...')
|
||||
for i in range(15,0,-1):
|
||||
trellis.led_off(i)
|
||||
trellis.show()
|
||||
time.sleep(.1)
|
||||
|
||||
# Now start reading button activity
|
||||
# When a button is depressed (trellis.just_pressed),
|
||||
# the LED for that button will turn on.
|
||||
# When the button is relased (trellis.just_released),
|
||||
# the LED will turn off.
|
||||
print('Starting button sensory loop...')
|
||||
while True:
|
||||
# Make sure to take a break during each trellis.read_buttons
|
||||
# cycle. This allows for debouncing, and for the trellis driver
|
||||
# to write and read the buffer.
|
||||
time.sleep(.1)
|
||||
|
||||
try:
|
||||
if trellis.read_buttons():
|
||||
for i in range(16):
|
||||
if trellis.just_pressed(i):
|
||||
print('Button', i + 1, 'was just pressed!')
|
||||
trellis.led_on(i)
|
||||
trellis.show()
|
||||
for i in range(16):
|
||||
if trellis.just_released(i):
|
||||
print('Button', i + 1, 'was just released!')
|
||||
trellis.led_off(i)
|
||||
trellis.show()
|
||||
|
||||
# This allows the program to stop running when Ctrl+C is
|
||||
# pressed in the REPL
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
adafruit-circuitpython-bus-device
|
||||
Loading…
Reference in a new issue