opentrons 8.6.0__py3-none-any.whl

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.

Potentially problematic release.


This version of opentrons might be problematic. Click here for more details.

Files changed (601) hide show
  1. opentrons/__init__.py +150 -0
  2. opentrons/_version.py +34 -0
  3. opentrons/calibration_storage/__init__.py +54 -0
  4. opentrons/calibration_storage/deck_configuration.py +62 -0
  5. opentrons/calibration_storage/encoder_decoder.py +31 -0
  6. opentrons/calibration_storage/file_operators.py +142 -0
  7. opentrons/calibration_storage/helpers.py +103 -0
  8. opentrons/calibration_storage/ot2/__init__.py +34 -0
  9. opentrons/calibration_storage/ot2/deck_attitude.py +85 -0
  10. opentrons/calibration_storage/ot2/mark_bad_calibration.py +27 -0
  11. opentrons/calibration_storage/ot2/models/__init__.py +0 -0
  12. opentrons/calibration_storage/ot2/models/v1.py +149 -0
  13. opentrons/calibration_storage/ot2/pipette_offset.py +129 -0
  14. opentrons/calibration_storage/ot2/tip_length.py +281 -0
  15. opentrons/calibration_storage/ot3/__init__.py +31 -0
  16. opentrons/calibration_storage/ot3/deck_attitude.py +83 -0
  17. opentrons/calibration_storage/ot3/gripper_offset.py +156 -0
  18. opentrons/calibration_storage/ot3/models/__init__.py +0 -0
  19. opentrons/calibration_storage/ot3/models/v1.py +122 -0
  20. opentrons/calibration_storage/ot3/module_offset.py +138 -0
  21. opentrons/calibration_storage/ot3/pipette_offset.py +95 -0
  22. opentrons/calibration_storage/types.py +45 -0
  23. opentrons/cli/__init__.py +21 -0
  24. opentrons/cli/__main__.py +5 -0
  25. opentrons/cli/analyze.py +557 -0
  26. opentrons/config/__init__.py +631 -0
  27. opentrons/config/advanced_settings.py +871 -0
  28. opentrons/config/defaults_ot2.py +214 -0
  29. opentrons/config/defaults_ot3.py +499 -0
  30. opentrons/config/feature_flags.py +86 -0
  31. opentrons/config/gripper_config.py +55 -0
  32. opentrons/config/reset.py +203 -0
  33. opentrons/config/robot_configs.py +187 -0
  34. opentrons/config/types.py +183 -0
  35. opentrons/drivers/__init__.py +0 -0
  36. opentrons/drivers/absorbance_reader/__init__.py +11 -0
  37. opentrons/drivers/absorbance_reader/abstract.py +72 -0
  38. opentrons/drivers/absorbance_reader/async_byonoy.py +352 -0
  39. opentrons/drivers/absorbance_reader/driver.py +81 -0
  40. opentrons/drivers/absorbance_reader/hid_protocol.py +161 -0
  41. opentrons/drivers/absorbance_reader/simulator.py +84 -0
  42. opentrons/drivers/asyncio/__init__.py +0 -0
  43. opentrons/drivers/asyncio/communication/__init__.py +22 -0
  44. opentrons/drivers/asyncio/communication/async_serial.py +187 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +557 -0
  47. opentrons/drivers/command_builder.py +102 -0
  48. opentrons/drivers/flex_stacker/__init__.py +13 -0
  49. opentrons/drivers/flex_stacker/abstract.py +214 -0
  50. opentrons/drivers/flex_stacker/driver.py +768 -0
  51. opentrons/drivers/flex_stacker/errors.py +68 -0
  52. opentrons/drivers/flex_stacker/simulator.py +309 -0
  53. opentrons/drivers/flex_stacker/types.py +367 -0
  54. opentrons/drivers/flex_stacker/utils.py +19 -0
  55. opentrons/drivers/heater_shaker/__init__.py +5 -0
  56. opentrons/drivers/heater_shaker/abstract.py +76 -0
  57. opentrons/drivers/heater_shaker/driver.py +204 -0
  58. opentrons/drivers/heater_shaker/simulator.py +94 -0
  59. opentrons/drivers/mag_deck/__init__.py +6 -0
  60. opentrons/drivers/mag_deck/abstract.py +44 -0
  61. opentrons/drivers/mag_deck/driver.py +208 -0
  62. opentrons/drivers/mag_deck/simulator.py +63 -0
  63. opentrons/drivers/rpi_drivers/__init__.py +33 -0
  64. opentrons/drivers/rpi_drivers/dev_types.py +94 -0
  65. opentrons/drivers/rpi_drivers/gpio.py +282 -0
  66. opentrons/drivers/rpi_drivers/gpio_simulator.py +127 -0
  67. opentrons/drivers/rpi_drivers/interfaces.py +15 -0
  68. opentrons/drivers/rpi_drivers/types.py +364 -0
  69. opentrons/drivers/rpi_drivers/usb.py +102 -0
  70. opentrons/drivers/rpi_drivers/usb_simulator.py +22 -0
  71. opentrons/drivers/serial_communication.py +151 -0
  72. opentrons/drivers/smoothie_drivers/__init__.py +4 -0
  73. opentrons/drivers/smoothie_drivers/connection.py +51 -0
  74. opentrons/drivers/smoothie_drivers/constants.py +121 -0
  75. opentrons/drivers/smoothie_drivers/driver_3_0.py +1933 -0
  76. opentrons/drivers/smoothie_drivers/errors.py +49 -0
  77. opentrons/drivers/smoothie_drivers/parse_utils.py +143 -0
  78. opentrons/drivers/smoothie_drivers/simulator.py +99 -0
  79. opentrons/drivers/smoothie_drivers/types.py +16 -0
  80. opentrons/drivers/temp_deck/__init__.py +10 -0
  81. opentrons/drivers/temp_deck/abstract.py +54 -0
  82. opentrons/drivers/temp_deck/driver.py +197 -0
  83. opentrons/drivers/temp_deck/simulator.py +57 -0
  84. opentrons/drivers/thermocycler/__init__.py +12 -0
  85. opentrons/drivers/thermocycler/abstract.py +99 -0
  86. opentrons/drivers/thermocycler/driver.py +395 -0
  87. opentrons/drivers/thermocycler/simulator.py +126 -0
  88. opentrons/drivers/types.py +107 -0
  89. opentrons/drivers/utils.py +222 -0
  90. opentrons/execute.py +742 -0
  91. opentrons/hardware_control/__init__.py +65 -0
  92. opentrons/hardware_control/__main__.py +77 -0
  93. opentrons/hardware_control/adapters.py +98 -0
  94. opentrons/hardware_control/api.py +1347 -0
  95. opentrons/hardware_control/backends/__init__.py +7 -0
  96. opentrons/hardware_control/backends/controller.py +400 -0
  97. opentrons/hardware_control/backends/errors.py +9 -0
  98. opentrons/hardware_control/backends/estop_state.py +164 -0
  99. opentrons/hardware_control/backends/flex_protocol.py +497 -0
  100. opentrons/hardware_control/backends/ot3controller.py +1930 -0
  101. opentrons/hardware_control/backends/ot3simulator.py +900 -0
  102. opentrons/hardware_control/backends/ot3utils.py +664 -0
  103. opentrons/hardware_control/backends/simulator.py +442 -0
  104. opentrons/hardware_control/backends/status_bar_state.py +240 -0
  105. opentrons/hardware_control/backends/subsystem_manager.py +431 -0
  106. opentrons/hardware_control/backends/tip_presence_manager.py +173 -0
  107. opentrons/hardware_control/backends/types.py +14 -0
  108. opentrons/hardware_control/constants.py +6 -0
  109. opentrons/hardware_control/dev_types.py +125 -0
  110. opentrons/hardware_control/emulation/__init__.py +0 -0
  111. opentrons/hardware_control/emulation/abstract_emulator.py +21 -0
  112. opentrons/hardware_control/emulation/app.py +56 -0
  113. opentrons/hardware_control/emulation/connection_handler.py +38 -0
  114. opentrons/hardware_control/emulation/heater_shaker.py +150 -0
  115. opentrons/hardware_control/emulation/magdeck.py +60 -0
  116. opentrons/hardware_control/emulation/module_server/__init__.py +8 -0
  117. opentrons/hardware_control/emulation/module_server/client.py +78 -0
  118. opentrons/hardware_control/emulation/module_server/helpers.py +130 -0
  119. opentrons/hardware_control/emulation/module_server/models.py +31 -0
  120. opentrons/hardware_control/emulation/module_server/server.py +110 -0
  121. opentrons/hardware_control/emulation/parser.py +74 -0
  122. opentrons/hardware_control/emulation/proxy.py +241 -0
  123. opentrons/hardware_control/emulation/run_emulator.py +68 -0
  124. opentrons/hardware_control/emulation/scripts/__init__.py +0 -0
  125. opentrons/hardware_control/emulation/scripts/run_app.py +54 -0
  126. opentrons/hardware_control/emulation/scripts/run_module_emulator.py +72 -0
  127. opentrons/hardware_control/emulation/scripts/run_smoothie.py +37 -0
  128. opentrons/hardware_control/emulation/settings.py +119 -0
  129. opentrons/hardware_control/emulation/simulations.py +133 -0
  130. opentrons/hardware_control/emulation/smoothie.py +192 -0
  131. opentrons/hardware_control/emulation/tempdeck.py +69 -0
  132. opentrons/hardware_control/emulation/thermocycler.py +128 -0
  133. opentrons/hardware_control/emulation/types.py +10 -0
  134. opentrons/hardware_control/emulation/util.py +38 -0
  135. opentrons/hardware_control/errors.py +43 -0
  136. opentrons/hardware_control/execution_manager.py +164 -0
  137. opentrons/hardware_control/instruments/__init__.py +5 -0
  138. opentrons/hardware_control/instruments/instrument_abc.py +39 -0
  139. opentrons/hardware_control/instruments/ot2/__init__.py +0 -0
  140. opentrons/hardware_control/instruments/ot2/instrument_calibration.py +152 -0
  141. opentrons/hardware_control/instruments/ot2/pipette.py +777 -0
  142. opentrons/hardware_control/instruments/ot2/pipette_handler.py +995 -0
  143. opentrons/hardware_control/instruments/ot3/__init__.py +0 -0
  144. opentrons/hardware_control/instruments/ot3/gripper.py +420 -0
  145. opentrons/hardware_control/instruments/ot3/gripper_handler.py +173 -0
  146. opentrons/hardware_control/instruments/ot3/instrument_calibration.py +214 -0
  147. opentrons/hardware_control/instruments/ot3/pipette.py +858 -0
  148. opentrons/hardware_control/instruments/ot3/pipette_handler.py +1030 -0
  149. opentrons/hardware_control/module_control.py +332 -0
  150. opentrons/hardware_control/modules/__init__.py +69 -0
  151. opentrons/hardware_control/modules/absorbance_reader.py +373 -0
  152. opentrons/hardware_control/modules/errors.py +7 -0
  153. opentrons/hardware_control/modules/flex_stacker.py +948 -0
  154. opentrons/hardware_control/modules/heater_shaker.py +426 -0
  155. opentrons/hardware_control/modules/lid_temp_status.py +35 -0
  156. opentrons/hardware_control/modules/magdeck.py +233 -0
  157. opentrons/hardware_control/modules/mod_abc.py +245 -0
  158. opentrons/hardware_control/modules/module_calibration.py +93 -0
  159. opentrons/hardware_control/modules/plate_temp_status.py +61 -0
  160. opentrons/hardware_control/modules/tempdeck.py +299 -0
  161. opentrons/hardware_control/modules/thermocycler.py +731 -0
  162. opentrons/hardware_control/modules/types.py +417 -0
  163. opentrons/hardware_control/modules/update.py +255 -0
  164. opentrons/hardware_control/modules/utils.py +73 -0
  165. opentrons/hardware_control/motion_utilities.py +318 -0
  166. opentrons/hardware_control/nozzle_manager.py +422 -0
  167. opentrons/hardware_control/ot3_calibration.py +1171 -0
  168. opentrons/hardware_control/ot3api.py +3227 -0
  169. opentrons/hardware_control/pause_manager.py +31 -0
  170. opentrons/hardware_control/poller.py +112 -0
  171. opentrons/hardware_control/protocols/__init__.py +106 -0
  172. opentrons/hardware_control/protocols/asyncio_configurable.py +11 -0
  173. opentrons/hardware_control/protocols/calibratable.py +45 -0
  174. opentrons/hardware_control/protocols/chassis_accessory_manager.py +90 -0
  175. opentrons/hardware_control/protocols/configurable.py +48 -0
  176. opentrons/hardware_control/protocols/event_sourcer.py +18 -0
  177. opentrons/hardware_control/protocols/execution_controllable.py +33 -0
  178. opentrons/hardware_control/protocols/flex_calibratable.py +96 -0
  179. opentrons/hardware_control/protocols/flex_instrument_configurer.py +52 -0
  180. opentrons/hardware_control/protocols/gripper_controller.py +55 -0
  181. opentrons/hardware_control/protocols/hardware_manager.py +51 -0
  182. opentrons/hardware_control/protocols/identifiable.py +16 -0
  183. opentrons/hardware_control/protocols/instrument_configurer.py +206 -0
  184. opentrons/hardware_control/protocols/liquid_handler.py +266 -0
  185. opentrons/hardware_control/protocols/module_provider.py +16 -0
  186. opentrons/hardware_control/protocols/motion_controller.py +243 -0
  187. opentrons/hardware_control/protocols/position_estimator.py +45 -0
  188. opentrons/hardware_control/protocols/simulatable.py +10 -0
  189. opentrons/hardware_control/protocols/stoppable.py +9 -0
  190. opentrons/hardware_control/protocols/types.py +27 -0
  191. opentrons/hardware_control/robot_calibration.py +224 -0
  192. opentrons/hardware_control/scripts/README.md +28 -0
  193. opentrons/hardware_control/scripts/__init__.py +1 -0
  194. opentrons/hardware_control/scripts/gripper_control.py +208 -0
  195. opentrons/hardware_control/scripts/ot3gripper +7 -0
  196. opentrons/hardware_control/scripts/ot3repl +7 -0
  197. opentrons/hardware_control/scripts/repl.py +187 -0
  198. opentrons/hardware_control/scripts/tc_control.py +97 -0
  199. opentrons/hardware_control/scripts/update_module_fw.py +274 -0
  200. opentrons/hardware_control/simulator_setup.py +260 -0
  201. opentrons/hardware_control/thread_manager.py +431 -0
  202. opentrons/hardware_control/threaded_async_lock.py +97 -0
  203. opentrons/hardware_control/types.py +792 -0
  204. opentrons/hardware_control/util.py +234 -0
  205. opentrons/legacy_broker.py +53 -0
  206. opentrons/legacy_commands/__init__.py +1 -0
  207. opentrons/legacy_commands/commands.py +483 -0
  208. opentrons/legacy_commands/helpers.py +153 -0
  209. opentrons/legacy_commands/module_commands.py +276 -0
  210. opentrons/legacy_commands/protocol_commands.py +54 -0
  211. opentrons/legacy_commands/publisher.py +155 -0
  212. opentrons/legacy_commands/robot_commands.py +51 -0
  213. opentrons/legacy_commands/types.py +1186 -0
  214. opentrons/motion_planning/__init__.py +32 -0
  215. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  216. opentrons/motion_planning/deck_conflict.py +501 -0
  217. opentrons/motion_planning/errors.py +35 -0
  218. opentrons/motion_planning/types.py +42 -0
  219. opentrons/motion_planning/waypoints.py +218 -0
  220. opentrons/ordered_set.py +138 -0
  221. opentrons/protocol_api/__init__.py +105 -0
  222. opentrons/protocol_api/_liquid.py +157 -0
  223. opentrons/protocol_api/_liquid_properties.py +814 -0
  224. opentrons/protocol_api/_nozzle_layout.py +31 -0
  225. opentrons/protocol_api/_parameter_context.py +300 -0
  226. opentrons/protocol_api/_parameters.py +31 -0
  227. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  228. opentrons/protocol_api/_types.py +43 -0
  229. opentrons/protocol_api/config.py +23 -0
  230. opentrons/protocol_api/core/__init__.py +23 -0
  231. opentrons/protocol_api/core/common.py +33 -0
  232. opentrons/protocol_api/core/core_map.py +74 -0
  233. opentrons/protocol_api/core/engine/__init__.py +22 -0
  234. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  235. opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
  236. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  237. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  238. opentrons/protocol_api/core/engine/labware.py +238 -0
  239. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  240. opentrons/protocol_api/core/engine/module_core.py +1027 -0
  241. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  242. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  243. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  244. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  245. opentrons/protocol_api/core/engine/robot.py +139 -0
  246. opentrons/protocol_api/core/engine/stringify.py +74 -0
  247. opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
  248. opentrons/protocol_api/core/engine/well.py +241 -0
  249. opentrons/protocol_api/core/instrument.py +459 -0
  250. opentrons/protocol_api/core/labware.py +151 -0
  251. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  252. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  253. opentrons/protocol_api/core/legacy/deck.py +369 -0
  254. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  255. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  256. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  257. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  258. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  259. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  260. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  261. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  262. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  263. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  265. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  266. opentrons/protocol_api/core/module.py +484 -0
  267. opentrons/protocol_api/core/protocol.py +311 -0
  268. opentrons/protocol_api/core/robot.py +51 -0
  269. opentrons/protocol_api/core/well.py +116 -0
  270. opentrons/protocol_api/core/well_grid.py +45 -0
  271. opentrons/protocol_api/create_protocol_context.py +177 -0
  272. opentrons/protocol_api/deck.py +223 -0
  273. opentrons/protocol_api/disposal_locations.py +244 -0
  274. opentrons/protocol_api/instrument_context.py +3272 -0
  275. opentrons/protocol_api/labware.py +1579 -0
  276. opentrons/protocol_api/module_contexts.py +1447 -0
  277. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  278. opentrons/protocol_api/protocol_context.py +1688 -0
  279. opentrons/protocol_api/robot_context.py +303 -0
  280. opentrons/protocol_api/validation.py +761 -0
  281. opentrons/protocol_engine/__init__.py +155 -0
  282. opentrons/protocol_engine/actions/__init__.py +65 -0
  283. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  284. opentrons/protocol_engine/actions/action_handler.py +13 -0
  285. opentrons/protocol_engine/actions/actions.py +302 -0
  286. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  287. opentrons/protocol_engine/clients/__init__.py +5 -0
  288. opentrons/protocol_engine/clients/sync_client.py +174 -0
  289. opentrons/protocol_engine/clients/transports.py +197 -0
  290. opentrons/protocol_engine/commands/__init__.py +757 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  296. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  297. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  298. opentrons/protocol_engine/commands/aspirate.py +244 -0
  299. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  300. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  301. opentrons/protocol_engine/commands/blow_out.py +146 -0
  302. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  303. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  306. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  307. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  308. opentrons/protocol_engine/commands/command.py +308 -0
  309. opentrons/protocol_engine/commands/command_unions.py +974 -0
  310. opentrons/protocol_engine/commands/comment.py +57 -0
  311. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  312. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  313. opentrons/protocol_engine/commands/custom.py +67 -0
  314. opentrons/protocol_engine/commands/dispense.py +194 -0
  315. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  316. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  317. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  318. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  319. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  320. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  321. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  322. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  323. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  324. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  325. opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
  326. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  327. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  328. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  329. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  330. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  331. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  333. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  334. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  336. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  337. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  338. opentrons/protocol_engine/commands/home.py +100 -0
  339. opentrons/protocol_engine/commands/identify_module.py +86 -0
  340. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  341. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  342. opentrons/protocol_engine/commands/load_labware.py +210 -0
  343. opentrons/protocol_engine/commands/load_lid.py +154 -0
  344. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  345. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  346. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  347. opentrons/protocol_engine/commands/load_module.py +223 -0
  348. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  349. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  350. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  351. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  352. opentrons/protocol_engine/commands/move_labware.py +546 -0
  353. opentrons/protocol_engine/commands/move_relative.py +102 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  355. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  356. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  357. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  358. opentrons/protocol_engine/commands/movement_common.py +338 -0
  359. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  360. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  361. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  362. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  363. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  364. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  365. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  366. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  367. opentrons/protocol_engine/commands/robot/common.py +18 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  369. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  370. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  371. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  372. opentrons/protocol_engine/commands/save_position.py +109 -0
  373. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  374. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  375. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  376. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  377. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  378. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  379. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  380. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  381. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  384. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  386. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  388. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  390. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  391. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  392. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  401. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  402. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  403. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  404. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  405. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  406. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  407. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  408. opentrons/protocol_engine/engine_support.py +28 -0
  409. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  410. opentrons/protocol_engine/errors/__init__.py +191 -0
  411. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  412. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  413. opentrons/protocol_engine/execution/__init__.py +50 -0
  414. opentrons/protocol_engine/execution/command_executor.py +216 -0
  415. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  416. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  417. opentrons/protocol_engine/execution/equipment.py +819 -0
  418. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  419. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  420. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  421. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  422. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  423. opentrons/protocol_engine/execution/movement.py +350 -0
  424. opentrons/protocol_engine/execution/pipetting.py +607 -0
  425. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  426. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  427. opentrons/protocol_engine/execution/run_control.py +33 -0
  428. opentrons/protocol_engine/execution/status_bar.py +34 -0
  429. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  430. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  431. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  432. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  433. opentrons/protocol_engine/notes/__init__.py +17 -0
  434. opentrons/protocol_engine/notes/notes.py +59 -0
  435. opentrons/protocol_engine/plugins.py +104 -0
  436. opentrons/protocol_engine/protocol_engine.py +683 -0
  437. opentrons/protocol_engine/resources/__init__.py +26 -0
  438. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  439. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  440. opentrons/protocol_engine/resources/file_provider.py +161 -0
  441. opentrons/protocol_engine/resources/fixture_validation.py +68 -0
  442. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  443. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  444. opentrons/protocol_engine/resources/model_utils.py +32 -0
  445. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  446. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  447. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  448. opentrons/protocol_engine/slot_standardization.py +128 -0
  449. opentrons/protocol_engine/state/__init__.py +1 -0
  450. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  451. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  452. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  453. opentrons/protocol_engine/state/_move_types.py +83 -0
  454. opentrons/protocol_engine/state/_well_math.py +193 -0
  455. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  456. opentrons/protocol_engine/state/command_history.py +309 -0
  457. opentrons/protocol_engine/state/commands.py +1164 -0
  458. opentrons/protocol_engine/state/config.py +39 -0
  459. opentrons/protocol_engine/state/files.py +57 -0
  460. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  461. opentrons/protocol_engine/state/geometry.py +2408 -0
  462. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  463. opentrons/protocol_engine/state/labware.py +1432 -0
  464. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  465. opentrons/protocol_engine/state/liquids.py +73 -0
  466. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  467. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  468. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  469. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  471. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  472. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  473. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  474. opentrons/protocol_engine/state/modules.py +1515 -0
  475. opentrons/protocol_engine/state/motion.py +373 -0
  476. opentrons/protocol_engine/state/pipettes.py +905 -0
  477. opentrons/protocol_engine/state/state.py +421 -0
  478. opentrons/protocol_engine/state/state_summary.py +36 -0
  479. opentrons/protocol_engine/state/tips.py +420 -0
  480. opentrons/protocol_engine/state/update_types.py +904 -0
  481. opentrons/protocol_engine/state/wells.py +290 -0
  482. opentrons/protocol_engine/types/__init__.py +310 -0
  483. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  484. opentrons/protocol_engine/types/command_annotations.py +53 -0
  485. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  486. opentrons/protocol_engine/types/execution.py +96 -0
  487. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  488. opentrons/protocol_engine/types/instrument.py +47 -0
  489. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  490. opentrons/protocol_engine/types/labware.py +131 -0
  491. opentrons/protocol_engine/types/labware_movement.py +22 -0
  492. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  493. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  494. opentrons/protocol_engine/types/liquid.py +40 -0
  495. opentrons/protocol_engine/types/liquid_class.py +59 -0
  496. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  497. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  498. opentrons/protocol_engine/types/location.py +194 -0
  499. opentrons/protocol_engine/types/module.py +310 -0
  500. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  501. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  502. opentrons/protocol_engine/types/tip.py +18 -0
  503. opentrons/protocol_engine/types/util.py +21 -0
  504. opentrons/protocol_engine/types/well_position.py +124 -0
  505. opentrons/protocol_reader/__init__.py +37 -0
  506. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  507. opentrons/protocol_reader/file_format_validator.py +152 -0
  508. opentrons/protocol_reader/file_hasher.py +27 -0
  509. opentrons/protocol_reader/file_identifier.py +284 -0
  510. opentrons/protocol_reader/file_reader_writer.py +90 -0
  511. opentrons/protocol_reader/input_file.py +16 -0
  512. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  513. opentrons/protocol_reader/protocol_reader.py +188 -0
  514. opentrons/protocol_reader/protocol_source.py +124 -0
  515. opentrons/protocol_reader/role_analyzer.py +86 -0
  516. opentrons/protocol_runner/__init__.py +26 -0
  517. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  518. opentrons/protocol_runner/json_file_reader.py +55 -0
  519. opentrons/protocol_runner/json_translator.py +314 -0
  520. opentrons/protocol_runner/legacy_command_mapper.py +852 -0
  521. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  522. opentrons/protocol_runner/protocol_runner.py +530 -0
  523. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  524. opentrons/protocol_runner/run_orchestrator.py +496 -0
  525. opentrons/protocol_runner/task_queue.py +95 -0
  526. opentrons/protocols/__init__.py +6 -0
  527. opentrons/protocols/advanced_control/__init__.py +0 -0
  528. opentrons/protocols/advanced_control/common.py +38 -0
  529. opentrons/protocols/advanced_control/mix.py +60 -0
  530. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  531. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  532. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  533. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  534. opentrons/protocols/api_support/__init__.py +0 -0
  535. opentrons/protocols/api_support/constants.py +8 -0
  536. opentrons/protocols/api_support/deck_type.py +110 -0
  537. opentrons/protocols/api_support/definitions.py +18 -0
  538. opentrons/protocols/api_support/instrument.py +151 -0
  539. opentrons/protocols/api_support/labware_like.py +233 -0
  540. opentrons/protocols/api_support/tip_tracker.py +175 -0
  541. opentrons/protocols/api_support/types.py +32 -0
  542. opentrons/protocols/api_support/util.py +403 -0
  543. opentrons/protocols/bundle.py +89 -0
  544. opentrons/protocols/duration/__init__.py +4 -0
  545. opentrons/protocols/duration/errors.py +5 -0
  546. opentrons/protocols/duration/estimator.py +628 -0
  547. opentrons/protocols/execution/__init__.py +0 -0
  548. opentrons/protocols/execution/dev_types.py +181 -0
  549. opentrons/protocols/execution/errors.py +40 -0
  550. opentrons/protocols/execution/execute.py +84 -0
  551. opentrons/protocols/execution/execute_json_v3.py +275 -0
  552. opentrons/protocols/execution/execute_json_v4.py +359 -0
  553. opentrons/protocols/execution/execute_json_v5.py +28 -0
  554. opentrons/protocols/execution/execute_python.py +169 -0
  555. opentrons/protocols/execution/json_dispatchers.py +87 -0
  556. opentrons/protocols/execution/types.py +7 -0
  557. opentrons/protocols/geometry/__init__.py +0 -0
  558. opentrons/protocols/geometry/planning.py +297 -0
  559. opentrons/protocols/labware.py +312 -0
  560. opentrons/protocols/models/__init__.py +0 -0
  561. opentrons/protocols/models/json_protocol.py +679 -0
  562. opentrons/protocols/parameters/__init__.py +0 -0
  563. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  564. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  565. opentrons/protocols/parameters/exceptions.py +34 -0
  566. opentrons/protocols/parameters/parameter_definition.py +272 -0
  567. opentrons/protocols/parameters/types.py +17 -0
  568. opentrons/protocols/parameters/validation.py +267 -0
  569. opentrons/protocols/parse.py +671 -0
  570. opentrons/protocols/types.py +159 -0
  571. opentrons/py.typed +0 -0
  572. opentrons/resources/scripts/lpc21isp +0 -0
  573. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  574. opentrons/simulate.py +1065 -0
  575. opentrons/system/__init__.py +6 -0
  576. opentrons/system/camera.py +51 -0
  577. opentrons/system/log_control.py +59 -0
  578. opentrons/system/nmcli.py +856 -0
  579. opentrons/system/resin.py +24 -0
  580. opentrons/system/smoothie_update.py +15 -0
  581. opentrons/system/wifi.py +204 -0
  582. opentrons/tools/__init__.py +0 -0
  583. opentrons/tools/args_handler.py +22 -0
  584. opentrons/tools/write_pipette_memory.py +157 -0
  585. opentrons/types.py +618 -0
  586. opentrons/util/__init__.py +1 -0
  587. opentrons/util/async_helpers.py +166 -0
  588. opentrons/util/broker.py +84 -0
  589. opentrons/util/change_notifier.py +47 -0
  590. opentrons/util/entrypoint_util.py +278 -0
  591. opentrons/util/get_union_elements.py +26 -0
  592. opentrons/util/helpers.py +6 -0
  593. opentrons/util/linal.py +178 -0
  594. opentrons/util/logging_config.py +265 -0
  595. opentrons/util/logging_queue_handler.py +61 -0
  596. opentrons/util/performance_helpers.py +157 -0
  597. opentrons-8.6.0.dist-info/METADATA +37 -0
  598. opentrons-8.6.0.dist-info/RECORD +601 -0
  599. opentrons-8.6.0.dist-info/WHEEL +4 -0
  600. opentrons-8.6.0.dist-info/entry_points.txt +3 -0
  601. opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,311 @@
