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() 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) 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. # Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = { intersphinx_mapping = {
"openflexure_stage": ("https://openflexure-stage.readthedocs.io/en/latest/", None), "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), "marshmallow": ("https://marshmallow.readthedocs.io/en/stable/", None),
"webargs": ("https://webargs.readthedocs.io/en/latest/", 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. 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, 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. 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. 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 from labthings import Server
logging.info("Starting OpenFlexure Microscope Server...") logging.info("Starting OpenFlexure Microscope Server...")
server = Server(app) 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 time
import logging import logging
from picamera import PiCamera from picamerax import PiCamera
from picamera.array import PiRGBArray, PiBayerArray from picamerax.array import PiRGBArray, PiBayerArray
def rgb_image(camera, resize=None, **kwargs): def rgb_image(camera, resize=None, **kwargs):

View file

@ -1,6 +1,6 @@
{ {
"name": "openflexure-microscope-jsclient", "name": "openflexure-microscope-jsclient",
"version": "2.3.0", "version": "2.4.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "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 import Schema, fields, find_component
from labthings.views import View, PropertyView from labthings.views import View, PropertyView
from labthings.utilities import description_from_view 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 from marshmallow import pre_dump

View file

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

View file

@ -1,8 +1,8 @@
from __future__ import print_function from __future__ import print_function
import picamera import picamerax
from picamera import mmal, mmalobj, exc from picamerax import mmal, mmalobj, exc
from picamera.mmalobj import to_rational from picamerax.mmalobj import to_rational
import time import time
import logging import logging
@ -13,7 +13,7 @@ MMAL_PARAMETER_DIGITAL_GAIN = mmal.MMAL_PARAMETER_GROUP_CAMERA + 0x5A
def set_gain(camera, gain, value): def set_gain(camera, gain, value):
"""Set the analog gain of a PiCamera. """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 gain: either MMAL_PARAMETER_ANALOG_GAIN or MMAL_PARAMETER_DIGITAL_GAIN
value: a numeric value that can be converted to a rational number. 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__": if __name__ == "__main__":
with picamera.PiCamera() as cam: with picamerax.PiCamera() as cam:
cam.start_preview(fullscreen=False, window=(0, 50, 640, 480)) cam.start_preview(fullscreen=False, window=(0, 50, 640, 480))
time.sleep(2) 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" name = "apispec"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "3.3.1" version = "3.3.2"
[package.extras] [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"] 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.0.4)", "sphinx-issues (1.2.0)", "sphinx-rtd-theme (0.4.3)"] 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.2)", "flake8-bugbear (20.1.4)", "pre-commit (>=2.4,<3.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"] tests = ["PyYAML (>=3.10)", "prance (>=0.11)", "marshmallow (>=2.19.2)", "pytest", "mock"]
validation = ["prance (>=0.11)"] validation = ["prance (>=0.11)"]
yaml = ["PyYAML (>=3.10)"] 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]] [[package]]
category = "dev" category = "dev"
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 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" name = "attrs"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "19.3.0" version = "20.2.0"
[package.extras] [package.extras]
azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"]
dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
docs = ["sphinx", "zope.interface"] tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"]
tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"]
[[package]] [[package]]
category = "dev" category = "dev"
@ -137,6 +155,18 @@ optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.4.3" 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]] [[package]]
category = "dev" category = "dev"
description = "Docutils -- Python Documentation Utilities" description = "Docutils -- Python Documentation Utilities"
@ -181,24 +211,12 @@ description = "A Flask extension adding a decorator for CORS support"
name = "flask-cors" name = "flask-cors"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "3.0.8" version = "3.0.9"
[package.dependencies] [package.dependencies]
Flask = ">=0.9" Flask = ">=0.9"
Six = "*" 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]] [[package]]
category = "main" category = "main"
description = "Clean single-source support for Python 3 and 2" 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." description = "A Python utility / library to sort Python imports."
name = "isort" name = "isort"
optional = false optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" python-versions = ">=3.6,<4.0"
version = "4.3.21" version = "5.5.1"
[package.extras] [package.extras]
pipfile = ["pipreqs", "requirementslib"] colors = ["colorama (>=0.4.3,<0.5.0)"]
pyproject = ["toml"] pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
requirements = ["pipreqs", "pip-api"] requirements_deprecated_finder = ["pipreqs", "pip-api"]
xdg_home = ["appdirs (>=1.4.0)"]
[[package]] [[package]]
category = "main" category = "main"
@ -269,21 +286,25 @@ i18n = ["Babel (>=0.8)"]
[[package]] [[package]]
category = "main" category = "main"
description = "Python implementation of LabThings, based on the Flask microframework" description = ""
name = "labthings" name = "labthings"
optional = false optional = false
python-versions = ">=3.6,<4.0" python-versions = "^3.6"
version = "0.8.0" version = "0.8.0"
[package.dependencies] [package.dependencies]
Flask = ">=1.1.1,<2.0.0" Flask = "^1.1.1"
apispec = ">=3.2.0,<4.0.0" apispec = "^3.2.0"
flask-cors = ">=3.0.8,<4.0.0" apispec_webframeworks = "^0.5.2"
flask-threaded-sockets = ">=0.2.0,<0.3.0" flask-cors = "^3.0.8"
marshmallow = ">=3.4.0,<4.0.0" marshmallow = "^3.4.0"
webargs = ">=6.0.0,<7.0.0" webargs = "^6.0.0"
zeroconf = ">=0.24.5,<0.29.0" zeroconf = ">=0.24.5,<0.29.0"
[package.source]
reference = "c79e6f28d5ffbd61dcfe7fc94130db604cdb4e2d"
type = "git"
url = "https://github.com/labthings/python-labthings.git"
[[package]] [[package]]
category = "dev" category = "dev"
description = "A fast and thorough lazy object proxy." description = "A fast and thorough lazy object proxy."
@ -368,22 +389,20 @@ six = "*"
[[package]] [[package]]
category = "main" category = "main"
description = "A pure Python interface for the Raspberry Pi camera module." description = "A pure Python interface for the Raspberry Pi camera module, with extra features and fixes."
name = "picamera" name = "picamerax"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "1.13.2b0" version = "20.9.1"
[package.dependencies]
colorzero = "*"
[package.extras] [package.extras]
array = ["numpy"] array = ["numpy"]
doc = ["sphinx"] doc = ["sphinx"]
test = ["coverage", "pytest", "mock", "pillow", "numpy"] 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]] [[package]]
category = "main" category = "main"
description = "Python Imaging Library (Fork)" description = "Python Imaging Library (Fork)"
@ -417,12 +436,12 @@ description = "python code static checker"
name = "pylint" name = "pylint"
optional = false optional = false
python-versions = ">=3.5.*" python-versions = ">=3.5.*"
version = "2.5.3" version = "2.6.0"
[package.dependencies] [package.dependencies]
astroid = ">=2.4.0,<=2.5" astroid = ">=2.4.0,<=2.5"
colorama = "*" colorama = "*"
isort = ">=4.2.5,<5" isort = ">=4.2.5,<6"
mccabe = ">=0.6,<0.7" mccabe = ">=0.6,<0.7"
toml = ">=0.7.1" toml = ">=0.7.1"
@ -554,7 +573,7 @@ description = "Python documentation generator"
name = "sphinx" name = "sphinx"
optional = false optional = false
python-versions = ">=3.5" python-versions = ">=3.5"
version = "3.1.2" version = "3.2.1"
[package.dependencies] [package.dependencies]
Jinja2 = ">=2.3" Jinja2 = ">=2.3"
@ -737,7 +756,7 @@ description = "Pure Python Multicast DNS Service Discovery Library (Bonjour/Avah
name = "zeroconf" name = "zeroconf"
optional = false optional = false
python-versions = "*" python-versions = "*"
version = "0.28.0" version = "0.28.4"
[package.dependencies] [package.dependencies]
ifaddr = ">=0.1.7" ifaddr = ">=0.1.7"
@ -746,7 +765,7 @@ ifaddr = ">=0.1.7"
rpi = ["RPi.GPIO"] rpi = ["RPi.GPIO"]
[metadata] [metadata]
content-hash = "a96446d383ec578ba7208ee8ae3b919b08352ba0e664b792f971a9535abc85d1" content-hash = "d3ce92f78e9972811931a8531fc3dde0052b84ade5337aed91f86e74dc68eea0"
lock-version = "1.0" lock-version = "1.0"
python-versions = "^3.6" python-versions = "^3.6"
@ -756,8 +775,12 @@ alabaster = [
{file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
] ]
apispec = [ apispec = [
{file = "apispec-3.3.1-py2.py3-none-any.whl", hash = "sha256:b65063e11968a8c26dbbe9b4100ee24026a41cc358dd204df279bdedd7d8dea2"}, {file = "apispec-3.3.2-py2.py3-none-any.whl", hash = "sha256:a1df9ec6b2cd0edf45039ef025abd7f0660808fa2edf737d3ba1cf5ef1a4625b"},
{file = "apispec-3.3.1.tar.gz", hash = "sha256:f5244ccca33f7a81309f6b3c9d458e33e869050c2d861b9f8cee24b3ad739d2b"}, {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 = [ appdirs = [
{file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {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"}, {file = "astroid-2.4.2.tar.gz", hash = "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703"},
] ]
attrs = [ attrs = [
{file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, {file = "attrs-20.2.0-py2.py3-none-any.whl", hash = "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc"},
{file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, {file = "attrs-20.2.0.tar.gz", hash = "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594"},
] ]
babel = [ babel = [
{file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, {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-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
{file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, {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 = [ docutils = [
{file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"},
{file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"},
@ -811,12 +838,8 @@ flask = [
{file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"}, {file = "Flask-1.1.2.tar.gz", hash = "sha256:4efa1ae2d7c9865af48986de8aeb8504bf32c7f3d6fdc9353d34b21f4b127060"},
] ]
flask-cors = [ flask-cors = [
{file = "Flask-Cors-3.0.8.tar.gz", hash = "sha256:72170423eb4612f0847318afff8c247b38bd516b7737adfc10d1c2cdbb382d16"}, {file = "Flask-Cors-3.0.9.tar.gz", hash = "sha256:6bcfc100288c5d1bcb1dbb854babd59beee622ffd321e444b05f24d6d58466b8"},
{file = "Flask_Cors-3.0.8-py2.py3-none-any.whl", hash = "sha256:f4d97201660e6bbcff2d89d082b5b6d31abee04b1b3003ee073a6fd25ad1d69a"}, {file = "Flask_Cors-3.0.9-py2.py3-none-any.whl", hash = "sha256:cee4480aaee421ed029eaa788f4049e3e26d15b5affb6a880dade6bafad38324"},
]
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"},
] ]
future = [ future = [
{file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, {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"}, {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"},
] ]
isort = [ isort = [
{file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"}, {file = "isort-5.5.1-py3-none-any.whl", hash = "sha256:a200d47b7ee8b7f7d0a9646650160c4a51b6a91a9413fd31b1da2c4de789f5d3"},
{file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, {file = "isort-5.5.1.tar.gz", hash = "sha256:92533892058de0306e51c88f22ece002a209dc8e80288aa3cec6d443060d584f"},
] ]
itsdangerous = [ itsdangerous = [
{file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, {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-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"},
{file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"},
] ]
labthings = [ labthings = []
{file = "labthings-0.8.0-py3-none-any.whl", hash = "sha256:133eb1480dc6ea851faa9a16bcf34d075d513935eac82f8da492e6dc5e336b6c"},
{file = "labthings-0.8.0.tar.gz", hash = "sha256:3c440c1bb9547858f2dbe6a85746174c6050016a0a86d773d986ca83fbf89874"},
]
lazy-object-proxy = [ lazy-object-proxy = [
{file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"}, {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"}, {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-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"},
{file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, {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 = [ 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-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"}, {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"}, {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"},
] ]
pylint = [ pylint = [
{file = "pylint-2.5.3-py3-none-any.whl", hash = "sha256:d0ece7d223fe422088b0e8f13fa0a1e8eb745ebffcb8ed53d3e95394b6101a1c"}, {file = "pylint-2.6.0-py3-none-any.whl", hash = "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f"},
{file = "pylint-2.5.3.tar.gz", hash = "sha256:7dd78437f2d8d019717dbf287772d0b2dbdfd13fc016aa7faa08d67bccc46adc"}, {file = "pylint-2.6.0.tar.gz", hash = "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210"},
] ]
pynpm = [ pynpm = [
{file = "pynpm-0.1.2-py2.py3-none-any.whl", hash = "sha256:3f03fbf667549f8b8b7e0419eef88d1b21833ce288f96de66fbb761b9f4c4061"}, {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"}, {file = "snowballstemmer-2.0.0.tar.gz", hash = "sha256:df3bac3df4c2c01363f3dd2cfa78cce2840a79b9f1c2d2de9ce8d31683992f52"},
] ]
sphinx = [ sphinx = [
{file = "Sphinx-3.1.2-py3-none-any.whl", hash = "sha256:97dbf2e31fc5684bb805104b8ad34434ed70e6c588f6896991b2fdfd2bef8c00"}, {file = "Sphinx-3.2.1-py3-none-any.whl", hash = "sha256:ce6fd7ff5b215af39e2fcd44d4a321f6694b4530b6f2b2109b64d120773faea0"},
{file = "Sphinx-3.1.2.tar.gz", hash = "sha256:b9daeb9b39aa1ffefc2809b43604109825300300b987a24f45976c001ba1a8fd"}, {file = "Sphinx-3.2.1.tar.gz", hash = "sha256:321d6d9b16fa381a5306e5a0b76cd48ffbc588e6340059a729c6fdd66087e0e8"},
] ]
sphinxcontrib-applehelp = [ sphinxcontrib-applehelp = [
{file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {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"}, {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
] ]
zeroconf = [ zeroconf = [
{file = "zeroconf-0.28.0-py3-none-any.whl", hash = "sha256:8c448ad37ed074ce8811c9eb2765c01714a93f977a1c04fc39fbf6f516b0566f"}, {file = "zeroconf-0.28.4-py3-none-any.whl", hash = "sha256:28b5590e32b6504a219d100a2007e7ba4d40804fd6802b238164ea3a664b29cb"},
{file = "zeroconf-0.28.0.tar.gz", hash = "sha256:881da2ed3d7c8e0ab59fb1cc8b02b53134351941c4d8d3f3553a96700f257a03"}, {file = "zeroconf-0.28.4.tar.gz", hash = "sha256:ec489012835544481c9c669e6cd91ff7ebe5407cf5797a4cbc739be5d6bbce0c"},
] ]

View file

@ -35,7 +35,6 @@ numpy = "1.18.2"
Pillow = "^5.4" Pillow = "^5.4"
scipy = "1.4.1" # Exact version so we can guarantee a wheel scipy = "1.4.1" # Exact version so we can guarantee a wheel
"RPi.GPIO" = { version = "^0.7.0", optional = true } "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" python-dateutil = "^2.8"
psutil = "^5.6.7" # Autostorage extension psutil = "^5.6.7" # Autostorage extension
opencv-python-headless = [ opencv-python-headless = [
@ -46,7 +45,8 @@ pynpm = "^0.1.2"
sangaboard = "^0.2" sangaboard = "^0.2"
expiringdict = "^1.2.1" expiringdict = "^1.2.1"
camera-stage-mapping = "0.1.4" 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] [tool.poetry.extras]
rpi = ["RPi.GPIO"] rpi = ["RPi.GPIO"]