diff --git a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md
index 71ef8f8..8de294e 100644
--- a/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md
+++ b/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md
@@ -4,7 +4,7 @@
Thank you for contributing! Before you submit a pull request, please read the following.
-Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://circuitpython.readthedocs.io/en/latest/docs/design_guide.html
+Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://docs.circuitpython.org/en/latest/docs/design_guide.html
If your changes are to documentation, please verify that the documentation builds locally by following the steps found here: https://adafru.it/build-docs
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 331b9e7..041a337 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -10,50 +10,5 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - name: Dump GitHub context
- env:
- GITHUB_CONTEXT: ${{ toJson(github) }}
- run: echo "$GITHUB_CONTEXT"
- - name: Translate Repo Name For Build Tools filename_prefix
- id: repo-name
- run: |
- echo ::set-output name=repo-name::$(
- echo ${{ github.repository }} |
- awk -F '\/' '{ print tolower($2) }' |
- tr '_' '-'
- )
- - name: Set up Python 3.7
- uses: actions/setup-python@v1
- with:
- python-version: 3.7
- - name: Versions
- run: |
- python3 --version
- - name: Checkout Current Repo
- uses: actions/checkout@v1
- with:
- submodules: true
- - name: Checkout tools repo
- uses: actions/checkout@v2
- with:
- repository: adafruit/actions-ci-circuitpython-libs
- path: actions-ci
- - name: Install dependencies
- # (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.)
- run: |
- source actions-ci/install.sh
- - name: Pip install Sphinx, pre-commit
- run: |
- pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit
- - name: Library version
- run: git describe --dirty --always --tags
- - name: Pre-commit hooks
- run: |
- pre-commit run --all-files
- - name: Build assets
- run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location .
- - name: Build docs
- working-directory: docs
- run: sphinx-build -E -W -b html . _build/html
- - name: Setup problem matchers
- uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1
+ - name: Run Build CI workflow
+ uses: adafruit/workflows-circuitpython-libs/build@main
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
deleted file mode 100644
index 6d0015a..0000000
--- a/.github/workflows/release.yml
+++ /dev/null
@@ -1,85 +0,0 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
-#
-# SPDX-License-Identifier: MIT
-
-name: Release Actions
-
-on:
- release:
- types: [published]
-
-jobs:
- upload-release-assets:
- runs-on: ubuntu-latest
- steps:
- - name: Dump GitHub context
- env:
- GITHUB_CONTEXT: ${{ toJson(github) }}
- run: echo "$GITHUB_CONTEXT"
- - name: Translate Repo Name For Build Tools filename_prefix
- id: repo-name
- run: |
- echo ::set-output name=repo-name::$(
- echo ${{ github.repository }} |
- awk -F '\/' '{ print tolower($2) }' |
- tr '_' '-'
- )
- - name: Set up Python 3.6
- uses: actions/setup-python@v1
- with:
- python-version: 3.6
- - name: Versions
- run: |
- python3 --version
- - name: Checkout Current Repo
- uses: actions/checkout@v1
- with:
- submodules: true
- - name: Checkout tools repo
- uses: actions/checkout@v2
- with:
- repository: adafruit/actions-ci-circuitpython-libs
- path: actions-ci
- - name: Install deps
- run: |
- source actions-ci/install.sh
- - name: Build assets
- run: circuitpython-build-bundles --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location .
- - name: Upload Release Assets
- # the 'official' actions version does not yet support dynamically
- # supplying asset names to upload. @csexton's version chosen based on
- # discussion in the issue below, as its the simplest to implement and
- # allows for selecting files with a pattern.
- # https://github.com/actions/upload-release-asset/issues/4
- #uses: actions/upload-release-asset@v1.0.1
- uses: csexton/release-asset-action@master
- with:
- pattern: "bundles/*"
- github-token: ${{ secrets.GITHUB_TOKEN }}
-
- upload-pypi:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v1
- - name: Check For setup.py
- id: need-pypi
- run: |
- echo ::set-output name=setup-py::$( find . -wholename './setup.py' )
- - name: Set up Python
- if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
- uses: actions/setup-python@v1
- with:
- python-version: '3.x'
- - name: Install dependencies
- if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
- run: |
- python -m pip install --upgrade pip
- pip install setuptools wheel twine
- - name: Build and publish
- if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
- env:
- TWINE_USERNAME: ${{ secrets.pypi_username }}
- TWINE_PASSWORD: ${{ secrets.pypi_password }}
- run: |
- python setup.py sdist
- twine upload dist/*
diff --git a/.github/workflows/release_gh.yml b/.github/workflows/release_gh.yml
new file mode 100644
index 0000000..9acec60
--- /dev/null
+++ b/.github/workflows/release_gh.yml
@@ -0,0 +1,19 @@
+# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+name: GitHub Release Actions
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ upload-release-assets:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Run GitHub Release CI workflow
+ uses: adafruit/workflows-circuitpython-libs/release-gh@main
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ upload-url: ${{ github.event.release.upload_url }}
diff --git a/.github/workflows/release_pypi.yml b/.github/workflows/release_pypi.yml
new file mode 100644
index 0000000..65775b7
--- /dev/null
+++ b/.github/workflows/release_pypi.yml
@@ -0,0 +1,19 @@
+# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
+#
+# SPDX-License-Identifier: MIT
+
+name: PyPI Release Actions
+
+on:
+ release:
+ types: [published]
+
+jobs:
+ upload-release-assets:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Run PyPI Release CI workflow
+ uses: adafruit/workflows-circuitpython-libs/release-pypi@main
+ with:
+ pypi-username: ${{ secrets.pypi_username }}
+ pypi-password: ${{ secrets.pypi_password }}
diff --git a/.gitignore b/.gitignore
index 2c6ddfd..db3d538 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,18 +1,48 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
+# SPDX-FileCopyrightText: 2022 Kattni Rembor, written for Adafruit Industries
#
-# SPDX-License-Identifier: Unlicense
+# SPDX-License-Identifier: MIT
+# Do not include files and directories created by your personal work environment, such as the IDE
+# you use, except for those already listed here. Pull requests including changes to this file will
+# not be accepted.
+
+# This .gitignore file contains rules for files generated by working with CircuitPython libraries,
+# including building Sphinx, testing with pip, and creating a virual environment, as well as the
+# MacOS and IDE-specific files generated by using MacOS in general, or the PyCharm or VSCode IDEs.
+
+# If you find that there are files being generated on your machine that should not be included in
+# your git commit, you should create a .gitignore_global file on your computer to include the
+# files created by your personal setup. To do so, follow the two steps below.
+
+# First, create a file called .gitignore_global somewhere convenient for you, and add rules for
+# the files you want to exclude from git commits.
+
+# Second, configure Git to use the exclude file for all Git repositories by running the
+# following via commandline, replacing "path/to/your/" with the actual path to your newly created
+# .gitignore_global file:
+# git config --global core.excludesfile path/to/your/.gitignore_global
+
+# CircuitPython-specific files
*.mpy
-.idea
+
+# Python-specific files
__pycache__
-_build
*.pyc
+
+# Sphinx build-specific files
+_build
+
+# This file results from running `pip -e install .` in a local repository
+*.egg-info
+
+# Virtual environment-specific files
.env
-.python-version
-build*/
-bundles
+.venv
+
+# MacOS-specific files
*.DS_Store
-.eggs
-dist
-**/*.egg-info
+
+# IDE-specific files
+.idea
.vscode
+*~
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 1b9fadc..70ade69 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -3,40 +3,40 @@
# SPDX-License-Identifier: Unlicense
repos:
-- repo: https://github.com/python/black
- rev: 20.8b1
+ - repo: https://github.com/python/black
+ rev: 23.3.0
hooks:
- - id: black
-- repo: https://github.com/fsfe/reuse-tool
- rev: v0.12.1
+ - id: black
+ - repo: https://github.com/fsfe/reuse-tool
+ rev: v1.1.2
hooks:
- - id: reuse
-- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v2.3.0
+ - id: reuse
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.4.0
hooks:
- - id: check-yaml
- - id: end-of-file-fixer
- - id: trailing-whitespace
-- repo: https://github.com/pycqa/pylint
- rev: v2.11.1
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+ - repo: https://github.com/pycqa/pylint
+ rev: v2.17.4
hooks:
- - id: pylint
+ - id: pylint
name: pylint (library code)
types: [python]
args:
- --disable=consider-using-f-string
exclude: "^(docs/|examples/|tests/|setup.py$)"
- - id: pylint
+ - id: pylint
name: pylint (example code)
description: Run pylint rules on "examples/*.py" files
types: [python]
files: "^examples/"
args:
- - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
- - id: pylint
+ - --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
+ - id: pylint
name: pylint (test code)
description: Run pylint rules on "tests/*.py" files
types: [python]
files: "^tests/"
args:
- - --disable=missing-docstring,consider-using-f-string,duplicate-code
+ - --disable=missing-docstring,consider-using-f-string,duplicate-code
diff --git a/.pylintrc b/.pylintrc
index bd3976d..f945e92 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -9,11 +9,11 @@
# run arbitrary code
extension-pkg-whitelist=
-# Add files or directories to the blacklist. They should be base names, not
+# Add files or directories to the ignore-list. They should be base names, not
# paths.
ignore=CVS
-# Add files or directories matching the regex patterns to the blacklist. The
+# Add files or directories matching the regex patterns to the ignore-list. The
# regex matches against base names, not paths.
ignore-patterns=
@@ -26,7 +26,7 @@ jobs=1
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
-load-plugins=
+load-plugins=pylint.extensions.no_self_use
# Pickle collected data for later comparisons.
persistent=yes
@@ -54,8 +54,8 @@ confidence=
# --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,bad-continuation,unspecified-encoding
+# disable=import-error,raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,deprecated-str-translate-call
+disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding
# 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
@@ -225,12 +225,6 @@ 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
@@ -252,43 +246,27 @@ ignore-docstrings=yes
ignore-imports=yes
# Minimum lines number of a similarity.
-min-similarity-lines=4
+min-similarity-lines=12
[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_]*)|(__.*__))$
@@ -296,9 +274,6 @@ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# 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_]*))$
@@ -309,21 +284,12 @@ 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]+))$
@@ -339,9 +305,6 @@ no-docstring-rgx=^_
# 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_]*))$
@@ -433,4 +396,4 @@ min-public-methods=1
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
-overgeneral-exceptions=Exception
+overgeneral-exceptions=builtins.Exception
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 0000000..88bca9f
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,22 @@
+# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
+
+# Read the Docs configuration file
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+sphinx:
+ configuration: docs/conf.py
+
+build:
+ os: ubuntu-20.04
+ tools:
+ python: "3"
+
+python:
+ install:
+ - requirements: docs/requirements.txt
+ - requirements: requirements.txt
diff --git a/.readthedocs.yml b/.readthedocs.yml
deleted file mode 100644
index 338427a..0000000
--- a/.readthedocs.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
-#
-# SPDX-License-Identifier: Unlicense
-
-python:
- version: 3
-requirements_file: docs/requirements.txt
diff --git a/README.rst b/README.rst
index 217e3eb..97c12bd 100644
--- a/README.rst
+++ b/README.rst
@@ -2,10 +2,10 @@ Introduction
============
.. image:: https://readthedocs.org/projects/adafruit-circuitpython-pcf8591/badge/?version=latest
- :target: https://circuitpython.readthedocs.io/projects/pcf8591/en/latest/
+ :target: https://docs.circuitpython.org/projects/pcf8591/en/latest/
:alt: Documentation Status
-.. image:: https://img.shields.io/discord/327254708534116352.svg
+.. image:: https://raw.githubusercontent.com/adafruit/Adafruit_CircuitPython_Bundle/main/badges/adafruit_discord.svg
:target: https://adafru.it/discord
:alt: Discord
@@ -54,8 +54,8 @@ To install in a virtual environment in your current project:
.. code-block:: shell
mkdir project-name && cd project-name
- python3 -m venv .env
- source .env/bin/activate
+ python3 -m venv .venv
+ source .venv/bin/activate
pip3 install adafruit-circuitpython-pcf8591
Usage Example
@@ -103,7 +103,9 @@ Usage Example
Documentation
=============
-API documentation for this library can be found on `Read the Docs `_.
+API documentation for this library can be found on `Read the Docs `_.
+
+For information on building library documentation, please check out `this guide `_.
Contributing
============
@@ -111,8 +113,3 @@ Contributing
Contributions are welcome! Please read our `Code of Conduct
`_
before contributing to help this project stay welcoming.
-
-Documentation
-=============
-
-For information on building library documentation, please check out `this guide `_.
diff --git a/adafruit_pcf8591/analog_in.py b/adafruit_pcf8591/analog_in.py
index 43a4824..8a9725f 100644
--- a/adafruit_pcf8591/analog_in.py
+++ b/adafruit_pcf8591/analog_in.py
@@ -27,53 +27,61 @@
* Author(s): Bryan Siepert, adpted from ADS1x15 by Carter Nelson
"""
+try:
+ import typing # pylint: disable=unused-import
+ from typing_extensions import Literal
+ from adafruit_pcf8591.pcf8591 import PCF8591
+except ImportError:
+ pass
+
class AnalogIn:
"""AnalogIn Mock Implementation for ADC Reads."""
- def __init__(self, pcf, pin):
+ def __init__(self, pcf: PCF8591, pin: Literal[0, 1, 2, 3]) -> None:
"""AnalogIn
- :param ads: The PCF8591 object.
- :param ~digitalio.DigitalInOut pin: Required ADC channel pin.
+ :param pcf: The PCF8591 object.
+ :param int pin: Required ADC channel pin; must be 0-3 inclusive
"""
self._pcf = pcf
self._channel_number = pin
@property
- def voltage(self):
+ def voltage(self) -> float:
"""Returns the value of an ADC channel in volts as compared to the reference voltage."""
if not self._pcf:
raise RuntimeError(
- "Underlying ADC does not exist, likely due to callint `deinit`"
+ "Underlying ADC does not exist, likely due to calling `deinit`"
)
raw_reading = self._pcf.read(self._channel_number)
return ((raw_reading << 8) / 65535) * self._pcf.reference_voltage
@property
- def value(self):
+ def value(self) -> int:
"""Returns the value of an ADC channel.
The value is scaled to a 16-bit integer from the native 8-bit value."""
if not self._pcf:
raise RuntimeError(
- "Underlying ADC does not exist, likely due to callint `deinit`"
+ "Underlying ADC does not exist, likely due to calling `deinit`"
)
return self._pcf.read(self._channel_number) << 8
@property
- def reference_voltage(self):
+ def reference_voltage(self) -> float:
"""The maximum voltage measurable (also known as the reference voltage) as a float in
- Volts. Assumed to be 3.3V but can be overridden using the `PCF8591` constructor"""
+ Volts. Assumed to be 3.3V but can be overridden using the `PCF8591` constructor
+ """
if not self._pcf:
raise RuntimeError(
- "Underlying ADC does not exist, likely due to callint `deinit`"
+ "Underlying ADC does not exist, likely due to calling `deinit`"
)
return self._pcf.reference_voltage
- def deinit(self):
+ def deinit(self) -> None:
"""Release the reference to the PCF8591. Create a new AnalogIn to use it again."""
self._pcf = None
diff --git a/adafruit_pcf8591/analog_out.py b/adafruit_pcf8591/analog_out.py
index b90351e..428627b 100644
--- a/adafruit_pcf8591/analog_out.py
+++ b/adafruit_pcf8591/analog_out.py
@@ -26,16 +26,22 @@
* Author(s): Bryan Siepert
"""
+try:
+ import typing # pylint: disable=unused-import
+ from typing_extensions import Literal
+ from adafruit_pcf8591.pcf8591 import PCF8591
+except ImportError:
+ pass
class AnalogOut:
"""AnalogIn Mock Implementation for ADC Reads."""
- def __init__(self, pcf, dac_pin=0):
+ def __init__(self, pcf: PCF8591, dac_pin: Literal[0] = 0) -> None:
"""AnalogIn
:param pcf: The pcf object.
- :param ~digitalio.DigitalInOut DAC pin: Required pin must be P4
+ :param int dac_pin: Required pin must be adafruit_pcf8591.pcf8591.A0
"""
self._pcf = pcf
@@ -45,24 +51,24 @@ def __init__(self, pcf, dac_pin=0):
self._pcf.dac_enabled = True
@property
- def value(self):
+ def value(self) -> int:
"""Returns the currently set value of the DAC pin as an integer."""
return self._value
@value.setter
- def value(self, new_value): # this may have to scale from 16-bit
+ def value(self, new_value: int) -> None: # this may have to scale from 16-bit
if new_value < 0 or new_value > 65535:
raise ValueError("value must be a 16-bit integer from 0-65535")
if not self._pcf.dac_enabled:
raise RuntimeError(
- "Underlying DAC is disabled, likely due to callint `deinit`"
+ "Underlying DAC is disabled, likely due to calling `deinit`"
)
# underlying sensor is 8-bit, so scale accordingly
self._pcf.write(new_value >> 8)
self._value = new_value
- def deinit(self):
+ def deinit(self) -> None:
"""Disable the underlying DAC and release the reference to the PCF8591.
Create a new AnalogOut to use it again."""
self._pcf.dac_enabled = False
diff --git a/adafruit_pcf8591/pcf8591.py b/adafruit_pcf8591/pcf8591.py
index 1129be2..96aef52 100644
--- a/adafruit_pcf8591/pcf8591.py
+++ b/adafruit_pcf8591/pcf8591.py
@@ -26,13 +26,20 @@
* Adafruit's Register library: https://github.com/adafruit/Adafruit_CircuitPython_Register
"""
-__version__ = "0.0.0-auto.0"
+__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_PCF8591.git"
# from time import sleep
from struct import unpack_from
from micropython import const
from adafruit_bus_device import i2c_device
+try:
+ import typing # pylint: disable=unused-import
+ from typing_extensions import Literal
+ from busio import I2C
+except ImportError:
+ pass
+
_PCF8591_DEFAULT_ADDR = const(0x48) # PCF8591 Default Address
_PCF8591_ENABLE_DAC = const(0x40) # control bit for having the DAC active
@@ -49,11 +56,16 @@ class PCF8591:
"""Driver for the PCF8591 DAC & ADC Combo breakout.
:param ~busio.I2C i2c_bus: The I2C bus the PCF8591 is connected to.
- :param address: The I2C device address for the sensor. Default is ``0x28``.
+ :param int address: The I2C device address for the sensor. Default is ``0x28``.
"""
- def __init__(self, i2c_bus, address=_PCF8591_DEFAULT_ADDR, reference_voltage=3.3):
+ def __init__(
+ self,
+ i2c_bus: I2C,
+ address: int = _PCF8591_DEFAULT_ADDR,
+ reference_voltage: float = 3.3,
+ ) -> None:
self.i2c_device = i2c_device.I2CDevice(i2c_bus, address)
self._dacval = 0
self._dac_enabled = False
@@ -67,12 +79,12 @@ def __init__(self, i2c_bus, address=_PCF8591_DEFAULT_ADDR, reference_voltage=3.3
# user calls to `read`
@property
- def reference_voltage(self):
+ def reference_voltage(self) -> float:
"""The voltage level that ADC signals are compared to.
An ADC value of 65535 will equal `reference_voltage`"""
return self._reference_voltage
- def _half_read(self, channel):
+ def _half_read(self, channel: Literal[0, 1, 2, 3]) -> None:
if self._dac_enabled:
self._buffer[0] = _PCF8591_ENABLE_DAC
self._buffer[1] = self._dacval
@@ -85,10 +97,10 @@ def _half_read(self, channel):
with self.i2c_device as i2c:
i2c.write_then_readinto(self._buffer, self._buffer)
- def read(self, channel):
+ def read(self, channel: Literal[0, 1, 2, 3]) -> int:
"""Read an analog value from one of the four ADC inputs
- param: :channel The single-ended ADC channel to read from, 0 thru 3
+ :param int channel: The single-ended ADC channel to read from, 0 thru 3
"""
if channel < 0 or channel > 3:
raise ValueError("channel must be from 0-3")
@@ -101,20 +113,19 @@ def read(self, channel):
return unpack_from(">B", self._buffer[1:])[0]
@property
- def dac_enabled(self):
- """ Enables the DAC when True, or sets it to tri-state / high-Z when False"""
+ def dac_enabled(self) -> bool:
+ """Enables the DAC when True, or sets it to tri-state / high-Z when False"""
return self._dac_enabled
@dac_enabled.setter
- def dac_enabled(self, enable_dac):
-
+ def dac_enabled(self, enable_dac: bool) -> None:
self._dac_enabled = enable_dac
self.write(self._dacval)
- def write(self, value):
+ def write(self, value: int) -> None:
"""Writes a uint8_t value to the DAC output
- param: :output The value to write: 0 is GND and 65535 is VCC
+ :param int value: The value to write: 0 is GND and 65535 is VCC
"""
diff --git a/docs/conf.py b/docs/conf.py
index 6fb66fb..4438571 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -6,6 +6,7 @@
import os
import sys
+import datetime
sys.path.insert(0, os.path.abspath(".."))
@@ -16,6 +17,7 @@
# ones.
extensions = [
"sphinx.ext.autodoc",
+ "sphinxcontrib.jquery",
"sphinx.ext.intersphinx",
"sphinx.ext.napoleon",
"sphinx.ext.todo",
@@ -29,16 +31,16 @@
intersphinx_mapping = {
- "python": ("https://docs.python.org/3.4", None),
+ "python": ("https://docs.python.org/3", None),
"BusDevice": (
- "https://circuitpython.readthedocs.io/projects/busdevice/en/latest/",
+ "https://docs.circuitpython.org/projects/busdevice/en/latest/",
None,
),
"Register": (
- "https://circuitpython.readthedocs.io/projects/register/en/latest/",
+ "https://docs.circuitpython.org/projects/register/en/latest/",
None,
),
- "CircuitPython": ("https://circuitpython.readthedocs.io/en/latest/", None),
+ "CircuitPython": ("https://docs.circuitpython.org/en/latest/", None),
}
# Add any paths that contain templates here, relative to this directory.
@@ -51,7 +53,14 @@
# General information about the project.
project = "Adafruit PCF8591 Library"
-copyright = "2020 Bryan Siepert"
+creation_year = "2020"
+current_year = str(datetime.datetime.now().year)
+year_duration = (
+ current_year
+ if current_year == creation_year
+ else creation_year + " - " + current_year
+)
+copyright = year_duration + " Bryan Siepert"
author = "Bryan Siepert"
# The version info for the project you're documenting, acts as replacement for
@@ -68,7 +77,7 @@
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
-language = None
+language = "en"
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
@@ -106,19 +115,9 @@
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
-on_rtd = os.environ.get("READTHEDOCS", None) == "True"
-
-if not on_rtd: # only import and set the theme if we're building docs locally
- try:
- import sphinx_rtd_theme
-
- html_theme = "sphinx_rtd_theme"
- html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."]
- except:
- html_theme = "default"
- html_theme_path = ["."]
-else:
- html_theme_path = ["."]
+import sphinx_rtd_theme
+
+html_theme = "sphinx_rtd_theme"
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
diff --git a/docs/index.rst b/docs/index.rst
index 9444d40..7f0270a 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -29,8 +29,9 @@ Table of Contents
.. toctree::
:caption: Other Links
- Download
- CircuitPython Reference Documentation
+ Download from GitHub
+ Download Library Bundle
+ CircuitPython Reference Documentation
CircuitPython Support Forum
Discord Chat
Adafruit Learning System
diff --git a/docs/requirements.txt b/docs/requirements.txt
index 88e6733..979f568 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -2,4 +2,6 @@
#
# SPDX-License-Identifier: Unlicense
-sphinx>=4.0.0
+sphinx
+sphinxcontrib-jquery
+sphinx-rtd-theme
diff --git a/examples/pcf8591_adc_example.py b/examples/pcf8591_adc_example.py
index 72b3346..315a7e1 100644
--- a/examples/pcf8591_adc_example.py
+++ b/examples/pcf8591_adc_example.py
@@ -14,14 +14,14 @@
# normal power and I2C connections. The voltage level should be between 0V/GND and VCC
#
########################################
-i2c = board.I2C()
+i2c = board.I2C() # uses board.SCL and board.SDA
+# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
pcf = PCF8591(i2c)
channel_a = 0
channel_b = 1
while True:
-
read_value = pcf.read(channel_a)
scaled_value = (read_value / 255) * pcf.reference_voltage
diff --git a/examples/pcf8591_analog_in.py b/examples/pcf8591_analog_in.py
index 7bb901f..0add4ba 100644
--- a/examples/pcf8591_analog_in.py
+++ b/examples/pcf8591_analog_in.py
@@ -18,7 +18,8 @@
#
########################################
-i2c = board.I2C()
+i2c = board.I2C() # uses board.SCL and board.SDA
+# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
pcf = PCF.PCF8591(i2c)
pcf_in_0 = AnalogIn(pcf, PCF.A0)
diff --git a/examples/pcf8591_dac_example.py b/examples/pcf8591_dac_example.py
index 9f4ea7d..495f672 100644
--- a/examples/pcf8591_dac_example.py
+++ b/examples/pcf8591_dac_example.py
@@ -15,7 +15,8 @@
# normal power and I2C connections
#
########################################
-i2c = board.I2C()
+i2c = board.I2C() # uses board.SCL and board.SDA
+# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
pcf = PCF8591(i2c)
print("enabling DAC")
diff --git a/examples/pcf8591_simpletest.py b/examples/pcf8591_simpletest.py
index 05b4ade..73c380a 100644
--- a/examples/pcf8591_simpletest.py
+++ b/examples/pcf8591_simpletest.py
@@ -18,14 +18,14 @@
# normal power and I2C connections
#
#####################################################################
-i2c = board.I2C()
+i2c = board.I2C() # uses board.SCL and board.SDA
+# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller
pcf = PCF.PCF8591(i2c)
pcf_in_0 = AnalogIn(pcf, PCF.A0)
pcf_out = AnalogOut(pcf, PCF.OUT)
while True:
-
print("Setting out to ", 65535)
pcf_out.value = 65535
raw_value = pcf_in_0.value
diff --git a/optional_requirements.txt b/optional_requirements.txt
new file mode 100644
index 0000000..d4e27c4
--- /dev/null
+++ b/optional_requirements.txt
@@ -0,0 +1,3 @@
+# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
+#
+# SPDX-License-Identifier: Unlicense
diff --git a/pyproject.toml b/pyproject.toml
index f3c35ae..1753b00 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,49 @@
-# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò
+# SPDX-FileCopyrightText: 2022 Alec Delaney for Adafruit Industries
#
-# SPDX-License-Identifier: Unlicense
+# SPDX-License-Identifier: MIT
-[tool.black]
-target-version = ['py35']
+[build-system]
+requires = [
+ "setuptools",
+ "wheel",
+ "setuptools-scm",
+]
+
+[project]
+name = "adafruit-circuitpython-pcf8591"
+description = "ADC+DAC Combo"
+version = "0.0.0+auto.0"
+readme = "README.rst"
+authors = [
+ {name = "Adafruit Industries", email = "circuitpython@adafruit.com"}
+]
+urls = {Homepage = "https://github.com/adafruit/Adafruit_CircuitPython_PCF8591"}
+keywords = [
+ "adafruit",
+ "blinka",
+ "circuitpython",
+ "micropython",
+ "pcf8591",
+ "Analog",
+ "Digital",
+ "Converter",
+ "Breakout",
+ "PCF",
+]
+license = {text = "MIT"}
+classifiers = [
+ "Intended Audience :: Developers",
+ "Topic :: Software Development :: Libraries",
+ "Topic :: Software Development :: Embedded Systems",
+ "Topic :: System :: Hardware",
+ "License :: OSI Approved :: MIT License",
+ "Programming Language :: Python :: 3",
+]
+dynamic = ["dependencies", "optional-dependencies"]
+
+[tool.setuptools]
+packages = ["adafruit_pcf8591"]
+
+[tool.setuptools.dynamic]
+dependencies = {file = ["requirements.txt"]}
+optional-dependencies = {optional = {file = ["optional_requirements.txt"]}}
diff --git a/requirements.txt b/requirements.txt
index cc92861..6b8b435 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,8 +1,8 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
-# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
+# SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
#
-# SPDX-License-Identifier: MIT
+# SPDX-License-Identifier: Unlicense
Adafruit-Blinka
-adafruit-circuitpython-busdevice
adafruit-circuitpython-register
+adafruit-circuitpython-busdevice
+typing-extensions~=4.0
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 2c7fa40..0000000
--- a/setup.py
+++ /dev/null
@@ -1,63 +0,0 @@
-# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
-# SPDX-FileCopyrightText: Copyright (c) 2020 Bryan Siepert for Adafruit Industries
-#
-# SPDX-License-Identifier: MIT
-
-"""A setuptools based setup module.
-
-See:
-https://packaging.python.org/en/latest/distributing.html
-https://github.com/pypa/sampleproject
-"""
-
-from setuptools import setup, find_packages
-
-# To use a consistent encoding
-from codecs import open
-from os import path
-
-here = path.abspath(path.dirname(__file__))
-
-# Get the long description from the README file
-with open(path.join(here, "README.rst"), encoding="utf-8") as f:
- long_description = f.read()
-
-setup(
- name="adafruit-circuitpython-pcf8591",
- use_scm_version=True,
- setup_requires=["setuptools_scm"],
- description="ADC+DAC Combo",
- long_description=long_description,
- long_description_content_type="text/x-rst",
- # The project's main homepage.
- url="https://github.com/adafruit/Adafruit_CircuitPython_PCF8591",
- # Author details
- author="Adafruit Industries",
- author_email="circuitpython@adafruit.com",
- install_requires=[
- "Adafruit-Blinka",
- "adafruit-circuitpython-busdevice",
- "adafruit-circuitpython-register",
- ],
- # Choose your license
- license="MIT",
- # See https://pypi.python.org/pypi?%3Aaction=list_classifiers
- classifiers=[
- "Development Status :: 3 - Alpha",
- "Intended Audience :: Developers",
- "Topic :: Software Development :: Libraries",
- "Topic :: System :: Hardware",
- "License :: OSI Approved :: MIT License",
- "Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.4",
- "Programming Language :: Python :: 3.5",
- ],
- # What does your project relate to?
- keywords="adafruit blinka circuitpython micropython pcf8591 Analog Digital Converter "
- "Breakout PCF",
- # You can just specify the packages manually here if your project is
- # simple. Or you can use find_packages().
- # TODO: IF LIBRARY FILES ARE A PACKAGE FOLDER,
- # CHANGE `py_modules=['...']` TO `packages=['...']`
- packages=["adafruit_pcf8591"],
-)