@opentrons/shared-data 0.0.1-alpha.20 → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Makefile +1 -1
- package/lib/opentrons-shared-data.js +1 -1
- package/lib/opentrons-shared-data.js.map +1 -1
- package/package.json +1 -1
- package/js/__tests__/__snapshots__/pipettes.test.ts.snap +0 -5969
- package/js/__tests__/deckSchemas.test.ts +0 -87
- package/js/__tests__/errors.test.js +0 -21
- package/js/__tests__/getAreSlotsAdjacent.test.ts +0 -128
- package/js/__tests__/getWellNamePerMultiTip.test.ts +0 -162
- package/js/__tests__/labwareDefQuirks.test.ts +0 -37
- package/js/__tests__/labwareDefSchemaV1.test.ts +0 -82
- package/js/__tests__/labwareDefSchemaV2.test.ts +0 -298
- package/js/__tests__/moduleAccessors.test.ts +0 -50
- package/js/__tests__/moduleSpecsSchema.test.ts +0 -77
- package/js/__tests__/pipetteSchemaV2.test.ts +0 -107
- package/js/__tests__/pipetteSpecSchemas.test.ts +0 -48
- package/js/__tests__/pipettes.test.ts +0 -58
- package/js/__tests__/protocolSchemaV4.test.ts +0 -137
- package/js/__tests__/protocolSchemaV5.test.ts +0 -137
- package/js/__tests__/protocolSchemaV6.test.ts +0 -132
- package/js/__tests__/protocolSchemaV7.test.ts +0 -64
- package/js/__tests__/protocolValidation.test.ts +0 -83
- package/js/__tests__/sortWells.test.ts +0 -40
- package/js/__tests__/splitWellsOnColumn.test.ts +0 -21
- package/js/__tests__/validateErrors.test.js +0 -34
- package/js/constants.ts +0 -338
- package/js/cypressUtils.ts +0 -35
- package/js/errors.ts +0 -33
- package/js/fixtures.ts +0 -161
- package/js/getLabware.ts +0 -154
- package/js/gripper.ts +0 -29
- package/js/helpers/__tests__/getAdapterName.test.ts +0 -31
- package/js/helpers/__tests__/getDeckDefFromLoadedLabware.test.ts +0 -12
- package/js/helpers/__tests__/getVectorDifference.test.ts +0 -25
- package/js/helpers/__tests__/getVectorSum.test.ts +0 -21
- package/js/helpers/__tests__/labwareInference.test.ts +0 -84
- package/js/helpers/__tests__/orderWells.test.ts +0 -87
- package/js/helpers/__tests__/parseProtocolData.test.ts +0 -165
- package/js/helpers/__tests__/volume.test.ts +0 -108
- package/js/helpers/__tests__/wellSets.test.ts +0 -352
- package/js/helpers/get96Channel384WellPlateWells.ts +0 -44
- package/js/helpers/getAddressableAreasInProtocol.ts +0 -59
- package/js/helpers/getLoadedLabwareDefinitionsByUri.ts +0 -30
- package/js/helpers/getModuleVizDims.ts +0 -118
- package/js/helpers/getOccludedSlotCountForModule.ts +0 -13
- package/js/helpers/getVectorDifference.ts +0 -12
- package/js/helpers/getVectorSum.ts +0 -12
- package/js/helpers/getWellNamePerMultiTip.ts +0 -86
- package/js/helpers/getWellTotalVolume.ts +0 -16
- package/js/helpers/index.ts +0 -347
- package/js/helpers/labwareInference.ts +0 -92
- package/js/helpers/orderWells.ts +0 -69
- package/js/helpers/parseProtocolData.ts +0 -141
- package/js/helpers/volume.ts +0 -35
- package/js/helpers/wellIsRect.ts +0 -6
- package/js/helpers/wellSets.ts +0 -155
- package/js/index.ts +0 -14
- package/js/labwareTools/__tests__/__snapshots__/createIrregularLabware.test.ts.snap +0 -3
- package/js/labwareTools/__tests__/__snapshots__/createLabware.test.ts.snap +0 -3
- package/js/labwareTools/__tests__/createDefaultDisplayName.test.ts +0 -111
- package/js/labwareTools/__tests__/createIrregularLabware.test.ts +0 -226
- package/js/labwareTools/__tests__/createLabware.test.ts +0 -147
- package/js/labwareTools/index.ts +0 -452
- package/js/modules.ts +0 -97
- package/js/pipettes.ts +0 -89
- package/js/protocols.ts +0 -290
- package/js/schema.ts +0 -80
- package/js/scripts/generateDeckLayersFromSVG.js +0 -46
- package/js/titleCase.ts +0 -30
- package/js/types.ts +0 -600
- package/python/.coveragerc +0 -4
- package/python/.flake8 +0 -32
- package/python/Config.in +0 -10
- package/python/Makefile +0 -134
- package/python/Pipfile +0 -28
- package/python/Pipfile.lock +0 -645
- package/python/buildroot.mk +0 -30
- package/python/mypy.ini +0 -41
- package/python/opentrons_shared_data/__init__.py +0 -17
- package/python/opentrons_shared_data/_version.py +0 -20
- package/python/opentrons_shared_data/command/__init__.py +0 -52
- package/python/opentrons_shared_data/deck/__init__.py +0 -96
- package/python/opentrons_shared_data/deck/dev_types.py +0 -180
- package/python/opentrons_shared_data/errors/__init__.py +0 -30
- package/python/opentrons_shared_data/errors/categories.py +0 -60
- package/python/opentrons_shared_data/errors/codes.py +0 -108
- package/python/opentrons_shared_data/errors/exceptions.py +0 -915
- package/python/opentrons_shared_data/gripper/__init__.py +0 -63
- package/python/opentrons_shared_data/gripper/constants.py +0 -6
- package/python/opentrons_shared_data/gripper/gripper_definition.py +0 -101
- package/python/opentrons_shared_data/labware/__init__.py +0 -22
- package/python/opentrons_shared_data/labware/constants.py +0 -7
- package/python/opentrons_shared_data/labware/dev_types.py +0 -140
- package/python/opentrons_shared_data/labware/labware_definition.py +0 -328
- package/python/opentrons_shared_data/load.py +0 -57
- package/python/opentrons_shared_data/module/__init__.py +0 -74
- package/python/opentrons_shared_data/module/dev_types.py +0 -141
- package/python/opentrons_shared_data/pipette/__init__.py +0 -107
- package/python/opentrons_shared_data/pipette/dev_types.py +0 -177
- package/python/opentrons_shared_data/pipette/file_operation_helpers.py +0 -37
- package/python/opentrons_shared_data/pipette/load_data.py +0 -261
- package/python/opentrons_shared_data/pipette/model_constants.py +0 -123
- package/python/opentrons_shared_data/pipette/mutable_configurations.py +0 -431
- package/python/opentrons_shared_data/pipette/pipette_definition.py +0 -503
- package/python/opentrons_shared_data/pipette/pipette_load_name_conversions.py +0 -240
- package/python/opentrons_shared_data/pipette/scripts/__init__.py +0 -0
- package/python/opentrons_shared_data/pipette/scripts/build_json_script.py +0 -469
- package/python/opentrons_shared_data/pipette/scripts/update_configuration_files.py +0 -450
- package/python/opentrons_shared_data/pipette/types.py +0 -193
- package/python/opentrons_shared_data/protocol/__init__.py +0 -13
- package/python/opentrons_shared_data/protocol/constants.py +0 -98
- package/python/opentrons_shared_data/protocol/dev_types.py +0 -436
- package/python/opentrons_shared_data/protocol/models/__init__.py +0 -48
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v6.py +0 -145
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v7.py +0 -95
- package/python/opentrons_shared_data/protocol/models/protocol_schema_v8.py +0 -110
- package/python/opentrons_shared_data/protocol/models/shared_models.py +0 -111
- package/python/opentrons_shared_data/py.typed +0 -0
- package/python/opentrons_shared_data/robot/__init__.py +0 -33
- package/python/opentrons_shared_data/robot/dev_types.py +0 -37
- package/python/pytest.ini +0 -2
- package/python/setup.cfg +0 -5
- package/python/setup.py +0 -179
- package/python/tests/__init__.py +0 -1
- package/python/tests/conftest.py +0 -0
- package/python/tests/deck/__init__.py +0 -0
- package/python/tests/deck/test_list_names.py +0 -12
- package/python/tests/deck/test_position.py +0 -113
- package/python/tests/deck/test_typechecks.py +0 -28
- package/python/tests/errors/__init__.py +0 -1
- package/python/tests/errors/test_error_completeness.py +0 -19
- package/python/tests/errors/test_exceptions.py +0 -74
- package/python/tests/gripper/__init__.py +0 -0
- package/python/tests/gripper/test_definition.py +0 -30
- package/python/tests/gripper/test_load.py +0 -16
- package/python/tests/labware/__init__.py +0 -13
- package/python/tests/labware/test_typechecks.py +0 -21
- package/python/tests/module/__init__.py +0 -20
- package/python/tests/module/test_load.py +0 -49
- package/python/tests/module/test_typechecks.py +0 -34
- package/python/tests/pipette/__init__.py +0 -0
- package/python/tests/pipette/test_load_data.py +0 -103
- package/python/tests/pipette/test_mutable_configurations.py +0 -266
- package/python/tests/pipette/test_pipette_definition.py +0 -183
- package/python/tests/pipette/test_pipette_load_name_conversions.py +0 -222
- package/python/tests/pipette/test_typechecks.py +0 -50
- package/python/tests/pipette/test_validate_schema.py +0 -37
- package/python/tests/protocol/__init__.py +0 -15
- package/python/tests/protocol/test_protocol_schema_v6.py +0 -107
- package/python/tests/protocol/test_protocol_schema_v7.py +0 -34
- package/python/tests/protocol/test_protocol_schema_v8.py +0 -20
- package/python/tests/protocol/test_typechecks.py +0 -36
- package/python/tests/robot/__init__.py +0 -0
- package/python/tests/robot/test_typechecks.py +0 -20
package/python/buildroot.mk
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
################################################################################
|
|
2
|
-
#
|
|
3
|
-
# python-opentrons-shared-data
|
|
4
|
-
#
|
|
5
|
-
################################################################################
|
|
6
|
-
|
|
7
|
-
define OTSHAREDDATA_CALL_PBU
|
|
8
|
-
$(shell python $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/scripts/python_build_utils.py shared-data $(or $(OPENTRONS_PROJECT),robot-stack) $(1))
|
|
9
|
-
endef
|
|
10
|
-
|
|
11
|
-
PYTHON_OPENTRONS_SHARED_DATA_VERSION = $(call OTSHAREDDATA_CALL_PBU,get_version)
|
|
12
|
-
PYTHON_OPENTRONS_SHARED_DATA_LICENSE = Apache-2
|
|
13
|
-
PYTHON_OPENTRONS_SHARED_DATA_LICENSE_FILES = $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)/LICENSE
|
|
14
|
-
PYTHON_OPENTRONS_SHARED_DATA_SETUP_TYPE = setuptools
|
|
15
|
-
PYTHON_OPENTRONS_SHARED_DATA_SITE_METHOD = local
|
|
16
|
-
PYTHON_OPENTRONS_SHARED_DATA_SITE = $(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)
|
|
17
|
-
PYTHON_OPENTRONS_SHARED_DATA_SUBDIR = shared-data/python
|
|
18
|
-
|
|
19
|
-
define PYTHON_OPENTRONS_SHARED_DATA_INSTALL_VERSION
|
|
20
|
-
echo '$(call OTSHAREDDATA_CALL_PBU,dump_br_version)' > $(BINARIES_DIR)/opentrons-shared-data-version.json
|
|
21
|
-
endef
|
|
22
|
-
|
|
23
|
-
ot_sd_name := python-opentrons-shared-data
|
|
24
|
-
|
|
25
|
-
export OPENTRONS_GIT_DIR=$(BR2_EXTERNAL_OPENTRONS_MONOREPO_PATH)
|
|
26
|
-
|
|
27
|
-
# Calling inner-python-package directly instead of using python-package macro
|
|
28
|
-
# because our directory layout doesn’t conform to buildroot’s expectation of
|
|
29
|
-
# having the directory name be the package name
|
|
30
|
-
$(eval $(call inner-python-package,$(ot_sd_name),$(call UPPERCASE,$(ot_sd_name)),$(call UPPERCASE,$(ot_sd_name)),target))
|
package/python/mypy.ini
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
[mypy]
|
|
2
|
-
plugins = pydantic.mypy
|
|
3
|
-
show_error_codes = True
|
|
4
|
-
warn_unused_configs = True
|
|
5
|
-
strict = True
|
|
6
|
-
|
|
7
|
-
[pydantic-mypy]
|
|
8
|
-
init_forbid_extra = True
|
|
9
|
-
init_typed = True
|
|
10
|
-
warn_required_dynamic_aliases = True
|
|
11
|
-
warn_untyped_fields = True
|
|
12
|
-
|
|
13
|
-
# TODO(mc, 2022-01-20): fix and remove all of the overrides below
|
|
14
|
-
|
|
15
|
-
[mypy-opentrons_shared_data.labware.*]
|
|
16
|
-
warn_return_any = False
|
|
17
|
-
|
|
18
|
-
[mypy-opentrons_shared_data.pipette.*]
|
|
19
|
-
no_implicit_optional = False
|
|
20
|
-
warn_return_any = False
|
|
21
|
-
|
|
22
|
-
[mypy-opentrons_shared_data.protocol.*]
|
|
23
|
-
warn_return_any = False
|
|
24
|
-
|
|
25
|
-
[mypy-tests.deck.*]
|
|
26
|
-
disallow_untyped_defs = False
|
|
27
|
-
|
|
28
|
-
[mypy-tests.labware.*]
|
|
29
|
-
disallow_untyped_defs = False
|
|
30
|
-
disallow_untyped_calls = False
|
|
31
|
-
|
|
32
|
-
[mypy-tests.module.*]
|
|
33
|
-
disallow_untyped_defs = False
|
|
34
|
-
disallow_untyped_calls = False
|
|
35
|
-
|
|
36
|
-
[mypy-tests.pipette.*]
|
|
37
|
-
disallow_untyped_defs = False
|
|
38
|
-
disallow_untyped_calls = False
|
|
39
|
-
|
|
40
|
-
[mypy-tests.protocol.*]
|
|
41
|
-
disallow_untyped_defs = False
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"""A Python package wrapping json config definitions for the Opentrons stack.
|
|
2
|
-
|
|
3
|
-
This package should never be installed on its own, only as a dependency of
|
|
4
|
-
the main opentrons package
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import os
|
|
8
|
-
|
|
9
|
-
from .load import get_shared_data_root, load_shared_data
|
|
10
|
-
|
|
11
|
-
from ._version import version
|
|
12
|
-
|
|
13
|
-
HERE = os.path.abspath(os.path.dirname(__file__))
|
|
14
|
-
|
|
15
|
-
__version__ = version
|
|
16
|
-
|
|
17
|
-
__all__ = ["__version__", "get_shared_data_root", "load_shared_data"]
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import sys
|
|
2
|
-
import logging
|
|
3
|
-
|
|
4
|
-
_pyversion = sys.version_info[0:2]
|
|
5
|
-
|
|
6
|
-
if _pyversion >= (3, 8):
|
|
7
|
-
from importlib import metadata
|
|
8
|
-
else:
|
|
9
|
-
import importlib_metadata as metadata # type: ignore[no-redef]
|
|
10
|
-
|
|
11
|
-
try:
|
|
12
|
-
version: str = metadata.version("opentrons_shared_data") # type: ignore[attr-defined]
|
|
13
|
-
except Exception as e:
|
|
14
|
-
logging.warning(
|
|
15
|
-
"Could not determine version for opentrons, may be dev install, using 0.0.0-dev"
|
|
16
|
-
)
|
|
17
|
-
logging.debug(e)
|
|
18
|
-
version = "0.0.0-dev"
|
|
19
|
-
|
|
20
|
-
__all__ = ["version"]
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"""opentrons_shared_data.command: functions command schemas."""
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
import json
|
|
4
|
-
import os
|
|
5
|
-
import re
|
|
6
|
-
|
|
7
|
-
from opentrons_shared_data.errors.exceptions import InvalidProtocolData, PythonException
|
|
8
|
-
|
|
9
|
-
from ..load import load_shared_data, get_shared_data_root
|
|
10
|
-
|
|
11
|
-
SCHEMA_REF_VERSION_RE = re.compile(r"opentronsCommandSchemaV(\d+)")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def get_newest_schema_version() -> str:
|
|
15
|
-
"""Get the version string of the most modern command schema currently in shared-data."""
|
|
16
|
-
command_schemas_dir = get_shared_data_root() / "command" / "schemas"
|
|
17
|
-
command_schemas = os.listdir(command_schemas_dir)
|
|
18
|
-
all_schema_versions = []
|
|
19
|
-
for schema_file_name in command_schemas:
|
|
20
|
-
schema_version_match = re.match(r"(\d+).json", schema_file_name)
|
|
21
|
-
if schema_version_match is not None:
|
|
22
|
-
all_schema_versions.append(schema_version_match.group(1))
|
|
23
|
-
|
|
24
|
-
return str(max(all_schema_versions))
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def load_schema_string(version: str) -> str:
|
|
28
|
-
"""Get the string containing the command JSON schema for the given version string."""
|
|
29
|
-
path = Path("command") / "schemas" / f"{version}.json"
|
|
30
|
-
try:
|
|
31
|
-
return json.dumps(json.loads(load_shared_data(path)), indent=2)
|
|
32
|
-
except OSError as ose:
|
|
33
|
-
raise InvalidProtocolData(
|
|
34
|
-
message=f"Command schema version {version} is not available",
|
|
35
|
-
detail={
|
|
36
|
-
"type": "bad-schema-version",
|
|
37
|
-
"schema-kind": "command",
|
|
38
|
-
"version": version,
|
|
39
|
-
},
|
|
40
|
-
wrapping=[PythonException(ose)],
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def schema_version_from_ref(ref: str) -> str:
|
|
45
|
-
"""Parse the command schema version from a command schema ref."""
|
|
46
|
-
version = SCHEMA_REF_VERSION_RE.match(ref)
|
|
47
|
-
if not version:
|
|
48
|
-
raise InvalidProtocolData(
|
|
49
|
-
message=f"Could not parse version from command schema ${ref}",
|
|
50
|
-
detail={"ref": ref, "type": "bad-schema-ref", "schema-kind": "command"},
|
|
51
|
-
)
|
|
52
|
-
return version.group(1)
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
opentrons_shared_data.deck: types and bindings for deck definitions
|
|
3
|
-
"""
|
|
4
|
-
from typing import Dict, List, NamedTuple, cast, overload, TYPE_CHECKING
|
|
5
|
-
from typing_extensions import Final
|
|
6
|
-
import json
|
|
7
|
-
|
|
8
|
-
from .. import get_shared_data_root, load_shared_data
|
|
9
|
-
|
|
10
|
-
if TYPE_CHECKING:
|
|
11
|
-
from .dev_types import (
|
|
12
|
-
DeckSchema,
|
|
13
|
-
DeckDefinition,
|
|
14
|
-
DeckDefinitionV3,
|
|
15
|
-
DeckSchemaVersion3,
|
|
16
|
-
DeckDefinitionV4,
|
|
17
|
-
DeckSchemaVersion4,
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
DEFAULT_DECK_DEFINITION_VERSION: Final = 4
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class Offset(NamedTuple):
|
|
24
|
-
x: float = 0.0
|
|
25
|
-
y: float = 0.0
|
|
26
|
-
z: float = 0.0
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
Z_PREP_OFFSET = Offset(x=13, y=13)
|
|
30
|
-
CALIBRATION_PROBE_RADIUS: Final[float] = 2
|
|
31
|
-
CALIBRATION_SQUARE_DEPTH: Final[float] = -0.25
|
|
32
|
-
CALIBRATION_SQUARE_SIZE: Final[float] = 20
|
|
33
|
-
CALIBRATION_SQUARE_EDGES: Dict[str, Offset] = {
|
|
34
|
-
"left": Offset(x=-CALIBRATION_SQUARE_SIZE * 0.5),
|
|
35
|
-
"right": Offset(x=CALIBRATION_SQUARE_SIZE * 0.5),
|
|
36
|
-
"top": Offset(y=CALIBRATION_SQUARE_SIZE * 0.5),
|
|
37
|
-
"bottom": Offset(y=-CALIBRATION_SQUARE_SIZE * 0.5),
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@overload
|
|
42
|
-
def load(name: str, version: "DeckSchemaVersion4") -> "DeckDefinitionV4":
|
|
43
|
-
...
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@overload
|
|
47
|
-
def load(name: str, version: "DeckSchemaVersion3") -> "DeckDefinitionV3":
|
|
48
|
-
...
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def load(name: str, version: int = DEFAULT_DECK_DEFINITION_VERSION) -> "DeckDefinition":
|
|
52
|
-
return json.loads( # type: ignore[no-any-return]
|
|
53
|
-
load_shared_data(f"deck/definitions/{version}/{name}.json")
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def load_schema(version: int) -> "DeckSchema":
|
|
58
|
-
return cast(
|
|
59
|
-
"DeckSchema", json.loads(load_shared_data(f"deck/schemas/{version}.json"))
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
def list_names(version: int) -> List[str]:
|
|
64
|
-
"""Return all loadable deck definition names, for the given schema version."""
|
|
65
|
-
definitions_directory = (
|
|
66
|
-
get_shared_data_root() / "deck" / "definitions" / f"{version}"
|
|
67
|
-
)
|
|
68
|
-
return [file.stem for file in definitions_directory.iterdir()]
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def get_calibration_square_position_in_slot(slot: int) -> Offset:
|
|
72
|
-
"""Get the position of an OT-3 deck slot's calibration square.
|
|
73
|
-
|
|
74
|
-
Params:
|
|
75
|
-
slot: The slot whose calibration square to retrieve, specified as an OT-2-style slot number.
|
|
76
|
-
For example, specify 5 to get slot C2.
|
|
77
|
-
"""
|
|
78
|
-
deck = load("ot3_standard", version=3)
|
|
79
|
-
slots = deck["locations"]["orderedSlots"]
|
|
80
|
-
|
|
81
|
-
# Assume that the OT-3 deck definition has the same number of slots, and in the same order,
|
|
82
|
-
# as the OT-2.
|
|
83
|
-
# TODO(mm, 2023-05-22): This assumption will break down when the OT-3 has staging area slots.
|
|
84
|
-
# https://opentrons.atlassian.net/browse/RLAB-345
|
|
85
|
-
s = slots[slot - 1]
|
|
86
|
-
|
|
87
|
-
bottom_left = s["position"]
|
|
88
|
-
slot_size_x = s["boundingBox"]["xDimension"]
|
|
89
|
-
slot_size_y = s["boundingBox"]["yDimension"]
|
|
90
|
-
relative_center = [float(slot_size_x) * 0.5, float(slot_size_y) * 0.5, 0]
|
|
91
|
-
square_z = [0, 0, CALIBRATION_SQUARE_DEPTH]
|
|
92
|
-
# add up the elements of each list and return an Offset of the result
|
|
93
|
-
nominal_position = [
|
|
94
|
-
float(sum(x)) for x in zip(bottom_left, relative_center, square_z)
|
|
95
|
-
]
|
|
96
|
-
return Offset(*nominal_position)
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
opentrons_shared_data.deck.dev_types: types for deck defs
|
|
3
|
-
|
|
4
|
-
This should only be imported if typing.TYPE_CHECKING is True
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from typing import Any, Dict, List, NewType, Union
|
|
8
|
-
from typing_extensions import Literal, TypedDict
|
|
9
|
-
|
|
10
|
-
from ..module.dev_types import ModuleType
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
DeckSchemaVersion4 = Literal[4]
|
|
14
|
-
DeckSchemaVersion3 = Literal[3]
|
|
15
|
-
DeckSchemaVersion2 = Literal[2]
|
|
16
|
-
DeckSchemaVersion1 = Literal[1]
|
|
17
|
-
|
|
18
|
-
DeckSchema = NewType("DeckSchema", Dict[str, Any])
|
|
19
|
-
|
|
20
|
-
DeckSchemaId = Literal["opentronsDeckSchemaV3", "opentronsDeckSchemaV4"]
|
|
21
|
-
RobotModel = Union[Literal["OT-2 Standard"], Literal["OT-3 Standard"]]
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
class Metadata(TypedDict, total=False):
|
|
25
|
-
displayName: str
|
|
26
|
-
tags: List[str]
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class Robot(TypedDict):
|
|
30
|
-
model: RobotModel
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
class BoundingBox(TypedDict):
|
|
34
|
-
xDimension: float
|
|
35
|
-
yDimension: float
|
|
36
|
-
zDimension: float
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
class SlotDefV3(TypedDict, total=False):
|
|
40
|
-
id: str
|
|
41
|
-
position: List[float]
|
|
42
|
-
boundingBox: BoundingBox
|
|
43
|
-
displayName: str
|
|
44
|
-
compatibleModuleTypes: List[ModuleType]
|
|
45
|
-
matingSurfaceUnitVector: List[Union[Literal[1], Literal[-1]]]
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class CalibrationPoint(TypedDict):
|
|
49
|
-
id: str
|
|
50
|
-
position: List[float]
|
|
51
|
-
displayName: str
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
class INode(TypedDict):
|
|
55
|
-
name: str
|
|
56
|
-
type: str
|
|
57
|
-
value: str
|
|
58
|
-
attributes: Dict[str, str]
|
|
59
|
-
# this should be a recursive call to INode but we need to upgrade mypy
|
|
60
|
-
children: List[Dict[str, Any]]
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
class FixedLabwareBySlot(TypedDict):
|
|
64
|
-
id: str
|
|
65
|
-
displayName: str
|
|
66
|
-
labware: str
|
|
67
|
-
slot: str
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
class FixedLabwareByPosition(TypedDict):
|
|
71
|
-
id: str
|
|
72
|
-
displayName: str
|
|
73
|
-
labware: str
|
|
74
|
-
position: List[float]
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
class FixedVolumeBySlot(TypedDict):
|
|
78
|
-
id: str
|
|
79
|
-
displayName: str
|
|
80
|
-
boundingBox: BoundingBox
|
|
81
|
-
slot: str
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class FixedVolumeByPosition(TypedDict):
|
|
85
|
-
id: str
|
|
86
|
-
displayName: str
|
|
87
|
-
boundingBox: BoundingBox
|
|
88
|
-
position: List[float]
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
class _RequiredAddressableArea(TypedDict):
|
|
92
|
-
id: str
|
|
93
|
-
areaType: str
|
|
94
|
-
offsetFromCutoutFixture: List[float]
|
|
95
|
-
boundingBox: BoundingBox
|
|
96
|
-
displayName: str
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
class AddressableArea(_RequiredAddressableArea, total=False):
|
|
100
|
-
compatibleModuleTypes: List[ModuleType]
|
|
101
|
-
matingSurfaceUnitVector: List[Union[Literal[1], Literal[-1]]]
|
|
102
|
-
ableToDropTips: bool
|
|
103
|
-
ableToDropLabware: bool
|
|
104
|
-
dropTipsOffset: List[float]
|
|
105
|
-
dropLabwareOffset: List[float]
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
class Cutout(TypedDict):
|
|
109
|
-
id: str
|
|
110
|
-
position: List[float]
|
|
111
|
-
displayName: str
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class CutoutFixture(TypedDict):
|
|
115
|
-
id: str
|
|
116
|
-
mayMountTo: List[str]
|
|
117
|
-
displayName: str
|
|
118
|
-
providesAddressableAreas: Dict[str, List[str]]
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
Fixture = Union[
|
|
122
|
-
FixedLabwareBySlot, FixedLabwareByPosition, FixedVolumeBySlot, FixedVolumeByPosition
|
|
123
|
-
]
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
class LocationsV3(TypedDict):
|
|
127
|
-
orderedSlots: List[SlotDefV3]
|
|
128
|
-
calibrationPoints: List[CalibrationPoint]
|
|
129
|
-
fixtures: List[Fixture]
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
class LocationsV4(TypedDict):
|
|
133
|
-
addressableAreas: List[AddressableArea]
|
|
134
|
-
calibrationPoints: List[CalibrationPoint]
|
|
135
|
-
cutouts: List[Cutout]
|
|
136
|
-
legacyFixtures: List[Fixture]
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
class NamedOffset(TypedDict):
|
|
140
|
-
x: float
|
|
141
|
-
y: float
|
|
142
|
-
z: float
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
class GripperOffsets(TypedDict):
|
|
146
|
-
pickUpOffset: NamedOffset
|
|
147
|
-
dropOffset: NamedOffset
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
class _RequiredDeckDefinitionV3(TypedDict):
|
|
151
|
-
otId: str
|
|
152
|
-
schemaVersion: Literal[3]
|
|
153
|
-
cornerOffsetFromOrigin: List[float]
|
|
154
|
-
dimensions: List[float]
|
|
155
|
-
metadata: Metadata
|
|
156
|
-
robot: Robot
|
|
157
|
-
locations: LocationsV3
|
|
158
|
-
layers: List[INode]
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
class DeckDefinitionV3(_RequiredDeckDefinitionV3, total=False):
|
|
162
|
-
gripperOffsets: Dict[str, GripperOffsets]
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
class _RequiredDeckDefinitionV4(TypedDict):
|
|
166
|
-
otId: str
|
|
167
|
-
schemaVersion: Literal[4]
|
|
168
|
-
cornerOffsetFromOrigin: List[float]
|
|
169
|
-
dimensions: List[float]
|
|
170
|
-
metadata: Metadata
|
|
171
|
-
robot: Robot
|
|
172
|
-
locations: LocationsV4
|
|
173
|
-
cutoutFixtures: List[CutoutFixture]
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
class DeckDefinitionV4(_RequiredDeckDefinitionV4, total=False):
|
|
177
|
-
gripperOffsets: Dict[str, GripperOffsets]
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
DeckDefinition = Union[DeckDefinitionV3, DeckDefinitionV4]
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"""A python package implementing the errors in errors.json.
|
|
2
|
-
|
|
3
|
-
A note on this package: it is not codegenned but written by hand, and has to be upkept
|
|
4
|
-
by hand. It comes with tests to make sure this happens.
|
|
5
|
-
|
|
6
|
-
This seems a little ridiculous and kind of is, but what it lets us do is really simplify
|
|
7
|
-
our static analysis and dev setup.
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from .categories import ErrorCategories, ErrorCategory
|
|
11
|
-
from .codes import ErrorCodes, ErrorCode
|
|
12
|
-
from .exceptions import (
|
|
13
|
-
EnumeratedError,
|
|
14
|
-
PythonException,
|
|
15
|
-
GeneralError,
|
|
16
|
-
RoboticsControlError,
|
|
17
|
-
RoboticsInteractionError,
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
__all__ = [
|
|
21
|
-
"ErrorCategory",
|
|
22
|
-
"ErrorCategories",
|
|
23
|
-
"ErrorCode",
|
|
24
|
-
"ErrorCodes",
|
|
25
|
-
"EnumeratedError",
|
|
26
|
-
"PythonException",
|
|
27
|
-
"GeneralError",
|
|
28
|
-
"RoboticsControlError",
|
|
29
|
-
"RoboticsInteractionError",
|
|
30
|
-
]
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"""Error categories."""
|
|
2
|
-
|
|
3
|
-
from enum import Enum
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
import json
|
|
6
|
-
from functools import lru_cache
|
|
7
|
-
from typing import Dict
|
|
8
|
-
|
|
9
|
-
from ..load import load_shared_data
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
CATEGORIES: Dict[str, Dict[str, str]] = json.loads(
|
|
13
|
-
load_shared_data("errors/definitions/1/errors.json")
|
|
14
|
-
)["categories"]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@dataclass(frozen=True)
|
|
18
|
-
class ErrorCategory:
|
|
19
|
-
"""Individual error category data."""
|
|
20
|
-
|
|
21
|
-
name: str
|
|
22
|
-
detail: str
|
|
23
|
-
code_prefix: str
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def _category_from_dict_entry(entry_name: str) -> ErrorCategory:
|
|
27
|
-
return ErrorCategory(
|
|
28
|
-
name=entry_name,
|
|
29
|
-
detail=CATEGORIES[entry_name]["detail"],
|
|
30
|
-
code_prefix=CATEGORIES[entry_name]["codePrefix"],
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class ErrorCategories(Enum):
|
|
35
|
-
"""All enuemrated error categories."""
|
|
36
|
-
|
|
37
|
-
HARDWARE_COMMUNICATION_ERROR = _category_from_dict_entry(
|
|
38
|
-
"hardwareCommunicationError"
|
|
39
|
-
)
|
|
40
|
-
ROBOTICS_CONTROL_ERROR = _category_from_dict_entry("roboticsControlError")
|
|
41
|
-
ROBOTICS_INTERACTION_ERROR = _category_from_dict_entry("roboticsInteractionError")
|
|
42
|
-
GENERAL_ERROR = _category_from_dict_entry("generalError")
|
|
43
|
-
|
|
44
|
-
@classmethod
|
|
45
|
-
@lru_cache(4)
|
|
46
|
-
def by_category_name(cls, category_name: str) -> "ErrorCategories":
|
|
47
|
-
"""Get a subsystem by its category name."""
|
|
48
|
-
for entry in cls:
|
|
49
|
-
if entry.value.name == category_name:
|
|
50
|
-
return entry
|
|
51
|
-
raise KeyError(category_name)
|
|
52
|
-
|
|
53
|
-
@classmethod
|
|
54
|
-
@lru_cache(4)
|
|
55
|
-
def by_code_prefix(cls, prefix: str) -> "ErrorCategories":
|
|
56
|
-
"""Get an error category by its code prefix."""
|
|
57
|
-
for entry in cls:
|
|
58
|
-
if entry.value.code_prefix == prefix:
|
|
59
|
-
return entry
|
|
60
|
-
raise KeyError(prefix)
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
"""Error codes."""
|
|
2
|
-
|
|
3
|
-
from enum import Enum
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
import json
|
|
6
|
-
from typing import Tuple, Dict
|
|
7
|
-
from functools import lru_cache
|
|
8
|
-
|
|
9
|
-
from ..load import load_shared_data
|
|
10
|
-
from .categories import ErrorCategories
|
|
11
|
-
|
|
12
|
-
CODES: Dict[str, Dict[str, str]] = json.loads(
|
|
13
|
-
load_shared_data("errors/definitions/1/errors.json")
|
|
14
|
-
)["codes"]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@dataclass(frozen=True)
|
|
18
|
-
class ErrorCode:
|
|
19
|
-
"""Individual error code data."""
|
|
20
|
-
|
|
21
|
-
code: str
|
|
22
|
-
detail: str
|
|
23
|
-
category: ErrorCategories
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def _code_from_dict_entry(entry_code: str) -> ErrorCode:
|
|
27
|
-
return ErrorCode(
|
|
28
|
-
code=entry_code,
|
|
29
|
-
detail=CODES[entry_code]["detail"],
|
|
30
|
-
category=ErrorCategories.by_category_name(CODES[entry_code]["category"]),
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class ErrorCodes(Enum):
|
|
35
|
-
"""All enumerated error codes."""
|
|
36
|
-
|
|
37
|
-
COMMUNICATION_ERROR = _code_from_dict_entry("1000")
|
|
38
|
-
CANBUS_COMMUNICATION_ERROR = _code_from_dict_entry("1001")
|
|
39
|
-
INTERNAL_USB_COMMUNICATION_ERROR = _code_from_dict_entry("1002")
|
|
40
|
-
MODULE_COMMUNICATION_ERROR = _code_from_dict_entry("1003")
|
|
41
|
-
COMMAND_TIMED_OUT = _code_from_dict_entry("1004")
|
|
42
|
-
FIRMWARE_UPDATE_FAILED = _code_from_dict_entry("1005")
|
|
43
|
-
INTERNAL_MESSAGE_FORMAT_ERROR = _code_from_dict_entry("1006")
|
|
44
|
-
CANBUS_CONFIGURATION_ERROR = _code_from_dict_entry("1007")
|
|
45
|
-
CANBUS_BUS_ERROR = _code_from_dict_entry("1008")
|
|
46
|
-
ROBOTICS_CONTROL_ERROR = _code_from_dict_entry("2000")
|
|
47
|
-
MOTION_FAILED = _code_from_dict_entry("2001")
|
|
48
|
-
HOMING_FAILED = _code_from_dict_entry("2002")
|
|
49
|
-
STALL_OR_COLLISION_DETECTED = _code_from_dict_entry("2003")
|
|
50
|
-
MOTION_PLANNING_FAILURE = _code_from_dict_entry("2004")
|
|
51
|
-
POSITION_ESTIMATION_INVALID = _code_from_dict_entry("2005")
|
|
52
|
-
MOVE_CONDITION_NOT_MET = _code_from_dict_entry("2006")
|
|
53
|
-
CALIBRATION_STRUCTURE_NOT_FOUND = _code_from_dict_entry("2007")
|
|
54
|
-
EDGE_NOT_FOUND = _code_from_dict_entry("2008")
|
|
55
|
-
EARLY_CAPACITIVE_SENSE_TRIGGER = _code_from_dict_entry("2009")
|
|
56
|
-
INACCURATE_NON_CONTACT_SWEEP = _code_from_dict_entry("2010")
|
|
57
|
-
MISALIGNED_GANTRY = _code_from_dict_entry("2011")
|
|
58
|
-
UNMATCHED_TIP_PRESENCE_STATES = _code_from_dict_entry("2012")
|
|
59
|
-
POSITION_UNKNOWN = _code_from_dict_entry("2013")
|
|
60
|
-
EXECUTION_CANCELLED = _code_from_dict_entry("2014")
|
|
61
|
-
ROBOTICS_INTERACTION_ERROR = _code_from_dict_entry("3000")
|
|
62
|
-
LABWARE_DROPPED = _code_from_dict_entry("3001")
|
|
63
|
-
LABWARE_NOT_PICKED_UP = _code_from_dict_entry("3002")
|
|
64
|
-
TIP_PICKUP_FAILED = _code_from_dict_entry("3003")
|
|
65
|
-
TIP_DROP_FAILED = _code_from_dict_entry("3004")
|
|
66
|
-
UNEXPECTED_TIP_REMOVAL = _code_from_dict_entry("3005")
|
|
67
|
-
PIPETTE_OVERPRESSURE = _code_from_dict_entry("3006")
|
|
68
|
-
E_STOP_ACTIVATED = _code_from_dict_entry("3008")
|
|
69
|
-
E_STOP_NOT_PRESENT = _code_from_dict_entry("3009")
|
|
70
|
-
PIPETTE_NOT_PRESENT = _code_from_dict_entry("3010")
|
|
71
|
-
GRIPPER_NOT_PRESENT = _code_from_dict_entry("3011")
|
|
72
|
-
UNEXPECTED_TIP_ATTACH = _code_from_dict_entry("3012")
|
|
73
|
-
FIRMWARE_UPDATE_REQUIRED = _code_from_dict_entry("3013")
|
|
74
|
-
INVALID_ACTUATOR = _code_from_dict_entry("3014")
|
|
75
|
-
MODULE_NOT_PRESENT = _code_from_dict_entry("3015")
|
|
76
|
-
INVALID_INSTRUMENT_DATA = _code_from_dict_entry("3016")
|
|
77
|
-
INVALID_LIQUID_CLASS_NAME = _code_from_dict_entry("3017")
|
|
78
|
-
TIP_DETECTOR_NOT_FOUND = _code_from_dict_entry("3018")
|
|
79
|
-
GENERAL_ERROR = _code_from_dict_entry("4000")
|
|
80
|
-
ROBOT_IN_USE = _code_from_dict_entry("4001")
|
|
81
|
-
API_REMOVED = _code_from_dict_entry("4002")
|
|
82
|
-
NOT_SUPPORTED_ON_ROBOT_TYPE = _code_from_dict_entry("4003")
|
|
83
|
-
COMMAND_PRECONDITION_VIOLATED = _code_from_dict_entry("4004")
|
|
84
|
-
COMMAND_PARAMETER_LIMIT_VIOLATED = _code_from_dict_entry("4005")
|
|
85
|
-
INVALID_PROTOCOL_DATA = _code_from_dict_entry("4006")
|
|
86
|
-
API_MISCONFIGURATION = _code_from_dict_entry("4007")
|
|
87
|
-
|
|
88
|
-
@classmethod
|
|
89
|
-
@lru_cache(25)
|
|
90
|
-
def by_error_code(cls, error_code: str) -> "ErrorCodes":
|
|
91
|
-
"""Get an error by its code.
|
|
92
|
-
|
|
93
|
-
Note: this is a linear search because it makes life easier and also this is rare in python.
|
|
94
|
-
"""
|
|
95
|
-
for error in cls:
|
|
96
|
-
if error.value.code == error_code:
|
|
97
|
-
return error
|
|
98
|
-
raise KeyError(error_code)
|
|
99
|
-
|
|
100
|
-
@classmethod
|
|
101
|
-
@lru_cache(len(ErrorCategories))
|
|
102
|
-
def of_category(cls, category: ErrorCategories) -> Tuple["ErrorCodes", ...]:
|
|
103
|
-
"""Get all error codes by their category."""
|
|
104
|
-
return tuple(
|
|
105
|
-
error
|
|
106
|
-
for error in cls
|
|
107
|
-
if error.value.code.startswith(category.value.code_prefix)
|
|
108
|
-
)
|