Update to new build process and turn on lint.
This commit is contained in:
parent
48f0a3b5f2
commit
dff866cf4c
3
.gitignore
vendored
3
.gitignore
vendored
@ -2,3 +2,6 @@ __pycache__
|
|||||||
_build
|
_build
|
||||||
*.pyc
|
*.pyc
|
||||||
*.mpy
|
*.mpy
|
||||||
|
.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,i,j,k,n,ex,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=2
|
||||||
|
|
||||||
|
|
||||||
|
[EXCEPTIONS]
|
||||||
|
|
||||||
|
# Exceptions that will emit a warning when being caught. Defaults to
|
||||||
|
# "Exception"
|
||||||
|
overgeneral-exceptions=Exception
|
63
.travis.yml
63
.travis.yml
@ -1,53 +1,30 @@
|
|||||||
# Travis CI configuration for automated .mpy file generation.
|
# This is a common .travis.yml for generating library release zip files for
|
||||||
# Author: Tony DiCola
|
# CircuitPython library releases using circuitpython-build-tools.
|
||||||
# License: Public Domain
|
# See https://github.com/adafruit/circuitpython-build-tools for detailed setup
|
||||||
# This configuration will work with Travis CI (travis-ci.org) to automacially
|
# instructions.
|
||||||
# build .mpy files for CircuitPython when a new tagged release is created. This
|
|
||||||
# file is relatively generic and can be shared across multiple repositories by
|
|
||||||
# following these steps:
|
|
||||||
# 1. Copy this file into a .travis.yml file in the root of the repository.
|
|
||||||
# 2. Change the deploy > file section below to list each of the .mpy files
|
|
||||||
# that should be generated. The config will automatically look for
|
|
||||||
# .py files with the same name as the source for generating the .mpy files.
|
|
||||||
# Note that the .mpy extension should be lower case!
|
|
||||||
# 3. Commit the .travis.yml file and push it to GitHub.
|
|
||||||
# 4. Go to travis-ci.org and find the repository (it needs to be setup to access
|
|
||||||
# your github account, and your github account needs access to write to the
|
|
||||||
# repo). Flip the 'ON' switch on for Travis and the repo, see the Travis
|
|
||||||
# docs for more details: https://docs.travis-ci.com/user/getting-started/
|
|
||||||
# 5. Get a GitHub 'personal access token' which has at least 'public_repo' or
|
|
||||||
# 'repo' scope: https://help.github.com/articles/creating-an-access-token-for-command-line-use/
|
|
||||||
# Keep this token safe and secure! Anyone with the token will be able to
|
|
||||||
# access and write to your GitHub repositories. Travis will use the token
|
|
||||||
# to attach the .mpy files to the release.
|
|
||||||
# 6. In the Travis CI settings for the repository that was enabled find the
|
|
||||||
# environment variable editing page: https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings
|
|
||||||
# Add an environment variable named GITHUB_TOKEN and set it to the value
|
|
||||||
# of the GitHub personal access token above. Keep 'Display value in build
|
|
||||||
# log' flipped off.
|
|
||||||
# 7. That's it! Tag a release and Travis should go to work to add .mpy files
|
|
||||||
# to the release. It takes about a 2-3 minutes for a worker to spin up,
|
|
||||||
# build mpy-cross, and add the binaries to the release.
|
|
||||||
language: generic
|
|
||||||
|
|
||||||
sudo: true
|
dist: trusty
|
||||||
|
sudo: false
|
||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- "3.6"
|
||||||
|
|
||||||
|
cache:
|
||||||
|
pip: true
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
provider: releases
|
provider: releases
|
||||||
api_key: $GITHUB_TOKEN
|
api_key: $GITHUB_TOKEN
|
||||||
file:
|
file_glob: true
|
||||||
- "adafruit_max31865.mpy"
|
file: bundles/*
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
on:
|
on:
|
||||||
tags: true
|
tags: true
|
||||||
|
|
||||||
before_install:
|
install:
|
||||||
- sudo apt-get -yqq update
|
- pip install pylint circuitpython-build-tools
|
||||||
- sudo apt-get install -y build-essential git python python-pip
|
|
||||||
- git clone https://github.com/adafruit/circuitpython.git -b 2.x
|
|
||||||
- make -C circuitpython/mpy-cross
|
|
||||||
- export PATH=$PATH:$PWD/circuitpython/mpy-cross/
|
|
||||||
- sudo pip install shyaml
|
|
||||||
|
|
||||||
before_deploy:
|
script:
|
||||||
- shyaml get-values deploy.file < .travis.yml | sed 's/.mpy/.py/' | xargs -L1 mpy-cross
|
- pylint adafruit_max31865.py
|
||||||
|
- ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name examples/*.py)
|
||||||
|
- circuitpython-build-bundles --filename_prefix adafruit-circuitpython-max31865 --library_location .
|
||||||
|
@ -32,44 +32,45 @@ import math
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
import adafruit_bus_device.spi_device as spi_device
|
import adafruit_bus_device.spi_device as spi_device
|
||||||
|
from micropython import const
|
||||||
|
|
||||||
# Register and other constant values:
|
# Register and other constant values:
|
||||||
_MAX31865_CONFIG_REG = const(0x00)
|
_MAX31865_CONFIG_REG = const(0x00)
|
||||||
_MAX31865_CONFIG_BIAS = const(0x80)
|
_MAX31865_CONFIG_BIAS = const(0x80)
|
||||||
_MAX31865_CONFIG_MODEAUTO = const(0x40)
|
_MAX31865_CONFIG_MODEAUTO = const(0x40)
|
||||||
_MAX31865_CONFIG_MODEOFF = const(0x00)
|
_MAX31865_CONFIG_MODEOFF = const(0x00)
|
||||||
_MAX31865_CONFIG_1SHOT = const(0x20)
|
_MAX31865_CONFIG_1SHOT = const(0x20)
|
||||||
_MAX31865_CONFIG_3WIRE = const(0x10)
|
_MAX31865_CONFIG_3WIRE = const(0x10)
|
||||||
_MAX31865_CONFIG_24WIRE = const(0x00)
|
_MAX31865_CONFIG_24WIRE = const(0x00)
|
||||||
_MAX31865_CONFIG_FAULTSTAT = const(0x02)
|
_MAX31865_CONFIG_FAULTSTAT = const(0x02)
|
||||||
_MAX31865_CONFIG_FILT50HZ = const(0x01)
|
_MAX31865_CONFIG_FILT50HZ = const(0x01)
|
||||||
_MAX31865_CONFIG_FILT60HZ = const(0x00)
|
_MAX31865_CONFIG_FILT60HZ = const(0x00)
|
||||||
_MAX31865_RTDMSB_REG = const(0x01)
|
_MAX31865_RTDMSB_REG = const(0x01)
|
||||||
_MAX31865_RTDLSB_REG = const(0x02)
|
_MAX31865_RTDLSB_REG = const(0x02)
|
||||||
_MAX31865_HFAULTMSB_REG = const(0x03)
|
_MAX31865_HFAULTMSB_REG = const(0x03)
|
||||||
_MAX31865_HFAULTLSB_REG = const(0x04)
|
_MAX31865_HFAULTLSB_REG = const(0x04)
|
||||||
_MAX31865_LFAULTMSB_REG = const(0x05)
|
_MAX31865_LFAULTMSB_REG = const(0x05)
|
||||||
_MAX31865_LFAULTLSB_REG = const(0x06)
|
_MAX31865_LFAULTLSB_REG = const(0x06)
|
||||||
_MAX31865_FAULTSTAT_REG = const(0x07)
|
_MAX31865_FAULTSTAT_REG = const(0x07)
|
||||||
_MAX31865_FAULT_HIGHTHRESH = const(0x80)
|
_MAX31865_FAULT_HIGHTHRESH = const(0x80)
|
||||||
_MAX31865_FAULT_LOWTHRESH = const(0x40)
|
_MAX31865_FAULT_LOWTHRESH = const(0x40)
|
||||||
_MAX31865_FAULT_REFINLOW = const(0x20)
|
_MAX31865_FAULT_REFINLOW = const(0x20)
|
||||||
_MAX31865_FAULT_REFINHIGH = const(0x10)
|
_MAX31865_FAULT_REFINHIGH = const(0x10)
|
||||||
_MAX31865_FAULT_RTDINLOW = const(0x08)
|
_MAX31865_FAULT_RTDINLOW = const(0x08)
|
||||||
_MAX31865_FAULT_OVUV = const(0x04)
|
_MAX31865_FAULT_OVUV = const(0x04)
|
||||||
_RTD_A = 3.9083e-3
|
_RTD_A = 3.9083e-3
|
||||||
_RTD_B = -5.775e-7
|
_RTD_B = -5.775e-7
|
||||||
|
|
||||||
|
|
||||||
class MAX31865:
|
class MAX31865:
|
||||||
|
"""Driver for the MAX31865 thermocouple amplifier."""
|
||||||
|
|
||||||
# Class-level buffer for reading and writing data with the sensor.
|
# Class-level buffer for reading and writing data with the sensor.
|
||||||
# This reduces memory allocations but means the code is not re-entrant or
|
# This reduces memory allocations but means the code is not re-entrant or
|
||||||
# thread safe!
|
# thread safe!
|
||||||
_BUFFER = bytearray(3)
|
_BUFFER = bytearray(3)
|
||||||
|
|
||||||
def __init__(self, spi, cs, rtd_nominal=100, ref_resistor=430.0, wires=2):
|
def __init__(self, spi, cs, *, rtd_nominal=100, ref_resistor=430.0, wires=2):
|
||||||
self.rtd_nominal = rtd_nominal
|
self.rtd_nominal = rtd_nominal
|
||||||
self.ref_resistor = ref_resistor
|
self.ref_resistor = ref_resistor
|
||||||
self._device = spi_device.SPIDevice(spi, cs, baudrate=500000,
|
self._device = spi_device.SPIDevice(spi, cs, baudrate=500000,
|
||||||
@ -77,13 +78,13 @@ class MAX31865:
|
|||||||
# Set wire config register based on the number of wires specified.
|
# Set wire config register based on the number of wires specified.
|
||||||
if wires not in (2, 3, 4):
|
if wires not in (2, 3, 4):
|
||||||
raise ValueError('Wires must be a value of 2, 3, or 4!')
|
raise ValueError('Wires must be a value of 2, 3, or 4!')
|
||||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||||
if wires == 3:
|
if wires == 3:
|
||||||
t |= _MAX31865_CONFIG_3WIRE
|
config |= _MAX31865_CONFIG_3WIRE
|
||||||
else:
|
else:
|
||||||
# 2 or 4 wire
|
# 2 or 4 wire
|
||||||
t &= ~_MAX31865_CONFIG_3WIRE
|
config &= ~_MAX31865_CONFIG_3WIRE
|
||||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||||
# Default to no bias and no auto conversion.
|
# Default to no bias and no auto conversion.
|
||||||
self.bias = False
|
self.bias = False
|
||||||
self.auto_convert = False
|
self.auto_convert = False
|
||||||
@ -113,74 +114,71 @@ class MAX31865:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def bias(self):
|
def bias(self):
|
||||||
"""Get and set the boolean state of the sensor's bias (True/False)."""
|
"""True when the sensor's bias voltage is on"""
|
||||||
return bool(self._read_u8(_MAX31865_CONFIG_REG) & _MAX31865_CONFIG_BIAS)
|
return bool(self._read_u8(_MAX31865_CONFIG_REG) & _MAX31865_CONFIG_BIAS)
|
||||||
|
|
||||||
@bias.setter
|
@bias.setter
|
||||||
def bias(self, val):
|
def bias(self, val):
|
||||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||||
if val:
|
if val:
|
||||||
t |= _MAX31865_CONFIG_BIAS # Enable bias.
|
config |= _MAX31865_CONFIG_BIAS # Enable bias.
|
||||||
else:
|
else:
|
||||||
t &= ~_MAX31865_CONFIG_BIAS # Disable bias.
|
config &= ~_MAX31865_CONFIG_BIAS # Disable bias.
|
||||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def auto_convert(self):
|
def auto_convert(self):
|
||||||
"""Get and set the boolean state of the sensor's automatic conversion
|
"""True when the sensor automatically does conversions."""
|
||||||
mode (True/False).
|
|
||||||
"""
|
|
||||||
return bool(self._read_u8(_MAX31865_CONFIG_REG) & _MAX31865_CONFIG_MODEAUTO)
|
return bool(self._read_u8(_MAX31865_CONFIG_REG) & _MAX31865_CONFIG_MODEAUTO)
|
||||||
|
|
||||||
@auto_convert.setter
|
@auto_convert.setter
|
||||||
def auto_convert(self, val):
|
def auto_convert(self, val):
|
||||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||||
if val:
|
if val:
|
||||||
t |= _MAX31865_CONFIG_MODEAUTO # Enable auto convert.
|
config |= _MAX31865_CONFIG_MODEAUTO # Enable auto convert.
|
||||||
else:
|
else:
|
||||||
t &= ~_MAX31865_CONFIG_MODEAUTO # Disable auto convert.
|
config &= ~_MAX31865_CONFIG_MODEAUTO # Disable auto convert.
|
||||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def fault(self):
|
def fault(self):
|
||||||
"""Get the fault state of the sensor. Use the clear_faults function
|
"""The fault state of the sensor. Use `clear_faults` to clear the fault state. Returns a
|
||||||
to clear the fault state. Returns a 6-tuple of boolean values which
|
6-tuple of boolean values which indicate if any faults are present:
|
||||||
indicate if any faults are present:
|
- HIGHTHRESH
|
||||||
- HIGHTHRESH
|
- LOWTHRESH
|
||||||
- LOWTHRESH
|
- REFINLOW
|
||||||
- REFINLOW
|
- REFINHIGH
|
||||||
- REFINHIGH
|
- RTDINLOW
|
||||||
- RTDINLOW
|
- OVUV
|
||||||
- OVUV
|
|
||||||
"""
|
"""
|
||||||
faults = self._read_u8(_MAX31865_FAULTSTAT_REG)
|
faults = self._read_u8(_MAX31865_FAULTSTAT_REG)
|
||||||
highthresh = bool(faults & _MAX31865_FAULT_HIGHTHRESH)
|
highthresh = bool(faults & _MAX31865_FAULT_HIGHTHRESH)
|
||||||
lowthresh = bool(faults & _MAX31865_FAULT_LOWTHRESH)
|
lowthresh = bool(faults & _MAX31865_FAULT_LOWTHRESH)
|
||||||
refinlow = bool(faults & _MAX31865_FAULT_REFINLOW)
|
refinlow = bool(faults & _MAX31865_FAULT_REFINLOW)
|
||||||
refinhigh = bool(faults & _MAX31865_FAULT_REFINHIGH)
|
refinhigh = bool(faults & _MAX31865_FAULT_REFINHIGH)
|
||||||
rtdinlow = bool(faults & _MAX31865_FAULT_RTDINLOW)
|
rtdinlow = bool(faults & _MAX31865_FAULT_RTDINLOW)
|
||||||
ovuv = bool(faults & _MAX31865_FAULT_OVUV)
|
ovuv = bool(faults & _MAX31865_FAULT_OVUV)
|
||||||
return (highthresh, lowthresh, refinlow, refinhigh, rtdinlow, ovuv)
|
return (highthresh, lowthresh, refinlow, refinhigh, rtdinlow, ovuv)
|
||||||
|
|
||||||
def clear_faults(self):
|
def clear_faults(self):
|
||||||
"""Clear any fault state previously detected by the sensor."""
|
"""Clear any fault state previously detected by the sensor."""
|
||||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||||
t &= ~0x2C
|
config &= ~0x2C
|
||||||
t |= _MAX31865_CONFIG_FAULTSTAT
|
config |= _MAX31865_CONFIG_FAULTSTAT
|
||||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||||
|
|
||||||
def read_rtd(self):
|
def read_rtd(self):
|
||||||
"""Perform a raw reading of the thermocouple and return its 15-bit
|
"""Perform a raw reading of the thermocouple and return its 15-bit
|
||||||
value. You'll need to manually convert this to temperature using the
|
value. You'll need to manually convert this to temperature using the
|
||||||
nominal value of the RTD and some math. If you just want temperature
|
nominal value of the resistance-to-digital conversion and some math. If you just want
|
||||||
use the temperature property instead.
|
temperature use the temperature property instead.
|
||||||
"""
|
"""
|
||||||
self.clear_faults()
|
self.clear_faults()
|
||||||
self.bias = True
|
self.bias = True
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||||
t |= _MAX31865_CONFIG_1SHOT
|
config |= _MAX31865_CONFIG_1SHOT
|
||||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||||
time.sleep(0.065)
|
time.sleep(0.065)
|
||||||
rtd = self._read_u16(_MAX31865_RTDMSB_REG)
|
rtd = self._read_u16(_MAX31865_RTDMSB_REG)
|
||||||
# Remove fault bit.
|
# Remove fault bit.
|
||||||
@ -189,29 +187,32 @@ class MAX31865:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def temperature(self):
|
def temperature(self):
|
||||||
"""Read the temperature of the sensor and return its value in degrees
|
"""The temperature of the sensor in degrees Celsius."""
|
||||||
Celsius.
|
raw_reading = self.read_rtd()
|
||||||
"""
|
raw_reading /= 32768
|
||||||
Rt = self.read_rtd()
|
raw_reading *= self.ref_resistor
|
||||||
Rt /= 32768
|
|
||||||
Rt *= self.ref_resistor
|
# This math originates from:
|
||||||
|
# http://www.analog.com/media/en/technical-documentation/application-notes/AN709_0.pdf
|
||||||
|
# To match the naming from the app note we tell lint to ignore the Z1-4 naming.
|
||||||
|
# pylint: disable=invalid-name
|
||||||
Z1 = -_RTD_A
|
Z1 = -_RTD_A
|
||||||
Z2 = _RTD_A * _RTD_A - (4 * _RTD_B)
|
Z2 = _RTD_A * _RTD_A - (4 * _RTD_B)
|
||||||
Z3 = (4 * _RTD_B) / self.rtd_nominal
|
Z3 = (4 * _RTD_B) / self.rtd_nominal
|
||||||
Z4 = 2 * _RTD_B
|
Z4 = 2 * _RTD_B
|
||||||
temp = Z2 + (Z3 * Rt)
|
temp = Z2 + (Z3 * raw_reading)
|
||||||
temp = (math.sqrt(temp) + Z1) / Z4
|
temp = (math.sqrt(temp) + Z1) / Z4
|
||||||
if temp >= 0:
|
if temp >= 0:
|
||||||
return temp
|
return temp
|
||||||
rpoly = Rt
|
rpoly = raw_reading
|
||||||
temp = -242.02
|
temp = -242.02
|
||||||
temp += 2.2228 * rpoly
|
temp += 2.2228 * rpoly
|
||||||
rpoly *= Rt # square
|
rpoly *= raw_reading # square
|
||||||
temp += 2.5859e-3 * rpoly
|
temp += 2.5859e-3 * rpoly
|
||||||
rpoly *= Rt # ^3
|
rpoly *= raw_reading # ^3
|
||||||
temp -= 4.8260e-6 * rpoly
|
temp -= 4.8260e-6 * rpoly
|
||||||
rpoly *= Rt # ^4
|
rpoly *= raw_reading # ^4
|
||||||
temp -= 2.8183e-8 * rpoly
|
temp -= 2.8183e-8 * rpoly
|
||||||
rpoly *= Rt # ^5
|
rpoly *= raw_reading # ^5
|
||||||
temp += 1.5243e-10 * rpoly
|
temp += 1.5243e-10 * rpoly
|
||||||
return temp
|
return temp
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
# Simple demo of the MAX31865 thermocouple amplifier.
|
# Simple demo of the MAX31865 thermocouple amplifier.
|
||||||
# Will print the temperature every second.
|
# Will print the temperature every second.
|
||||||
|
import time
|
||||||
|
|
||||||
import board
|
import board
|
||||||
import busio
|
import busio
|
||||||
import digitalio
|
import digitalio
|
||||||
import time
|
|
||||||
|
|
||||||
import adafruit_max31865
|
import adafruit_max31865
|
||||||
|
|
||||||
|
|
||||||
# Initialize SPI bus and sensor.
|
# Initialize SPI bus and sensor.
|
||||||
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
|
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
|
||||||
cs = digitalio.DigitalInOut(board.D5) # Chip select of the MAX31865 board.
|
cs = digitalio.DigitalInOut(board.D5) # Chip select of the MAX31865 board.
|
||||||
sensor = adafruit_max31865.MAX31865(spi, cs)
|
sensor = adafruit_max31865.MAX31865(spi, cs)
|
||||||
# Note you can optionally provide the thermocouple RTD nominal, the reference
|
# Note you can optionally provide the thermocouple RTD nominal, the reference
|
||||||
# resistance, and the number of wires for the sensor (2 the default, 3, or 4)
|
# resistance, and the number of wires for the sensor (2 the default, 3, or 4)
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
|
python:
|
||||||
|
version: 3
|
||||||
requirements_file: requirements.txt
|
requirements_file: requirements.txt
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user