Update to new build process and turn on lint.
I haven't tested these changes on device yet. Please only merge you test it or I follow up later to say its tested. For https://github.com/adafruit/circuitpython/issues/475
This commit is contained in:
parent
b89309de80
commit
234e2cb8e2
7 changed files with 675 additions and 228 deletions
432
.pylintrc
Normal file
432
.pylintrc
Normal file
|
|
@ -0,0 +1,432 @@
|
|||
[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
|
||||
|
||||
|
||||
[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
|
||||
64
.travis.yml
64
.travis.yml
|
|
@ -1,54 +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 MicroPython 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_amg88xx.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/micropython.git
|
||||
- make -C micropython/mpy-cross
|
||||
- export PATH=$PATH:$PWD/micropython/mpy-cross/
|
||||
- sudo pip install shyaml
|
||||
|
||||
before_deploy:
|
||||
- shyaml get-values deploy.file < .travis.yml | sed 's/.mpy/.py/' | xargs -L1 mpy-cross
|
||||
install:
|
||||
- pip install pylint circuitpython-travis-build-tools
|
||||
|
||||
script:
|
||||
- pylint adafruit_amg88xx.py
|
||||
- ([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name examples/*.py)
|
||||
- circuitpython-build-bundles --filename_prefix adafruit-circuitpython-amg88xx --library_location .
|
||||
|
|
|
|||
50
README.md
50
README.md
|
|
@ -1,50 +0,0 @@
|
|||
# Adafruit_CircuitPython_AMG88xx
|
||||
|
||||
# Dependencies
|
||||
|
||||
This driver depends on the Register and Bus Device libraries. Please ensure they are also available on the CircuitPython filesystem. This is easily achieved by downloading a library and driver bundle.
|
||||
|
||||
# Usage Notes
|
||||
|
||||
Basics
|
||||
|
||||
Of course, you must import the library to use it:
|
||||
|
||||
```
|
||||
import busio
|
||||
import adafruit_amg88xx
|
||||
```
|
||||
The way to create an I2C object depends on the board you are using. For boards with labeled SCL and SDA pins, you can:
|
||||
|
||||
```
|
||||
import board
|
||||
```
|
||||
|
||||
You can also use pins defined by the onboard microcontroller through the microcontroller.pin module.
|
||||
|
||||
Now, to initialize the I2C bus:
|
||||
|
||||
```
|
||||
myI2C = busio.I2C(board.SCL, board.SDA)
|
||||
```
|
||||
|
||||
Once you have created the I2C interface object, you can use it to instantiate the AMG88xx object
|
||||
|
||||
```
|
||||
amg = adafruit_amg88xx.Adafruit_AMG88xx(myI2C)
|
||||
```
|
||||
|
||||
You can also optionally use the alternate i2c address (make sure to solder the jumper on the back of the board if you want to do this)
|
||||
|
||||
```
|
||||
amg = adafruit_amg88xx.Adafruit_AMG88xx(myI2C, addr=0x68)
|
||||
```
|
||||
|
||||
# Reading Pixels
|
||||
|
||||
Pixels can be then be read by doing:
|
||||
|
||||
```
|
||||
value = amg.readPixels()
|
||||
print(value)
|
||||
```
|
||||
105
README.rst
Normal file
105
README.rst
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
Introduction
|
||||
============
|
||||
|
||||
.. image:: https://readthedocs.org/projects/adafruit-circuitpython-amg88xx/badge/?version=latest
|
||||
:target: https://circuitpython.readthedocs.io/projects/amg88xx/en/latest/
|
||||
:alt: Documentation Status
|
||||
|
||||
.. image :: https://img.shields.io/discord/327254708534116352.svg
|
||||
:target: https://discord.gg/nBQh6qu
|
||||
:alt: Discord
|
||||
|
||||
Adafruit CircuitPython module for the AMG88xx GRID-Eye IR 8x8 thermal camera.
|
||||
|
||||
Dependencies
|
||||
=============
|
||||
This driver depends on:
|
||||
|
||||
* `Adafruit CircuitPython <https://github.com/adafruit/circuitpython>`_
|
||||
* `Bus Device <https://github.com/adafruit/Adafruit_CircuitPython_BusDevice>`_
|
||||
* `Register <https://github.com/adafruit/Adafruit_CircuitPython_Register>`_
|
||||
|
||||
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
|
||||
=============
|
||||
|
||||
Of course, you must import the library to use it:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import busio
|
||||
import adafruit_amg88xx
|
||||
|
||||
The way to create an I2C object depends on the board you are using. For boards with labeled SCL and SDA pins, you can:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import board
|
||||
|
||||
You can also use pins defined by the onboard microcontroller through the microcontroller.pin module.
|
||||
|
||||
Now, to initialize the I2C bus:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
i2c_bus = busio.I2C(board.SCL, board.SDA)
|
||||
|
||||
Once you have created the I2C interface object, you can use it to instantiate the AMG88xx object
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
amg = adafruit_amg88xx.AMG88XX(i2c_bus)
|
||||
|
||||
You can also optionally use the alternate i2c address (make sure to solder the jumper on the back of the board if you want to do this)
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
amg = adafruit_amg88xx.AMG88XX(i2c_bus, addr=0x68)
|
||||
|
||||
Pixels can be then be read by doing:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
print(amg.pixels)
|
||||
|
||||
API Reference
|
||||
=============
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
api
|
||||
|
||||
Contributing
|
||||
============
|
||||
|
||||
Contributions are welcome! Please read our `Code of Conduct
|
||||
<https://github.com/adafruit/Adafruit_CircuitPython_LIS3DH/blob/master/CODE_OF_CONDUCT.md>`_
|
||||
before contributing to help this project stay welcoming.
|
||||
|
||||
Building locally
|
||||
================
|
||||
|
||||
To build this library locally you'll need to install the
|
||||
`circuitpython-travis-build-tools <https://github.com/adafruit/circuitpython-build-tools>`_ package.
|
||||
|
||||
.. code-block::shell
|
||||
|
||||
python3 -m venv .env
|
||||
source .env/bin/activate
|
||||
pip install -r requirements.txt
|
||||
|
||||
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-lis3dh --library_location .
|
||||
|
|
@ -21,157 +21,147 @@
|
|||
# THE SOFTWARE.
|
||||
|
||||
"""
|
||||
`Adafruit_AMG88xx` - AMG88xx GRID-Eye IR 8x8 IR sensor
|
||||
`adafruit_amg88xx` - AMG88xx GRID-Eye IR 8x8 IR sensor
|
||||
====================================================
|
||||
This library supports the use of the AMG88xx in CircuitPython. This base
|
||||
class is inherited by the chip-specific subclasses.
|
||||
Functions are included for reading and writing registers and manipulating
|
||||
datetime objects.
|
||||
Author(s): Dean Miller for Adafruit Industries.
|
||||
This library supports the use of the AMG88xx in CircuitPython.
|
||||
|
||||
Author(s): Dean Miller, Scott Shawcroft for Adafruit Industries.
|
||||
Date: June 2017
|
||||
Affiliation: Adafruit Industries
|
||||
|
||||
Implementation Notes
|
||||
--------------------
|
||||
**Hardware:**
|
||||
*
|
||||
|
||||
**Software and Dependencies:**
|
||||
* Adafruit CircuitPython firmware for the ESP8622 and M0-based boards: https://github.com/adafruit/micropython/releases
|
||||
* Adafruit CircuitPython: https://github.com/adafruit/circuitpython/releases
|
||||
* Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register
|
||||
* Adafruit's Bus Device library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice
|
||||
|
||||
**Notes:**
|
||||
"""
|
||||
|
||||
__version__ = "0.0.0-auto.0"
|
||||
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LIS3DH.git"
|
||||
|
||||
from adafruit_bus_device.i2c_device import I2CDevice
|
||||
from adafruit_register import i2c_bit, i2c_bits
|
||||
from micropython import const
|
||||
|
||||
"""
|
||||
# AMG88xx default address.
|
||||
AMG88xx_I2CADDR = 0x69
|
||||
|
||||
AMG88xx_PCTL = 0x00
|
||||
AMG88xx_RST = 0x01
|
||||
AMG88xx_FPSC = 0x02
|
||||
AMG88xx_INTC = 0x03
|
||||
AMG88xx_STAT = 0x04
|
||||
AMG88xx_SCLR = 0x05
|
||||
#0x06 reserved
|
||||
AMG88xx_AVE = 0x07
|
||||
AMG88xx_INTHL = 0x08
|
||||
AMG88xx_INTHH = 0x09
|
||||
AMG88xx_INTLL = 0x0A
|
||||
AMG88xx_INTLH = 0x0B
|
||||
AMG88xx_IHYSL = 0x0C
|
||||
AMG88xx_IHYSH = 0x0D
|
||||
AMG88xx_TTHL = 0x0E
|
||||
AMG88xx_TTHH = 0x0F
|
||||
# Registers are defined below in the class. These are possible register values.
|
||||
|
||||
# Operating Modes
|
||||
AMG88xx_NORMAL_MODE = 0x00
|
||||
AMG88xx_SLEEP_MODE = 0x01
|
||||
AMG88xx_STAND_BY_60 = 0x20
|
||||
AMG88xx_STAND_BY_10 = 0x21
|
||||
# pylint: disable=bad-whitespace
|
||||
_NORMAL_MODE = const(0x00)
|
||||
_SLEEP_MODE = const(0x01)
|
||||
_STAND_BY_60 = const(0x20)
|
||||
_STAND_BY_10 = const(0x21)
|
||||
|
||||
#sw resets
|
||||
AMG88xx_FLAG_RESET = 0x30
|
||||
AMG88xx_INITIAL_RESET = 0x3F
|
||||
|
||||
#frame rates
|
||||
AMG88xx_FPS_10 = 0x00
|
||||
AMG88xx_FPS_1 = 0x01
|
||||
|
||||
#int enables
|
||||
AMG88xx_INT_DISABLED = 0x00
|
||||
AMG88xx_INT_ENABLED = 0x01
|
||||
|
||||
#int modes
|
||||
AMG88xx_DIFFERENCE = 0x00
|
||||
AMG88xx_ABSOLUTE_VALUE = 0x01
|
||||
"""
|
||||
# sw resets
|
||||
_FLAG_RESET = const(0x30)
|
||||
_INITIAL_RESET = const(0x3F)
|
||||
|
||||
AMG88xx_INT_OFFSET = 0x010
|
||||
AMG88xx_PIXEL_OFFSET = 0x80
|
||||
# frame rates
|
||||
_FPS_10 = const(0x00)
|
||||
_FPS_1 = const(0x01)
|
||||
|
||||
AMG88xx_PIXEL_ARRAY_SIZE = 64
|
||||
AMG88xx_PIXEL_TEMP_CONVERSION = .25
|
||||
AMG88xx_THERMISTOR_CONVERSION = .0625
|
||||
# int enables
|
||||
_INT_DISABLED = const(0x00)
|
||||
_INT_ENABLED = const(0x01)
|
||||
|
||||
class Adafruit_AMG88xx:
|
||||
# int modes
|
||||
_DIFFERENCE = const(0x00)
|
||||
_ABSOLUTE_VALUE = const(0x01)
|
||||
|
||||
#set up the registers
|
||||
_pctl = i2c_bits.RWBits(8, 0x00, 0)
|
||||
_rst = i2c_bits.RWBits(8, 0x01, 0)
|
||||
_fps = i2c_bit.RWBit(0x02, 0)
|
||||
_inten = i2c_bit.RWBit(0x03, 0)
|
||||
_intmod = i2c_bit.RWBit(0x03, 1)
|
||||
_INT_OFFSET = const(0x010)
|
||||
_PIXEL_OFFSET = const(0x80)
|
||||
|
||||
_intf = i2c_bit.RWBit(0x04, 1)
|
||||
_ovf_irs = i2c_bit.RWBit(0x04, 2)
|
||||
_ovf_ths = i2c_bit.RWBit(0x04, 3)
|
||||
_PIXEL_ARRAY_WIDTH = const(8)
|
||||
_PIXEL_ARRAY_HEIGHT = const(8)
|
||||
_PIXEL_TEMP_CONVERSION = .25
|
||||
_THERMISTOR_CONVERSION = .0625
|
||||
# pylint: enable=bad-whitespace
|
||||
|
||||
_intclr = i2c_bit.RWBit(0x05, 1)
|
||||
_ovs_clr = i2c_bit.RWBit(0x05, 2)
|
||||
_ovt_clr = i2c_bit.RWBit(0x05, 3)
|
||||
def _signed_12bit_to_float(val):
|
||||
#take first 11 bits as absolute val
|
||||
abs_val = (val & 0x7FF)
|
||||
if val & 0x8000:
|
||||
return 0 - float(abs_val)
|
||||
return float(abs_val)
|
||||
|
||||
_mamod = i2c_bit.RWBit(0x07, 5)
|
||||
class AMG88XX:
|
||||
"""Driver for the AMG88xx GRID-Eye IR 8x8 thermal camera."""
|
||||
|
||||
"""
|
||||
_inthl = i2c_bits.RWBits(8, 0x08, 0)
|
||||
_inthh = i2c_bits.RWBits(4, 0x09, 0)
|
||||
_intll = i2c_bits.RWBits(8, 0x0A, 0)
|
||||
_intlh = i2c_bits.RWBits(4, 0x0B, 0)
|
||||
_ihysl = i2c_bits.RWBits(8, 0x0C, 0)
|
||||
_ihysh = i2c_bits.RWBits(4, 0x0D, 0)
|
||||
"""
|
||||
# Set up the registers
|
||||
_pctl = i2c_bits.RWBits(8, 0x00, 0)
|
||||
_rst = i2c_bits.RWBits(8, 0x01, 0)
|
||||
_fps = i2c_bit.RWBit(0x02, 0)
|
||||
_inten = i2c_bit.RWBit(0x03, 0)
|
||||
_intmod = i2c_bit.RWBit(0x03, 1)
|
||||
|
||||
#_tthl = Adafruit_bitfield({'TEMP':8})
|
||||
_tthl = i2c_bits.RWBits(8, 0x0E, 0)
|
||||
_intf = i2c_bit.RWBit(0x04, 1)
|
||||
_ovf_irs = i2c_bit.RWBit(0x04, 2)
|
||||
_ovf_ths = i2c_bit.RWBit(0x04, 3)
|
||||
|
||||
#_tthh = Adafruit_bitfield({'TEMP':3, 'SIGN':1})
|
||||
_tthh = i2c_bits.RWBits(4, 0x0F, 0)
|
||||
_intclr = i2c_bit.RWBit(0x05, 1)
|
||||
_ovs_clr = i2c_bit.RWBit(0x05, 2)
|
||||
_ovt_clr = i2c_bit.RWBit(0x05, 3)
|
||||
|
||||
_mamod = i2c_bit.RWBit(0x07, 5)
|
||||
|
||||
def __init__(self, i2c, addr=0x69):
|
||||
self.i2c_device = I2CDevice(i2c, addr)
|
||||
_inthl = i2c_bits.RWBits(8, 0x08, 0)
|
||||
_inthh = i2c_bits.RWBits(4, 0x09, 0)
|
||||
_intll = i2c_bits.RWBits(8, 0x0A, 0)
|
||||
_intlh = i2c_bits.RWBits(4, 0x0B, 0)
|
||||
_ihysl = i2c_bits.RWBits(8, 0x0C, 0)
|
||||
_ihysh = i2c_bits.RWBits(4, 0x0D, 0)
|
||||
|
||||
#enter normal mode
|
||||
self._pctl = 0x00
|
||||
_tthl = i2c_bits.RWBits(8, 0x0E, 0)
|
||||
|
||||
#software reset
|
||||
self._rst = 0x3F
|
||||
_tthh = i2c_bits.RWBits(4, 0x0F, 0)
|
||||
|
||||
#disable interrupts by default
|
||||
self.disableInterrupt()
|
||||
def __init__(self, i2c, addr=0x69):
|
||||
self.i2c_device = I2CDevice(i2c, addr)
|
||||
|
||||
#set to 10 FPS
|
||||
self._fps = 0x00
|
||||
#enter normal mode
|
||||
self._pctl = _NORMAL_MODE
|
||||
|
||||
def disableInterrupt(self):
|
||||
self._inten = 0
|
||||
#software reset
|
||||
self._rst = _INITIAL_RESET
|
||||
|
||||
def readThermistor(self):
|
||||
raw = (self._tthh << 8) | self._tthl
|
||||
return self.signedMag12ToFloat(raw) * AMG88xx_THERMISTOR_CONVERSION
|
||||
#disable interrupts by default
|
||||
self._inten = False
|
||||
|
||||
def readPixels(self):
|
||||
retbuf = []
|
||||
buf = bytearray(3)
|
||||
#set to 10 FPS
|
||||
self._fps = _FPS_10
|
||||
|
||||
with self.i2c_device as i2c:
|
||||
for i in range(0, AMG88xx_PIXEL_ARRAY_SIZE):
|
||||
buf[0] = AMG88xx_PIXEL_OFFSET + (i << 1)
|
||||
i2c.write(buf, end=1, stop=False)
|
||||
i2c.readinto(buf, start=1)
|
||||
|
||||
raw = (buf[2] << 8) | buf[1]
|
||||
converted = self.signedMag12ToFloat(raw) * AMG88xx_PIXEL_TEMP_CONVERSION
|
||||
retbuf.append(converted)
|
||||
@property
|
||||
def temperature(self):
|
||||
"""Temperature of the sensor in Celsius"""
|
||||
raw = (self._tthh << 8) | self._tthl
|
||||
return _signed_12bit_to_float(raw) * _THERMISTOR_CONVERSION
|
||||
|
||||
return retbuf
|
||||
@property
|
||||
def pixels(self):
|
||||
"""Temperature of each pixel across the sensor in Celsius.
|
||||
|
||||
def signedMag12ToFloat(self, val):
|
||||
#take first 11 bits as absolute val
|
||||
absVal = (val & 0x7FF)
|
||||
if val & 0x8000:
|
||||
return 0 - float(absVal)
|
||||
else:
|
||||
return float(absVal)
|
||||
Temperatures are stored in a two dimensional list where the first index is the row and
|
||||
the second is the column. The first row is on the side closest to the writing on the
|
||||
sensor."""
|
||||
retbuf = [[0]*_PIXEL_ARRAY_WIDTH] * _PIXEL_ARRAY_HEIGHT
|
||||
buf = bytearray(3)
|
||||
|
||||
with self.i2c_device as i2c:
|
||||
for row in range(0, _PIXEL_ARRAY_HEIGHT):
|
||||
for col in range(0, _PIXEL_ARRAY_WIDTH):
|
||||
i = row * _PIXEL_ARRAY_HEIGHT + col
|
||||
buf[0] = _PIXEL_OFFSET + (i << 1)
|
||||
i2c.write(buf, end=1, stop=False)
|
||||
i2c.readinto(buf, start=1)
|
||||
|
||||
raw = (buf[2] << 8) | buf[1]
|
||||
converted = _signed_12bit_to_float(raw) * _PIXEL_TEMP_CONVERSION
|
||||
retbuf.append(converted)
|
||||
|
||||
return retbuf
|
||||
|
|
|
|||
|
|
@ -1,26 +1,19 @@
|
|||
import busio
|
||||
import adafruit_amg88xx
|
||||
import board
|
||||
import time
|
||||
|
||||
myI2C = busio.I2C(board.SCL, board.SDA)
|
||||
import busio
|
||||
import board
|
||||
|
||||
amg = adafruit_amg88xx.Adafruit_AMG88xx(myI2C)
|
||||
import adafruit_amg88xx
|
||||
|
||||
def chunks(l, n):
|
||||
#break list into n sized chunks
|
||||
for i in range(0, len(l), n):
|
||||
yield l[i:i + n]
|
||||
i2c_bus = busio.I2C(board.SCL, board.SDA)
|
||||
|
||||
amg = adafruit_amg88xx.AMG88XX(i2c_bus)
|
||||
|
||||
while True:
|
||||
value = amg.readPixels()
|
||||
|
||||
#format the output as nice rows of 8 pixels
|
||||
chunked = list(chunks(value, 8))
|
||||
for c in chunked:
|
||||
#pad to 1 decimal place
|
||||
print(['{0:.1f}'.format(x) for x in c])
|
||||
print("")
|
||||
|
||||
print("\n")
|
||||
time.sleep(1)
|
||||
for row in amg.pixels:
|
||||
#pad to 1 decimal place
|
||||
print(['{0:.1f}'.format(temp) for temp in row])
|
||||
print("")
|
||||
|
||||
print("\n")
|
||||
time.sleep(1)
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
python:
|
||||
version: 3
|
||||
requirements_file: requirements.txt
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue