Switch to picamerax

This commit is contained in:
Joel Collins 2020-09-07 16:31:59 +01:00
parent 0bff4bdb62
commit 54c342bbbb
10 changed files with 122 additions and 99 deletions

View file

@ -31,7 +31,7 @@ class Mock(MagicMock):
return MagicMock()
mock_imports = ["picamera", "picamera.array", "picamera.mmalobj"]
mock_imports = ["picamerax", "picamerax.array", "picamerax.mmalobj"]
sys.modules.update((mod_name, Mock()) for mod_name in mock_imports)
@ -224,7 +224,7 @@ epub_exclude_files = ["search.html"]
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {
"openflexure_stage": ("https://openflexure-stage.readthedocs.io/en/latest/", None),
"picamera": ("https://picamera.readthedocs.io/en/release-1.13/", None),
"picamerax": ("https://picamerax.readthedocs.io/en/latest//", None),
"marshmallow": ("https://marshmallow.readthedocs.io/en/stable/", None),
"webargs": ("https://webargs.readthedocs.io/en/latest/", None),
}

View file

@ -4,7 +4,7 @@ Introduction
Extensions allow functionality to be added to the OpenFlexure Microscope web API without having to modify the base code.
They have full access to the :py:class:`openflexure_microscope.Microscope` object,
including direct access to any attached :py:class:`openflexure_microscope.camera.base.BaseCamera` and :py:class:`openflexure_stage.stage.OpenFlexureStage` objects.
This also allows access to the :py:class:`picamera.PiCamera` object.
This also allows access to the :py:class:`picamerax.PiCamera` object.
Extensions can either be loaded from a single Python file, or as a Python package installed to the environment being used.

View file

@ -204,4 +204,4 @@ if __name__ == "__main__":
from labthings import Server
logging.info("Starting OpenFlexure Microscope Server...")
server = Server(app)
server.run(host="::", port=5000, debug=False, zeroconf=True)
server.run(host="0.0.0.0", port=5000, debug=False, zeroconf=True)

View file

@ -2,8 +2,8 @@ import numpy as np
import time
import logging
from picamera import PiCamera
from picamera.array import PiRGBArray, PiBayerArray
from picamerax import PiCamera
from picamerax.array import PiRGBArray, PiBayerArray
def rgb_image(camera, resize=None, **kwargs):

View file