1
+ """The interface that implements ProtocolContext."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from abc import abstractmethod, ABC
6
+ from typing import Generic, List, Optional, Union, Tuple, Dict, TYPE_CHECKING
7
+
8
+ from opentrons_shared_data.deck.types import DeckDefinitionV5, SlotDefV3
9
+ from opentrons_shared_data.pipette.types import PipetteNameType
10
+ from opentrons_shared_data.labware.types import LabwareDefinition
11
+ from opentrons_shared_data.robot.types import RobotType
12
+
13
+ from opentrons.types import (
14
+ DeckSlotName,
15
+ StagingSlotName,
16
+ Location,
17
+ Mount,
18
+ Point,
19
+ )
20
+ from opentrons.hardware_control import SyncHardwareAPI
21
+ from opentrons.hardware_control.modules.types import ModuleModel
22
+ from opentrons.protocols.api_support.util import AxisMaxSpeeds
23
+
24
+ from .instrument import InstrumentCoreType
25
+ from .labware import LabwareCoreType, LabwareLoadParams
26
+ from .module import ModuleCoreType
27
+ from .._liquid import Liquid, LiquidClass
28
+ from .robot import AbstractRobot
29
+ from .._types import OffDeckType
30
+ from ..disposal_locations import TrashBin, WasteChute
31
+
32
+ if TYPE_CHECKING:
33
+ from ..labware import Labware
34
+
35
+
36
+ class AbstractProtocol(
37
+ ABC, Generic[InstrumentCoreType, LabwareCoreType, ModuleCoreType]
38
+ ):
39
+ @property
40
+ @abstractmethod
41
+ def fixed_trash(self) -> Optional[LabwareCoreType]:
42
+ """Get the fixed trash labware core."""
43
+ ...
44
+
45
+ @property
46
+ @abstractmethod
47
+ def robot_type(self) -> RobotType:
48
+ ...
49
+
50
+ @abstractmethod
51
+ def get_max_speeds(self) -> AxisMaxSpeeds:
52
+ ...
53
+
54
+ @abstractmethod
55
+ def get_hardware(self) -> SyncHardwareAPI:
56
+ ...
57
+
58
+ @abstractmethod
59
+ def is_simulating(self) -> bool:
60
+ ...
61
+
62
+ @abstractmethod
63
+ def add_labware_definition(
64
+ self,
65
+ definition: LabwareDefinition,
66
+ ) -> LabwareLoadParams:
67
+ """Add a labware definition to the set of loadable definitions."""
68
+ ...
69
+
70
+ @abstractmethod
71
+ def append_disposal_location(
72
+ self,
73
+ disposal_location: Union[Labware, TrashBin, WasteChute],
74
+ ) -> None:
75
+ """Append a disposal location object to the core"""
76
+ ...
77
+
78
+ @abstractmethod
79
+ def load_labware(
80
+ self,
81
+ load_name: str,
82
+ location: Union[
83
+ DeckSlotName, StagingSlotName, LabwareCoreType, ModuleCoreType, OffDeckType
84
+ ],
85
+ label: Optional[str],
86
+ namespace: Optional[str],
87
+ version: Optional[int],
88
+ ) -> LabwareCoreType:
89
+ """Load a labware using its identifying parameters."""
90
+ ...
91
+
92
+ @abstractmethod
93
+ def load_adapter(
94
+ self,
95
+ load_name: str,
96
+ location: Union[DeckSlotName, StagingSlotName, ModuleCoreType, OffDeckType],
97
+ namespace: Optional[str],
98
+ version: Optional[int],
99
+ ) -> LabwareCoreType:
100
+ """Load an adapter using its identifying parameters"""
101
+ ...
102
+
103
+ @abstractmethod
104
+ def load_lid(
105
+ self,
106
+ load_name: str,
107
+ location: LabwareCoreType,
108
+ namespace: Optional[str],
109
+ version: Optional[int],
110
+ ) -> LabwareCoreType:
111
+ """Load an individual lid labware using its identifying parameters. Must be loaded on a labware."""
112
+ ...
113
+
114
+ @abstractmethod
115
+ def move_labware(
116
+ self,
117
+ labware_core: LabwareCoreType,
118
+ new_location: Union[
119
+ DeckSlotName,
120
+ StagingSlotName,
121
+ LabwareCoreType,
122
+ ModuleCoreType,
123
+ OffDeckType,
124
+ WasteChute,
125
+ TrashBin,
126
+ ],
127
+ use_gripper: bool,
128
+ pause_for_manual_move: bool,
129
+ pick_up_offset: Optional[Tuple[float, float, float]],
130
+ drop_offset: Optional[Tuple[float, float, float]],
131
+ ) -> None:
132
+ ...
133
+
134
+ @abstractmethod
135
+ def move_lid(
136
+ self,
137
+ source_location: Union[DeckSlotName, StagingSlotName, LabwareCoreType],
138
+ new_location: Union[
139
+ DeckSlotName,
140
+ StagingSlotName,
141
+ LabwareCoreType,
142
+ OffDeckType,
143
+ WasteChute,
144
+ TrashBin,
145
+ ],
146
+ use_gripper: bool,
147
+ pause_for_manual_move: bool,
148
+ pick_up_offset: Optional[Tuple[float, float, float]],
149
+ drop_offset: Optional[Tuple[float, float, float]],
150
+ ) -> LabwareCoreType | None:
151
+ ...
152
+
153
+ @abstractmethod
154
+ def load_module(
155
+ self,
156
+ model: ModuleModel,
157
+ deck_slot: Optional[DeckSlotName],
158
+ configuration: Optional[str],
159
+ ) -> ModuleCoreType:
160
+ ...
161
+
162
+ @abstractmethod
163
+ def load_instrument(
164
+ self,
165
+ instrument_name: PipetteNameType,
166
+ mount: Mount,
167
+ liquid_presence_detection: bool = False,
168
+ ) -> InstrumentCoreType:
169
+ ...
170
+
171
+ @abstractmethod
172
+ def load_trash_bin(self, slot_name: DeckSlotName, area_name: str) -> TrashBin:
173
+ ...
174
+
175
+ @abstractmethod
176
+ def load_ot2_fixed_trash_bin(self) -> None:
177
+ ...
178
+
179
+ @abstractmethod
180
+ def load_waste_chute(self) -> WasteChute:
181
+ ...
182
+
183
+ @abstractmethod
184
+ def pause(self, msg: Optional[str]) -> None:
185
+ ...
186
+
187
+ @abstractmethod
188
+ def comment(self, msg: str) -> None:
189
+ ...
190
+
191
+ @abstractmethod
192
+ def delay(self, seconds: float, msg: Optional[str]) -> None:
193
+ ...
194
+
195
+ @abstractmethod
196
+ def home(self) -> None:
197
+ ...
198
+
199
+ @abstractmethod
200
+ def set_rail_lights(self, on: bool) -> None:
201
+ ...
202
+
203
+ @abstractmethod
204
+ def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]:
205
+ ...
206
+
207
+ @abstractmethod
208
+ def get_rail_lights_on(self) -> bool:
209
+ ...
210
+
211
+ @abstractmethod
212
+ def door_closed(self) -> bool:
213
+ ...
214
+
215
+ @abstractmethod
216
+ def get_last_location(
217
+ self,
218
+ mount: Optional[Mount] = None,
219
+ ) -> Optional[Union[Location, TrashBin, WasteChute]]:
220
+ ...
221
+
222
+ @abstractmethod
223
+ def set_last_location(
224
+ self,
225
+ location: Optional[Location],
226
+ mount: Optional[Mount] = None,
227
+ ) -> None:
228
+ ...
229
+
230
+ @abstractmethod
231
+ def load_lid_stack(
232
+ self,
233
+ load_name: str,
234
+ location: Union[DeckSlotName, StagingSlotName, LabwareCoreType],
235
+ quantity: int,
236
+ namespace: Optional[str],
237
+ version: Optional[int],
238
+ ) -> LabwareCoreType:
239
+ ...
240
+
241
+ @abstractmethod
242
+ def get_deck_definition(self) -> DeckDefinitionV5:
243
+ """Get the geometry definition of the robot's deck."""
244
+
245
+ @abstractmethod
246
+ def get_slot_definition(
247
+ self, slot: Union[DeckSlotName, StagingSlotName]
248
+ ) -> SlotDefV3:
249
+ """Get the slot definition from the robot's deck."""
250
+
251
+ @abstractmethod
252
+ def get_slot_definitions(self) -> Dict[str, SlotDefV3]:
253
+ """Get all standard slot definitions available in the deck definition."""
254
+
255
+ @abstractmethod
256
+ def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]:
257
+ """Get all staging slot definitions available in the deck definition."""
258
+
259
+ @abstractmethod
260
+ def get_slot_item(
261
+ self, slot_name: Union[DeckSlotName, StagingSlotName]
262
+ ) -> Union[LabwareCoreType, ModuleCoreType, None]:
263
+ """Get the contents of a given slot, if any."""
264
+
265
+ @abstractmethod
266
+ def get_labware_on_module(
267
+ self, module_core: ModuleCoreType
268
+ ) -> Optional[LabwareCoreType]:
269
+ """Get the labware on a given module, if any."""
270
+
271
+ @abstractmethod
272
+ def get_labware_on_labware(
273
+ self, labware_core: LabwareCoreType
274
+ ) -> Optional[LabwareCoreType]:
275
+ """Get the labware on a given labware, if any."""
276
+
277
+ @abstractmethod
278
+ def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point:
279
+ """Get the absolute coordinate of a slot's center."""
280
+
281
+ @abstractmethod
282
+ def get_highest_z(self) -> float:
283
+ """Get the highest Z point of all deck items."""
284
+
285
+ @abstractmethod
286
+ def get_labware_cores(self) -> List[LabwareCoreType]:
287
+ """Get all loaded labware cores."""
288
+
289
+ @abstractmethod
290
+ def get_module_cores(self) -> List[ModuleCoreType]:
291
+ """Get all loaded module cores."""
292
+
293
+ @abstractmethod
294
+ def define_liquid(
295
+ self, name: str, description: Optional[str], display_color: Optional[str]
296
+ ) -> Liquid:
297
+ """Define a liquid to load into a well."""
298
+
299
+ @abstractmethod
300
+ def get_liquid_class(self, name: str, version: int) -> LiquidClass:
301
+ """Get an instance of a built-in liquid class."""
302
+
303
+ @abstractmethod
304
+ def get_labware_location(
305
+ self, labware_core: LabwareCoreType
306
+ ) -> Union[str, LabwareCoreType, ModuleCoreType, OffDeckType]:
307
+ """Get labware parent location."""
308
+
309
+ @abstractmethod
310
+ def load_robot(self) -> AbstractRobot:
311
+ """Load a Robot Core context into a protocol"""
@@ -0,0 +1,51 @@
1
+ from abc import abstractmethod, ABC
2
+ from typing import Optional, Union
3
+
4
+ from opentrons.types import AxisMapType, Mount, Point
5
+ from opentrons_shared_data.pipette.types import PipetteNameType
6
+ from opentrons.protocol_api._types import PlungerPositionTypes, PipetteActionTypes
7
+
8
+
9
+ class AbstractRobot(ABC):
10
+ @abstractmethod
11
+ def get_pipette_type_from_engine(
12
+ self, mount: Union[Mount, str]
13
+ ) -> Optional[PipetteNameType]:
14
+ ...
15
+
16
+ @abstractmethod
17
+ def get_plunger_position_from_volume(
18
+ self, mount: Mount, volume: float, action: PipetteActionTypes, robot_type: str
19
+ ) -> float:
20
+ ...
21
+
22
+ @abstractmethod
23
+ def get_plunger_position_from_name(
24
+ self, mount: Mount, position_name: PlungerPositionTypes
25
+ ) -> float:
26
+ ...
27
+
28
+ @abstractmethod
29
+ def move_to(self, mount: Mount, destination: Point, speed: Optional[float]) -> None:
30
+ ...
31
+
32
+ @abstractmethod
33
+ def move_axes_to(
34
+ self,
35
+ axis_map: AxisMapType,
36
+ critical_point: Optional[AxisMapType],
37
+ speed: Optional[float],
38
+ ) -> None:
39
+ ...
40
+
41
+ @abstractmethod
42
+ def move_axes_relative(self, axis_map: AxisMapType, speed: Optional[float]) -> None:
43
+ ...
44
+
45
+ @abstractmethod
46
+ def release_grip(self) -> None:
47
+ ...
48
+
49
+ @abstractmethod
50
+ def close_gripper(self, force: Optional[float] = None) -> None:
51
+ ...
@@ -0,0 +1,116 @@
1
+ """Abstract interface for Well core implementations."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TypeVar, Optional, Union
5
+
6
+ from opentrons.types import Point, Mount
7
+ from opentrons.protocol_engine.types import LiquidTrackingType
8
+
9
+ from .._liquid import Liquid
10
+
11
+
12
+ class AbstractWellCore(ABC):
13
+ """Well core interface."""
14
+
15
+ @property
16
+ @abstractmethod
17
+ def diameter(self) -> Optional[float]:
18
+ """Get the well's diameter, if circular."""
19
+
20
+ @property
21
+ @abstractmethod
22
+ def length(self) -> Optional[float]:
23
+ """Get the well's length, if rectangular."""
24
+
25
+ @property
26
+ @abstractmethod
27
+ def width(self) -> Optional[float]:
28
+ """Get the well's width, if rectangular."""
29
+
30
+ @property
31
+ @abstractmethod
32
+ def depth(self) -> float:
33
+ """Get the well's depth."""
34
+
35
+ @abstractmethod
36
+ def has_tip(self) -> bool:
37
+ """Whether the well contains a tip."""
38
+
39
+ @abstractmethod
40
+ def set_has_tip(self, value: bool) -> None:
41
+ """Set the well as containing or not containing a tip."""
42
+
43
+ @abstractmethod
44
+ def get_display_name(self) -> str:
45
+ """Get the full display name of the well (e.g. "A1 of Some Labware on 5")."""
46
+
47
+ @abstractmethod
48
+ def get_name(self) -> str:
49
+ """Get the name of the well (e.g. "A1")."""
50
+
51
+ @abstractmethod
52
+ def get_column_name(self) -> str:
53
+ """Get the column portion of the well name (e.g. "1")."""
54
+
55
+ @abstractmethod
56
+ def get_row_name(self) -> str:
57
+ """Get the row portion of the well name (e.g. "A")."""
58
+
59
+ @abstractmethod
60
+ def get_max_volume(self) -> float:
61
+ """Get the well's maximum liquid volume."""
62
+
63
+ @abstractmethod
64
+ def get_top(self, z_offset: float) -> Point:
65
+ """Get the coordinate of the well's top, with an z-offset."""
66
+
67
+ @abstractmethod
68
+ def get_bottom(self, z_offset: float) -> Point:
69
+ """Get the coordinate of the well's bottom, with an z-offset."""
70
+
71
+ @abstractmethod
72
+ def get_center(self) -> Point:
73
+ """Get the coordinate of the well's center."""
74
+
75
+ @abstractmethod
76
+ def get_meniscus(self) -> Union[Point, LiquidTrackingType]:
77
+ """Get the coordinate of the well's meniscus."""
78
+
79
+ @abstractmethod
80
+ def load_liquid(
81
+ self,
82
+ liquid: Liquid,
83
+ volume: float,
84
+ ) -> None:
85
+ """Load liquid into a well."""
86
+
87
+ @abstractmethod
88
+ def from_center_cartesian(self, x: float, y: float, z: float) -> Point:
89
+ """Gets point in deck coordinates based on percentage of the radius of each axis."""
90
+
91
+ @abstractmethod
92
+ def estimate_liquid_height_after_pipetting(
93
+ self,
94
+ mount: Mount | str,
95
+ operation_volume: float,
96
+ ) -> LiquidTrackingType:
97
+ """Estimate what the liquid height will be after pipetting, without raising an error."""
98
+
99
+ @abstractmethod
100
+ def current_liquid_height(self) -> LiquidTrackingType:
101
+ """Get the current liquid height."""
102
+
103
+ @abstractmethod
104
+ def get_liquid_volume(self) -> LiquidTrackingType:
105
+ """Get the current volume within a well."""
106
+
107
+ @abstractmethod
108
+ def height_from_volume(self, volume: LiquidTrackingType) -> LiquidTrackingType:
109
+ """Return the height in a well corresponding to a given volume."""
110
+
111
+ @abstractmethod
112
+ def volume_from_height(self, height: LiquidTrackingType) -> LiquidTrackingType:
113
+ """Return the volume contained in a well at any height."""
114
+
115
+
116
+ WellCoreType = TypeVar("WellCoreType", bound=AbstractWellCore)
@@ -0,0 +1,45 @@
1
+ """Well grid information."""
2
+ import collections
3
+ from dataclasses import dataclass
4
+ from typing import Dict, List
5
+
6
+ from opentrons_shared_data.labware.constants import WELL_NAME_PATTERN
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class WellGrid:
11
+ """Well grid information.
12
+
13
+ Attributes:
14
+ columns_by_name: An ordered mapping of well names, keyed by column names.
15
+ rows_by_name: An ordered mapping of well names, keyed by row names.
16
+ """
17
+
18
+ rows_by_name: Dict[str, List[str]]
19
+ columns_by_name: Dict[str, List[str]]
20
+
21
+
22
+ # NOTE(mc, 2022-11-11): to preserve historical behavior,
23
+ # this function organizes rows and columns using the well name,
24
+ # rather than the well's position in the labware definition's `ordering` field.
25
+ # Logic originally added in https://github.com/Opentrons/opentrons/pull/2418
26
+ def create(columns: List[List[str]]) -> WellGrid:
27
+ columns_by_name = collections.defaultdict(list)
28
+ rows_by_name = collections.defaultdict(list)
29
+
30
+ for column in columns:
31
+ for well_name in column:
32
+ well_name_match = WELL_NAME_PATTERN.match(well_name)
33
+
34
+ assert (
35
+ well_name_match is not None
36
+ ), "Well name did not match required pattern; please check labware definition."
37
+
38
+ row_name, column_name = well_name_match.group(1, 2)
39
+ rows_by_name[row_name].append(well_name)
40
+ columns_by_name[column_name].append(well_name)
41
+
42
+ return WellGrid(
43
+ columns_by_name=columns_by_name,
44
+ rows_by_name=rows_by_name,
45
+ )
@@ -0,0 +1,177 @@
1
+ """ProtocolContext factory."""
2
+ import asyncio
3
+ from typing import Any, Dict, Optional, Union, cast
4
+
5
+ from opentrons_shared_data.labware.types import LabwareDefinition
6
+
7
+ from opentrons.hardware_control import (
8
+ HardwareControlAPI,
9
+ ThreadManager,
10
+ SynchronousAdapter,
11
+ )
12
+ from opentrons.legacy_broker import LegacyBroker
13
+ from opentrons.util.broker import Broker
14
+ from opentrons.protocol_engine import ProtocolEngine
15
+ from opentrons.protocol_engine.clients import SyncClient, ChildThreadTransport
16
+ from opentrons.protocols.api_support.types import APIVersion
17
+ from opentrons.protocols.api_support.deck_type import (
18
+ should_load_fixed_trash_area_for_python_protocol,
19
+ )
20
+ from opentrons.protocols.api_support.definitions import MAX_SUPPORTED_VERSION
21
+
22
+ from .protocol_context import ProtocolContext
23
+ from .deck import Deck
24
+ from .disposal_locations import TrashBin
25
+
26
+ from .core.common import ProtocolCore as AbstractProtocolCore
27
+ from .core.legacy.deck import Deck as LegacyDeck
28
+ from .core.legacy.legacy_protocol_core import LegacyProtocolCore
29
+ from .core.legacy.labware_offset_provider import (
30
+ AbstractLabwareOffsetProvider,
31
+ LabwareOffsetProvider,
32
+ NullLabwareOffsetProvider,
33
+ )
34
+ from .core.legacy_simulator.legacy_protocol_core import LegacyProtocolCoreSimulator
35
+ from .core.engine import ENGINE_CORE_API_VERSION, ProtocolCore
36
+
37
+
38
+ class ProtocolEngineCoreRequiredError(Exception):
39
+ """Raised when a Protocol Engine core was required, but not provided.
40
+
41
+ This can happen when creating a ProtocolContext with a high api_version.
42
+ """
43
+
44
+
45
+ def create_protocol_context(
46
+ api_version: APIVersion,
47
+ *,
48
+ hardware_api: Union[HardwareControlAPI, ThreadManager[HardwareControlAPI]],
49
+ deck_type: str,
50
+ protocol_engine: Optional[ProtocolEngine] = None,
51
+ protocol_engine_loop: Optional[asyncio.AbstractEventLoop] = None,
52
+ broker: Optional[LegacyBroker] = None,
53
+ equipment_broker: Optional[Broker[Any]] = None,
54
+ use_simulating_core: bool = False,
55
+ extra_labware: Optional[Dict[str, LabwareDefinition]] = None,
56
+ bundled_labware: Optional[Dict[str, LabwareDefinition]] = None,
57
+ bundled_data: Optional[Dict[str, bytes]] = None,
58
+ ) -> ProtocolContext:
59
+ """Create a ProtocolContext for use in a Python protocol.
60
+
61
+ Args:
62
+ api_version: The API version to target.
63
+ hardware_api: Control interface to the device's hardware.
64
+ deck_type: What kind of deck the device has.
65
+ This must match the deck type in `protocol_engine`'s config, if there is one.
66
+ protocol_engine: A ProtocolEngine to use for labware offsets
67
+ and core protocol logic. If omitted, labware offsets will
68
+ all be (0, 0, 0) and ProtocolEngine-based core will not work.
69
+ protocol_engine_loop: An event loop running in the thread where
70
+ ProtocolEngine mutations must occur.
71
+ broker: A message broker for protocol command event publishing.
72
+ equipment_broker: A message broker for equipment load event publishing.
73
+ use_simulating_core: For pre-ProtocolEngine API versions,
74
+ use a simulating protocol core that will skip _most_ calls
75
+ to the `hardware_api`.
76
+ extra_labware: Extra labware definitions to include in
77
+ labware definition lookup paths.
78
+ bundled_labware: Do not use in new code. Leftover from
79
+ experimental ZIP protocol bundles.
80
+ bundled_data: Do not use in new code. Leftover from
81
+ experimental ZIP protocol bundles.
82
+
83
+ Returns:
84
+ A ready-to-use ProtocolContext.
85
+ """
86
+ if api_version > MAX_SUPPORTED_VERSION:
87
+ raise ValueError(
88
+ f"API version {api_version} is not supported by this robot software."
89
+ f" Please reduce your API version to {MAX_SUPPORTED_VERSION} or below"
90
+ f" or update your robot."
91
+ )
92
+
93
+ sync_hardware: SynchronousAdapter[HardwareControlAPI]
94
+ labware_offset_provider: AbstractLabwareOffsetProvider
95
+ core: Union[ProtocolCore, LegacyProtocolCoreSimulator, LegacyProtocolCore]
96
+
97
+ if isinstance(hardware_api, ThreadManager):
98
+ sync_hardware = hardware_api.sync
99
+ else:
100
+ sync_hardware = SynchronousAdapter(hardware_api)
101
+
102
+ if protocol_engine is not None:
103
+ assert deck_type == protocol_engine.state_view.config.deck_type.value
104
+ labware_offset_provider = LabwareOffsetProvider(engine=protocol_engine)
105
+ else:
106
+ labware_offset_provider = NullLabwareOffsetProvider()
107
+
108
+ if api_version >= ENGINE_CORE_API_VERSION:
109
+ # TODO(mc, 2022-8-22): replace raise with strict typing
110
+ if protocol_engine is None or protocol_engine_loop is None:
111
+ raise ProtocolEngineCoreRequiredError(
112
+ "ProtocolEngine PAPI core is enabled, but no ProtocolEngine given."
113
+ )
114
+
115
+ engine_client_transport = ChildThreadTransport(
116
+ engine=protocol_engine, loop=protocol_engine_loop
117
+ )
118
+ engine_client = SyncClient(transport=engine_client_transport)
119
+ core = ProtocolCore(
120
+ engine_client=engine_client,
121
+ api_version=api_version,
122
+ sync_hardware=sync_hardware,
123
+ )
124
+
125
+ elif use_simulating_core:
126
+ legacy_deck = LegacyDeck(deck_type=deck_type)
127
+ core = LegacyProtocolCoreSimulator(
128
+ sync_hardware=sync_hardware,
129
+ labware_offset_provider=labware_offset_provider,
130
+ deck_layout=legacy_deck,
131
+ equipment_broker=equipment_broker,
132
+ api_version=api_version,
133
+ bundled_labware=bundled_labware,
134
+ extra_labware=extra_labware,
135
+ )
136
+
137
+ else:
138
+ legacy_deck = LegacyDeck(deck_type=deck_type)
139
+ core = LegacyProtocolCore(
140
+ sync_hardware=sync_hardware,
141
+ labware_offset_provider=labware_offset_provider,
142
+ deck_layout=legacy_deck,
143
+ equipment_broker=equipment_broker,
144
+ api_version=api_version,
145
+ bundled_labware=bundled_labware,
146
+ extra_labware=extra_labware,
147
+ )
148
+
149
+ # TODO(mc, 2022-12-06): add API version guard in addition to instance check
150
+ # this swap may happen once `ctx.move_labware` off-deck is implemented
151
+ deck = None if isinstance(core, ProtocolCore) else cast(Deck, core.get_deck())
152
+
153
+ context = ProtocolContext(
154
+ api_version=api_version,
155
+ # TODO(mm, 2023-05-11): This cast shouldn't be necessary.
156
+ # Fix this by making the appropriate TypeVars covariant?
157
+ # https://peps.python.org/pep-0484/#covariance-and-contravariance
158
+ core=cast(AbstractProtocolCore, core),
159
+ broker=broker,
160
+ deck=deck,
161
+ bundled_data=bundled_data,
162
+ )
163
+ # If we're loading an engine based core into the context, and we're on api level 2.16 or above, on an OT-2 we need
164
+ # to insert a fixed trash addressable area into the protocol engine, for correctness in anything that relies on
165
+ # knowing what addressable areas have been loaded (and any checks involving trash geometry). Because the method
166
+ # that uses this in the core relies on the sync client and this code will run in the main thread (which if called
167
+ # will cause a deadlock), we're directly calling the protocol engine method here where we have access to it.
168
+ if (
169
+ protocol_engine is not None
170
+ and should_load_fixed_trash_area_for_python_protocol(
171
+ api_version=api_version,
172
+ robot_type=protocol_engine.state_view.config.robot_type,
173
+ )
174
+ ):
175
+ assert isinstance(context.fixed_trash, TrashBin)
176
+ protocol_engine.add_addressable_area(context.fixed_trash.area_name)
177
+ return context