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
|
||||
*.pyc
|
||||
*.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.
|
||||
# Author: Tony DiCola
|
||||
# License: Public Domain
|
||||
# This configuration will work with Travis CI (travis-ci.org) to automacially
|
||||
# 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
|
||||
# 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.
|
||||
|
||||
sudo: true
|
||||
dist: trusty
|
||||
sudo: false
|
||||
language: python
|
||||
python:
|
||||
- "3.6"
|
||||
|
||||
cache:
|
||||
pip: true
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key: $GITHUB_TOKEN
|
||||
file:
|
||||
- "adafruit_max31865.mpy"
|
||||
file_glob: true
|
||||
file: bundles/*
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
|
||||
before_install:
|
||||
- sudo apt-get -yqq update
|
||||
- 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
|
||||
install:
|
||||
- pip install pylint circuitpython-build-tools
|
||||
|
||||
before_deploy:
|
||||
- shyaml get-values deploy.file < .travis.yml | sed 's/.mpy/.py/' | xargs -L1 mpy-cross
|
||||
script:
|
||||
- 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 adafruit_bus_device.spi_device as spi_device
|
||||
|
||||
from micropython import const
|
||||
|
||||
# Register and other constant values:
|
||||
_MAX31865_CONFIG_REG = const(0x00)
|
||||
_MAX31865_CONFIG_BIAS = const(0x80)
|
||||
_MAX31865_CONFIG_MODEAUTO = const(0x40)
|
||||
_MAX31865_CONFIG_MODEOFF = const(0x00)
|
||||
_MAX31865_CONFIG_1SHOT = const(0x20)
|
||||
_MAX31865_CONFIG_3WIRE = const(0x10)
|
||||
_MAX31865_CONFIG_24WIRE = const(0x00)
|
||||
_MAX31865_CONFIG_FAULTSTAT = const(0x02)
|
||||
_MAX31865_CONFIG_FILT50HZ = const(0x01)
|
||||
_MAX31865_CONFIG_FILT60HZ = const(0x00)
|
||||
_MAX31865_RTDMSB_REG = const(0x01)
|
||||
_MAX31865_RTDLSB_REG = const(0x02)
|
||||
_MAX31865_HFAULTMSB_REG = const(0x03)
|
||||
_MAX31865_HFAULTLSB_REG = const(0x04)
|
||||
_MAX31865_LFAULTMSB_REG = const(0x05)
|
||||
_MAX31865_LFAULTLSB_REG = const(0x06)
|
||||
_MAX31865_FAULTSTAT_REG = const(0x07)
|
||||
_MAX31865_FAULT_HIGHTHRESH = const(0x80)
|
||||
_MAX31865_FAULT_LOWTHRESH = const(0x40)
|
||||
_MAX31865_FAULT_REFINLOW = const(0x20)
|
||||
_MAX31865_FAULT_REFINHIGH = const(0x10)
|
||||
_MAX31865_FAULT_RTDINLOW = const(0x08)
|
||||
_MAX31865_FAULT_OVUV = const(0x04)
|
||||
_RTD_A = 3.9083e-3
|
||||
_RTD_B = -5.775e-7
|
||||
_MAX31865_CONFIG_REG = const(0x00)
|
||||
_MAX31865_CONFIG_BIAS = const(0x80)
|
||||
_MAX31865_CONFIG_MODEAUTO = const(0x40)
|
||||
_MAX31865_CONFIG_MODEOFF = const(0x00)
|
||||
_MAX31865_CONFIG_1SHOT = const(0x20)
|
||||
_MAX31865_CONFIG_3WIRE = const(0x10)
|
||||
_MAX31865_CONFIG_24WIRE = const(0x00)
|
||||
_MAX31865_CONFIG_FAULTSTAT = const(0x02)
|
||||
_MAX31865_CONFIG_FILT50HZ = const(0x01)
|
||||
_MAX31865_CONFIG_FILT60HZ = const(0x00)
|
||||
_MAX31865_RTDMSB_REG = const(0x01)
|
||||
_MAX31865_RTDLSB_REG = const(0x02)
|
||||
_MAX31865_HFAULTMSB_REG = const(0x03)
|
||||
_MAX31865_HFAULTLSB_REG = const(0x04)
|
||||
_MAX31865_LFAULTMSB_REG = const(0x05)
|
||||
_MAX31865_LFAULTLSB_REG = const(0x06)
|
||||
_MAX31865_FAULTSTAT_REG = const(0x07)
|
||||
_MAX31865_FAULT_HIGHTHRESH = const(0x80)
|
||||
_MAX31865_FAULT_LOWTHRESH = const(0x40)
|
||||
_MAX31865_FAULT_REFINLOW = const(0x20)
|
||||
_MAX31865_FAULT_REFINHIGH = const(0x10)
|
||||
_MAX31865_FAULT_RTDINLOW = const(0x08)
|
||||
_MAX31865_FAULT_OVUV = const(0x04)
|
||||
_RTD_A = 3.9083e-3
|
||||
_RTD_B = -5.775e-7
|
||||
|
||||
|
||||
class MAX31865:
|
||||
"""Driver for the MAX31865 thermocouple amplifier."""
|
||||
|
||||
# Class-level buffer for reading and writing data with the sensor.
|
||||
# This reduces memory allocations but means the code is not re-entrant or
|
||||
# thread safe!
|
||||
_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.ref_resistor = ref_resistor
|
||||
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.
|
||||
if wires not in (2, 3, 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:
|
||||
t |= _MAX31865_CONFIG_3WIRE
|
||||
config |= _MAX31865_CONFIG_3WIRE
|
||||
else:
|
||||
# 2 or 4 wire
|
||||
t &= ~_MAX31865_CONFIG_3WIRE
|
||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
||||
config &= ~_MAX31865_CONFIG_3WIRE
|
||||
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||
# Default to no bias and no auto conversion.
|
||||
self.bias = False
|
||||
self.auto_convert = False
|
||||
@ -113,74 +114,71 @@ class MAX31865:
|
||||
|
||||
@property
|
||||
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)
|
||||
|
||||
@bias.setter
|
||||
def bias(self, val):
|
||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
if val:
|
||||
t |= _MAX31865_CONFIG_BIAS # Enable bias.
|
||||
config |= _MAX31865_CONFIG_BIAS # Enable bias.
|
||||
else:
|
||||
t &= ~_MAX31865_CONFIG_BIAS # Disable bias.
|
||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
||||
config &= ~_MAX31865_CONFIG_BIAS # Disable bias.
|
||||
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||
|
||||
@property
|
||||
def auto_convert(self):
|
||||
"""Get and set the boolean state of the sensor's automatic conversion
|
||||
mode (True/False).
|
||||
"""
|
||||
"""True when the sensor automatically does conversions."""
|
||||
return bool(self._read_u8(_MAX31865_CONFIG_REG) & _MAX31865_CONFIG_MODEAUTO)
|
||||
|
||||
@auto_convert.setter
|
||||
def auto_convert(self, val):
|
||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
if val:
|
||||
t |= _MAX31865_CONFIG_MODEAUTO # Enable auto convert.
|
||||
config |= _MAX31865_CONFIG_MODEAUTO # Enable auto convert.
|
||||
else:
|
||||
t &= ~_MAX31865_CONFIG_MODEAUTO # Disable auto convert.
|
||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
||||
config &= ~_MAX31865_CONFIG_MODEAUTO # Disable auto convert.
|
||||
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||
|
||||
@property
|
||||
def fault(self):
|
||||
"""Get the fault state of the sensor. Use the clear_faults function
|
||||
to clear the fault state. Returns a 6-tuple of boolean values which
|
||||
indicate if any faults are present:
|
||||
- HIGHTHRESH
|
||||
- LOWTHRESH
|
||||
- REFINLOW
|
||||
- REFINHIGH
|
||||
- RTDINLOW
|
||||
- OVUV
|
||||
"""The fault state of the sensor. Use `clear_faults` to clear the fault state. Returns a
|
||||
6-tuple of boolean values which indicate if any faults are present:
|
||||
- HIGHTHRESH
|
||||
- LOWTHRESH
|
||||
- REFINLOW
|
||||
- REFINHIGH
|
||||
- RTDINLOW
|
||||
- OVUV
|
||||
"""
|
||||
faults = self._read_u8(_MAX31865_FAULTSTAT_REG)
|
||||
highthresh = bool(faults & _MAX31865_FAULT_HIGHTHRESH)
|
||||
lowthresh = bool(faults & _MAX31865_FAULT_LOWTHRESH)
|
||||
refinlow = bool(faults & _MAX31865_FAULT_REFINLOW)
|
||||
refinhigh = bool(faults & _MAX31865_FAULT_REFINHIGH)
|
||||
rtdinlow = bool(faults & _MAX31865_FAULT_RTDINLOW)
|
||||
ovuv = bool(faults & _MAX31865_FAULT_OVUV)
|
||||
lowthresh = bool(faults & _MAX31865_FAULT_LOWTHRESH)
|
||||
refinlow = bool(faults & _MAX31865_FAULT_REFINLOW)
|
||||
refinhigh = bool(faults & _MAX31865_FAULT_REFINHIGH)
|
||||
rtdinlow = bool(faults & _MAX31865_FAULT_RTDINLOW)
|
||||
ovuv = bool(faults & _MAX31865_FAULT_OVUV)
|
||||
return (highthresh, lowthresh, refinlow, refinhigh, rtdinlow, ovuv)
|
||||
|
||||
def clear_faults(self):
|
||||
"""Clear any fault state previously detected by the sensor."""
|
||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
t &= ~0x2C
|
||||
t |= _MAX31865_CONFIG_FAULTSTAT
|
||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
||||
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
config &= ~0x2C
|
||||
config |= _MAX31865_CONFIG_FAULTSTAT
|
||||
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||
|
||||
def read_rtd(self):
|
||||
"""Perform a raw reading of the thermocouple and return its 15-bit
|
||||
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
|
||||
use the temperature property instead.
|
||||
nominal value of the resistance-to-digital conversion and some math. If you just want
|
||||
temperature use the temperature property instead.
|
||||
"""
|
||||
self.clear_faults()
|
||||
self.bias = True
|
||||
time.sleep(0.01)
|
||||
t = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
t |= _MAX31865_CONFIG_1SHOT
|
||||
self._write_u8(_MAX31865_CONFIG_REG, t)
|
||||
config = self._read_u8(_MAX31865_CONFIG_REG)
|
||||
config |= _MAX31865_CONFIG_1SHOT
|
||||
self._write_u8(_MAX31865_CONFIG_REG, config)
|
||||
time.sleep(0.065)
|
||||
rtd = self._read_u16(_MAX31865_RTDMSB_REG)
|
||||
# Remove fault bit.
|
||||
@ -189,29 +187,32 @@ class MAX31865:
|
||||
|
||||
@property
|
||||
def temperature(self):
|
||||
"""Read the temperature of the sensor and return its value in degrees
|
||||
Celsius.
|
||||
"""
|
||||
Rt = self.read_rtd()
|
||||
Rt /= 32768
|
||||
Rt *= self.ref_resistor
|
||||
"""The temperature of the sensor in degrees Celsius."""
|
||||
raw_reading = self.read_rtd()
|
||||
raw_reading /= 32768
|
||||
raw_reading *= 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
|
||||
Z2 = _RTD_A * _RTD_A - (4 * _RTD_B)
|
||||
Z3 = (4 * _RTD_B) / self.rtd_nominal
|
||||
Z4 = 2 * _RTD_B
|
||||
temp = Z2 + (Z3 * Rt)
|
||||
temp = Z2 + (Z3 * raw_reading)
|
||||
temp = (math.sqrt(temp) + Z1) / Z4
|
||||
if temp >= 0:
|
||||
return temp
|
||||
rpoly = Rt
|
||||
rpoly = raw_reading
|
||||
temp = -242.02
|
||||
temp += 2.2228 * rpoly
|
||||
rpoly *= Rt # square
|
||||
rpoly *= raw_reading # square
|
||||
temp += 2.5859e-3 * rpoly
|
||||
rpoly *= Rt # ^3
|
||||
rpoly *= raw_reading # ^3
|
||||
temp -= 4.8260e-6 * rpoly
|
||||
rpoly *= Rt # ^4
|
||||
rpoly *= raw_reading # ^4
|
||||
temp -= 2.8183e-8 * rpoly
|
||||
rpoly *= Rt # ^5
|
||||
rpoly *= raw_reading # ^5
|
||||
temp += 1.5243e-10 * rpoly
|
||||
return temp
|
||||
|
@ -1,16 +1,17 @@
|
||||
# Simple demo of the MAX31865 thermocouple amplifier.
|
||||
# Will print the temperature every second.
|
||||
import time
|
||||
|
||||
import board
|
||||
import busio
|
||||
import digitalio
|
||||
import time
|
||||
|
||||
import adafruit_max31865
|
||||
|
||||
|
||||
# Initialize SPI bus and sensor.
|
||||
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)
|
||||
# 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)
|
||||
|
@ -1,2 +1,3 @@
|
||||
python:
|
||||
version: 3
|
||||
requirements_file: requirements.txt
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user