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:
Scott Shawcroft 2017-12-07 19:23:56 -08:00
parent b89309de80
commit 234e2cb8e2
7 changed files with 675 additions and 228 deletions

432
.pylintrc Normal file
View 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

View file

@ -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 .

View file

@ -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
View 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 .

View file

@ -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

View file

@ -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)

View file

@ -1,2 +1,3 @@
python:
version: 3
requirements_file: requirements.txt