@ -1,6 +1,6 @@
{
"name": "openflexure-microscope-jsclient",
"version": "2.3.0",
"version": "2.4.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View file

@ -6,7 +6,7 @@ from openflexure_microscope.api.utilities import get_bool, JsonResponse
from labthings import Schema, fields, find_component
from labthings.views import View, PropertyView
from labthings.utilities import description_from_view
from labthings.views.marshalling import marshal_with
from labthings.marshalling import marshal_with
from marshmallow import pre_dump

View file

@ -35,8 +35,8 @@ import os
import logging
# Pi camera
import picamera
import picamera.array
import picamerax
import picamerax.array
# Type hinting
from typing import Tuple
@ -87,8 +87,8 @@ class PiCameraStreamer(BaseCamera):
BaseCamera.__init__(self)
# Attach to Pi camera
self.camera = (
picamera.PiCamera()
) #: :py:class:`picamera.PiCamera`: Picamera object
picamerax.PiCamera()
) #: :py:class:`picamerax.PiCamera`: Picamera object
# Store state of PiCameraStreamer
self.preview_active = False
@ -247,7 +247,7 @@ class PiCameraStreamer(BaseCamera):
"""
Args:
settings_dict (dict): Dictionary of properties to apply to the :py:class:`picamera.PiCamera`: object
settings_dict (dict): Dictionary of properties to apply to the :py:class:`picamerax.PiCamera`: object
pause_for_effect (bool): Pause tactically to reduce risk of timing issues
"""
# Set exposure mode
@ -339,11 +339,11 @@ class PiCameraStreamer(BaseCamera):
if fullscreen:
self.camera.preview.fullscreen = fullscreen
self.preview_active = True
except picamera.exc.PiCameraMMALError as e:
except picamerax.exc.PiCameraMMALError as e:
logging.error(
"Suppressed a MMALError in start_preview. Exception: {}".format(e)
)
except picamera.exc.PiCameraValueError as e:
except picamerax.exc.PiCameraValueError as e:
logging.error(
"Suppressed a ValueError exception in start_preview. Exception: {}".format(
e
@ -427,7 +427,7 @@ class PiCameraStreamer(BaseCamera):
# Stop the camera video recording on port 1
try:
self.camera.stop_recording(splitter_port=splitter_port)
except picamera.exc.PiCameraNotRecording:
except picamerax.exc.PiCameraNotRecording:
logging.info("Not recording on splitter_port {}".format(splitter_port))
else:
logging.info(
@ -467,7 +467,7 @@ class PiCameraStreamer(BaseCamera):
# Reduce the resolution for video streaming
try:
self.camera._check_recording_stopped()
except picamera.exc.PiCameraRuntimeError:
except picamerax.exc.PiCameraRuntimeError:
logging.info(
"Error while changing resolution: Recording already running."
)
@ -487,7 +487,7 @@ class PiCameraStreamer(BaseCamera):
# metric)
splitter_port=splitter_port,
)
except picamera.exc.PiCameraAlreadyRecording:
except picamerax.exc.PiCameraAlreadyRecording:
logging.info(
"Error while starting preview: Recording already running."
)
@ -573,7 +573,7 @@ class PiCameraStreamer(BaseCamera):
self.stop_stream_recording(resolution=resolution)
logging.debug("Creating PiYUVArray")
with picamera.array.PiYUVArray(self.camera, size=size) as output:
with picamerax.array.PiYUVArray(self.camera, size=size) as output:
logging.info("Capturing to {}".format(output))
@ -613,7 +613,7 @@ class PiCameraStreamer(BaseCamera):
self.stop_stream_recording(resolution=resolution)
logging.debug("Creating PiRGBArray")
with picamera.array.PiRGBArray(self.camera, size=size) as output:
with picamerax.array.PiRGBArray(self.camera, size=size) as output:
logging.info("Capturing to {}".format(output))

View file

@ -1,8 +1,8 @@
from __future__ import print_function
import picamera
from picamera import mmal, mmalobj, exc
from picamera.mmalobj import to_rational
import picamerax
from picamerax import mmal, mmalobj, exc
from picamerax.mmalobj import to_rational
import time
import logging
@ -13,7 +13,7 @@ MMAL_PARAMETER_DIGITAL_GAIN = mmal.MMAL_PARAMETER_GROUP_CAMERA + 0x5A
def set_gain(camera, gain, value):
"""Set the analog gain of a PiCamera.
camera: the picamera.PiCamera() instance you are configuring
camera: the picamerax.PiCamera() instance you are configuring
gain: either MMAL_PARAMETER_ANALOG_GAIN or MMAL_PARAMETER_DIGITAL_GAIN
value: a numeric value that can be converted to a rational number.
"""
@ -42,7 +42,7 @@ def set_digital_gain(camera, value):
if __name__ == "__main__":
with picamera.PiCamera() as cam:
with picamerax.PiCamera() as cam:
cam.start_preview(fullscreen=False, window=(0, 50, 640, 480))
time.sleep(2)

167
poetry.lock generated
View file

@ -12,16 +12,34 @@ description = "A pluggable API specification generator. Currently supports the O
name = "apispec"
optional = false
python-versions = ">=3.5"
version = "3.3.1"
version = "3.3.2"
[package.extras]
dev = ["PyYAML (>=3.10)", "prance (>=0.11)", "marshmallow (>=2.19.2)", "pytest", "mock", "flake8 (3.8.2)", "flake8-bugbear (20.1.4)", "pre-commit (>=2.4,<3.0)", "tox"]
docs = ["marshmallow (>=2.19.2)", "pyyaml (5.3.1)", "sphinx (3.0.4)", "sphinx-issues (1.2.0)", "sphinx-rtd-theme (0.4.3)"]
lint = ["flake8 (3.8.2)", "flake8-bugbear (20.1.4)", "pre-commit (>=2.4,<3.0)"]
dev = ["PyYAML (>=3.10)", "prance (>=0.11)", "marshmallow (>=2.19.2)", "pytest", "mock", "flake8 (3.8.3)", "flake8-bugbear (20.1.4)", "pre-commit (>=2.4,<3.0)", "tox"]
docs = ["marshmallow (>=2.19.2)", "pyyaml (5.3.1)", "sphinx (3.2.1)", "sphinx-issues (1.2.0)", "sphinx-rtd-theme (0.5.0)"]
lint = ["flake8 (3.8.3)", "flake8-bugbear (20.1.4)", "pre-commit (>=2.4,<3.0)"]
tests = ["PyYAML (>=3.10)", "prance (>=0.11)", "marshmallow (>=2.19.2)", "pytest", "mock"]
validation = ["prance (>=0.11)"]
yaml = ["PyYAML (>=3.10)"]
[[package]]
category = "main"
description = "Web framework plugins for apispec."
name = "apispec-webframeworks"
optional = false
python-versions = ">=3.6"
version = "0.5.2"
[package.dependencies]
[package.dependencies.apispec]
extras = ["yaml"]
version = ">=2.0.0"
[package.extras]
dev = ["pytest", "mock", "Flask (1.1.1)", "tornado", "bottle (0.12.17)", "flake8 (3.7.9)", "flake8-bugbear (19.8.0)", "pre-commit (>=1.18,<2.0)", "tox"]
lint = ["flake8 (3.7.9)", "flake8-bugbear (19.8.0)", "pre-commit (>=1.18,<2.0)"]
tests = ["pytest", "mock", "Flask (1.1.1)", "tornado", "bottle (0.12.17)"]
[[package]]
category = "dev"
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
@ -53,13 +71,13 @@ description = "Classes Without Boilerplate"
name = "attrs"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "19.3.0"
version = "20.2.0"
[package.extras]
azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"]
dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"]
docs = ["sphinx", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"]
docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"]
[[package]]
category = "dev"
@ -137,6 +155,18 @@ optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.4.3"
[[package]]
category = "main"
description = "Yet another Python color library."
name = "colorzero"
optional = false
python-versions = "*"
version = "1.1"
[package.extras]
doc = ["sphinx"]
test = ["pytest", "coverage", "mock"]
[[package]]
category = "dev"
description = "Docutils -- Python Documentation Utilities"
@ -181,24 +211,12 @@ description = "A Flask extension adding a decorator for CORS support"
name = "flask-cors"
optional = false
python-versions = "*"
version = "3.0.8"
version = "3.0.9"
[package.dependencies]
Flask = ">=0.9"
Six = "*"
[[package]]
category = "main"
description = "Barebones websocket extension for Flask, using Pythonthreading for low-traffic concurrency"
name = "flask-threaded-sockets"
optional = false
python-versions = ">=3.6,<4.0"
version = "0.2.0"
[package.dependencies]
flask = ">=1.1.2,<2.0.0"
werkzeug = ">=1.0.1,<2.0.0"
[[package]]
category = "main"
description = "Clean single-source support for Python 3 and 2"
@ -236,14 +254,13 @@ category = "dev"
description = "A Python utility / library to sort Python imports."
name = "isort"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "4.3.21"
python-versions = ">=3.6,<4.0"
version = "5.5.1"
[package.extras]
pipfile = ["pipreqs", "requirementslib"]
pyproject = ["toml"]
requirements = ["pipreqs", "pip-api"]
xdg_home = ["appdirs (>=1.4.0)"]
colors = ["colorama (>=0.4.3,<0.5.0)"]
pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
requirements_deprecated_finder = ["pipreqs", "pip-api"]
[[package]]
category = "main"
@ -269,21 +286,25 @@ i18n = ["Babel (>=0.8)"]
[[package]]
category = "main"
description = "Python implementation of LabThings, based on the Flask microframework"
description = ""
name = "labthings"
optional = false
python-versions = ">=3.6,<4.0"
python-versions = "^3.6"
version = "0.8.0"
[package.dependencies]
Flask = ">=1.1.1,<2.0.0"
apispec = ">=3.2.0,<4.0.0"
flask-cors = ">=3.0.8,<4.0.0"
flask-threaded-sockets = ">=0.2.0,<0.3.0"
marshmallow = ">=3.4.0,<4.0.0"
webargs = ">=6.0.0,<7.0.0"
Flask = "^1.1.1"
apispec = "^3.2.0"
apispec_webframeworks = "^0.5.2"
flask-cors = "^3.0.8"
marshmallow = "^3.4.0"
webargs = "^6.0.0"
zeroconf = ">=0.24.5,<0.29.0"
[package.source]
reference = "c79e6f28d5ffbd61dcfe7fc94130db604cdb4e2d"
type = "git"
url = "https://github.com/labthings/python-labthings.git"
[[package]]
category = "dev"
description = "A fast and thorough lazy object proxy."
@ -368,22 +389,20 @@ six = "*"
[[package]]
category = "main"
description = "A pure Python interface for the Raspberry Pi camera module."
name = "picamera"
description = "A pure Python interface for the Raspberry Pi camera module, with extra features and fixes."
name = "picamerax"
optional = false
python-versions = "*"
version = "1.13.2b0"
version = "20.9.1"
[package.dependencies]
colorzero = "*"
[package.extras]
array = ["numpy"]
doc = ["sphinx"]
test = ["coverage", "pytest", "mock", "pillow", "numpy"]
[package.source]
reference = ""
type = "url"
url = "https://github.com/rwb27/picamera/releases/download/v1.13.2b0/picamera-1.13.2b0-py3-none-any.whl"
[[package]]
category = "main"
description = "Python Imaging Library (Fork)"
@ -417,12 +436,12 @@ description = "python code static checker"
name = "pylint"
optional = false
python-versions = ">=3.5.*"
version = "2.5.3"
version = "2.6.0"
[package.dependencies]
astroid = ">=2.4.0,<=2.5"
colorama = "*"
isort = ">=4.2.5,<5"
isort = ">=4.2.5,<6"
mccabe = ">=0.6,<0.7"
toml = ">=0.7.1"
@ -554,7 +573,7 @@ description = "Python documentation generator"
name = "sphinx"
optional = false
python-versions = ">=3.5"
version = "3.1.2"
version = "3.2.1"
[package.dependencies]
Jinja2 = ">=2.3"
@ -737,7 +756,7 @@ description = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avah
name = "zeroconf"
optional = false
python-versions = "*"
version = "0.28.0"
version = "0.28.4"
[package.dependencies]
ifaddr = ">=0.1.7"
@ -746,7 +765,7 @@ ifaddr = ">=0.1.7"
rpi = ["RPi.GPIO"]
[metadata]
content-hash = "a96446d383ec578ba7208ee8ae3b919b08352ba0e664b792f971a9535abc85d1"
content-hash = "d3ce92f78e9972811931a8531fc3dde0052b84ade5337aed91f86e74dc68eea0"
lock-version = "1.0"
python-versions = "^3.6"
@ -756,8 +775,12 @@ alabaster = [
{file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
]
apispec = [
{file = "apispec-3.3.1-py2.py3-none-any.whl", hash = "sha256:b65063e11968a8c26dbbe9b4100ee24026a41cc358dd204df279bdedd7d8dea2"},
{file = "apispec-3.3.1.tar.gz", hash = "sha256:f5244ccca33f7a81309f6b3c9d458e33e869050c2d861b9f8cee24b3ad739d2b"},
{file = "apispec-3.3.2-py2.py3-none-any.whl", hash = "sha256:a1df9ec6b2cd0edf45039ef025abd7f0660808fa2edf737d3ba1cf5ef1a4625b"},
{file = "apispec-3.3.2.tar.gz", hash = "sha256:d23ebd5b71e541e031b02a19db10b5e6d5ef8452c552833e3e1afc836b40b1ad"},
]
apispec-webframeworks = [
{file = "apispec-webframeworks-0.5.2.tar.gz", hash = "sha256:0db35b267914b3f8c562aca0261957dbcb4176f255eacc22520277010818dcf3"},
{file = "apispec_webframeworks-0.5.2-py2.py3-none-any.whl", hash = "sha256:482c563abbcc2a261439476cb3f1a7c7284cc997c322c574d48c111643e9c04e"},
]
appdirs = [
{file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
@ -768,8 +791,8 @@ astroid = [
{file = "astroid-2.4.2.tar.gz", hash = "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703"},
]
attrs = [
{file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"},
{file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"},
{file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"},
{file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"},
]
babel = [
{file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
@ -799,6 +822,10 @@ colorama = [
{file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
{file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
]
colorzero = [
{file = "colorzero-1.1-py2.py3-none-any.whl", hash = "sha256:e3c36d15b293de2b2f77ff54a5bd243fffac941ed0a5332d0697a6612a26a0a3"},
{file = "colorzero-1.1.tar.gz", hash = "sha256:acba47119b5d8555680d3cda9afe6ccc5481385ccc3c00084dd973f7aa184599"},
]
docutils = [
{file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
{file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
@ -811,12 +838,8 @@ flask = [
{file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"},
]
flask-cors = [
{file = "Flask-Cors-3.0.8.tar.gz", hash = "sha256:72170423eb4612f0847318afff8c247b38bd516b7737adfc10d1c2cdbb382d16"},
{file = "Flask_Cors-3.0.8-py2.py3-none-any.whl", hash = "sha256:f4d97201660e6bbcff2d89d082b5b6d31abee04b1b3003ee073a6fd25ad1d69a"},
]
flask-threaded-sockets = [
{file = "flask_threaded_sockets-0.2.0-py3-none-any.whl", hash = "sha256:e3fc55ccf7f22e801b967f15efd4d30ae8627c1fdc3c27e0195ba1bd369e32e1"},
{file = "flask_threaded_sockets-0.2.0.tar.gz", hash = "sha256:e9d2ee66ae1c9c2ac86373510c2a4295e0230109130b7bc6d2499f5cd4140361"},
{file = "Flask-Cors-3.0.9.tar.gz", hash = "sha256:6bcfc100288c5d1bcb1dbb854babd59beee622ffd321e444b05f24d6d58466b8"},
{file = "Flask_Cors-3.0.9-py2.py3-none-any.whl", hash = "sha256:cee4480aaee421ed029eaa788f4049e3e26d15b5affb6a880dade6bafad38324"},
]
future = [
{file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
@ -834,8 +857,8 @@ imagesize = [
{file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
]
isort = [
{file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"},
{file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"},
{file = "isort-5.5.1-py3-none-any.whl", hash = "sha256:a200d47b7ee8b7f7d0a9646650160c4a51b6a91a9413fd31b1da2c4de789f5d3"},
{file = "isort-5.5.1.tar.gz", hash = "sha256:92533892058de0306e51c88f22ece002a209dc8e80288aa3cec6d443060d584f"},
]
itsdangerous = [
{file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"},
@ -845,10 +868,7 @@ jinja2 = [
{file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"},
{file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"},
]
labthings = [
{file = "labthings-0.8.0-py3-none-any.whl", hash = "sha256:133eb1480dc6ea851faa9a16bcf34d075d513935eac82f8da492e6dc5e336b6c"},
{file = "labthings-0.8.0.tar.gz", hash = "sha256:3c440c1bb9547858f2dbe6a85746174c6050016a0a86d773d986ca83fbf89874"},
]
labthings = []
lazy-object-proxy = [
{file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"},
{file = "lazy_object_proxy-1.4.3-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442"},
@ -991,7 +1011,10 @@ packaging = [
{file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
{file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"},
]
picamera = []
picamerax = [
{file = "picamerax-20.9.1-py3-none-any.whl", hash = "sha256:8dc45542644ed9c67e3b331e90bcffa04098e8b056a42d0fedb25769b0b1f17e"},
{file = "picamerax-20.9.1.tar.gz", hash = "sha256:fccb201ad9e2ab67946111d6bf875289c141ef900fd5875de6d435d219c59440"},
]
pillow = [
{file = "Pillow-5.4.1-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1"},
{file = "Pillow-5.4.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7"},
@ -1063,8 +1086,8 @@ pygments = [
{file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"},
]
pylint = [
{file = "pylint-2.5.3-py3-none-any.whl", hash = "sha256:d0ece7d223fe422088b0e8f13fa0a1e8eb745ebffcb8ed53d3e95394b6101a1c"},
{file = "pylint-2.5.3.tar.gz", hash = "sha256:7dd78437f2d8d019717dbf287772d0b2dbdfd13fc016aa7faa08d67bccc46adc"},
{file = "pylint-2.6.0-py3-none-any.whl", hash = "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"},
{file = "pylint-2.6.0.tar.gz", hash = "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210"},
]
pynpm = [
{file = "pynpm-0.1.2-py2.py3-none-any.whl", hash = "sha256:3f03fbf667549f8b8b7e0419eef88d1b21833ce288f96de66fbb761b9f4c4061"},
@ -1134,8 +1157,8 @@ snowballstemmer = [
{file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"},
]
sphinx = [
{file = "Sphinx-3.1.2-py3-none-any.whl", hash = "sha256:97dbf2e31fc5684bb805104b8ad34434ed70e6c588f6896991b2fdfd2bef8c00"},
{file = "Sphinx-3.1.2.tar.gz", hash = "sha256:b9daeb9b39aa1ffefc2809b43604109825300300b987a24f45976c001ba1a8fd"},
{file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"},
{file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"},
]
sphinxcontrib-applehelp = [
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"},
@ -1208,6 +1231,6 @@ wrapt = [
{file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
]
zeroconf = [
{file = "zeroconf-0.28.0-py3-none-any.whl", hash = "sha256:8c448ad37ed074ce8811c9eb2765c01714a93f977a1c04fc39fbf6f516b0566f"},
{file = "zeroconf-0.28.0.tar.gz", hash = "sha256:881da2ed3d7c8e0ab59fb1cc8b02b53134351941c4d8d3f3553a96700f257a03"},
{file = "zeroconf-0.28.4-py3-none-any.whl", hash = "sha256:28b5590e32b6504a219d100a2007e7ba4d40804fd6802b238164ea3a664b29cb"},
{file = "zeroconf-0.28.4.tar.gz", hash = "sha256:ec489012835544481c9c669e6cd91ff7ebe5407cf5797a4cbc739be5d6bbce0c"},
]

View file

@ -35,7 +35,6 @@ numpy = "1.18.2"
Pillow = "^5.4"
scipy = "1.4.1" # Exact version so we can guarantee a wheel
"RPi.GPIO" = { version = "^0.7.0", optional = true }
picamera = {url = "https://github.com/rwb27/picamera/releases/download/v1.13.2b0/picamera-1.13.2b0-py3-none-any.whl" }
python-dateutil = "^2.8"
psutil = "^5.6.7" # Autostorage extension
opencv-python-headless = [
@ -46,7 +45,8 @@ pynpm = "^0.1.2"
sangaboard = "^0.2"
expiringdict = "^1.2.1"
camera-stage-mapping = "0.1.4"
labthings = "0.8.0"
picamerax = ">=20.9.1"
labthings = {git = "https://github.com/labthings/python-labthings.git"}
[tool.poetry.extras]
rpi = ["RPi.GPIO"]