opentrons 8.6.0a1__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 (600) 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 +501 -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 +183 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +552 -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/simulator_setup.py +260 -0
  200. opentrons/hardware_control/thread_manager.py +431 -0
  201. opentrons/hardware_control/threaded_async_lock.py +97 -0
  202. opentrons/hardware_control/types.py +792 -0
  203. opentrons/hardware_control/util.py +234 -0
  204. opentrons/legacy_broker.py +53 -0
  205. opentrons/legacy_commands/__init__.py +1 -0
  206. opentrons/legacy_commands/commands.py +483 -0
  207. opentrons/legacy_commands/helpers.py +153 -0
  208. opentrons/legacy_commands/module_commands.py +215 -0
  209. opentrons/legacy_commands/protocol_commands.py +54 -0
  210. opentrons/legacy_commands/publisher.py +155 -0
  211. opentrons/legacy_commands/robot_commands.py +51 -0
  212. opentrons/legacy_commands/types.py +1115 -0
  213. opentrons/motion_planning/__init__.py +32 -0
  214. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  215. opentrons/motion_planning/deck_conflict.py +396 -0
  216. opentrons/motion_planning/errors.py +35 -0
  217. opentrons/motion_planning/types.py +42 -0
  218. opentrons/motion_planning/waypoints.py +218 -0
  219. opentrons/ordered_set.py +138 -0
  220. opentrons/protocol_api/__init__.py +105 -0
  221. opentrons/protocol_api/_liquid.py +157 -0
  222. opentrons/protocol_api/_liquid_properties.py +814 -0
  223. opentrons/protocol_api/_nozzle_layout.py +31 -0
  224. opentrons/protocol_api/_parameter_context.py +300 -0
  225. opentrons/protocol_api/_parameters.py +31 -0
  226. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  227. opentrons/protocol_api/_types.py +43 -0
  228. opentrons/protocol_api/config.py +23 -0
  229. opentrons/protocol_api/core/__init__.py +23 -0
  230. opentrons/protocol_api/core/common.py +33 -0
  231. opentrons/protocol_api/core/core_map.py +74 -0
  232. opentrons/protocol_api/core/engine/__init__.py +22 -0
  233. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  234. opentrons/protocol_api/core/engine/deck_conflict.py +348 -0
  235. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  236. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  237. opentrons/protocol_api/core/engine/labware.py +238 -0
  238. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  239. opentrons/protocol_api/core/engine/module_core.py +1025 -0
  240. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  241. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  242. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  243. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  244. opentrons/protocol_api/core/engine/robot.py +139 -0
  245. opentrons/protocol_api/core/engine/stringify.py +74 -0
  246. opentrons/protocol_api/core/engine/transfer_components_executor.py +990 -0
  247. opentrons/protocol_api/core/engine/well.py +241 -0
  248. opentrons/protocol_api/core/instrument.py +459 -0
  249. opentrons/protocol_api/core/labware.py +151 -0
  250. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  251. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  252. opentrons/protocol_api/core/legacy/deck.py +369 -0
  253. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  254. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  255. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  256. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  257. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  258. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  259. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  260. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  261. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  262. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  263. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  265. opentrons/protocol_api/core/module.py +484 -0
  266. opentrons/protocol_api/core/protocol.py +311 -0
  267. opentrons/protocol_api/core/robot.py +51 -0
  268. opentrons/protocol_api/core/well.py +116 -0
  269. opentrons/protocol_api/core/well_grid.py +45 -0
  270. opentrons/protocol_api/create_protocol_context.py +177 -0
  271. opentrons/protocol_api/deck.py +223 -0
  272. opentrons/protocol_api/disposal_locations.py +244 -0
  273. opentrons/protocol_api/instrument_context.py +3212 -0
  274. opentrons/protocol_api/labware.py +1579 -0
  275. opentrons/protocol_api/module_contexts.py +1425 -0
  276. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  277. opentrons/protocol_api/protocol_context.py +1688 -0
  278. opentrons/protocol_api/robot_context.py +303 -0
  279. opentrons/protocol_api/validation.py +761 -0
  280. opentrons/protocol_engine/__init__.py +155 -0
  281. opentrons/protocol_engine/actions/__init__.py +65 -0
  282. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  283. opentrons/protocol_engine/actions/action_handler.py +13 -0
  284. opentrons/protocol_engine/actions/actions.py +302 -0
  285. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  286. opentrons/protocol_engine/clients/__init__.py +5 -0
  287. opentrons/protocol_engine/clients/sync_client.py +174 -0
  288. opentrons/protocol_engine/clients/transports.py +197 -0
  289. opentrons/protocol_engine/commands/__init__.py +757 -0
  290. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  296. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  297. opentrons/protocol_engine/commands/aspirate.py +244 -0
  298. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  299. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  300. opentrons/protocol_engine/commands/blow_out.py +146 -0
  301. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  302. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  303. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  306. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  307. opentrons/protocol_engine/commands/command.py +308 -0
  308. opentrons/protocol_engine/commands/command_unions.py +974 -0
  309. opentrons/protocol_engine/commands/comment.py +57 -0
  310. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  311. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  312. opentrons/protocol_engine/commands/custom.py +67 -0
  313. opentrons/protocol_engine/commands/dispense.py +194 -0
  314. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  315. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  316. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  317. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  318. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  319. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  320. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  321. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  322. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  323. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  324. opentrons/protocol_engine/commands/flex_stacker/store.py +326 -0
  325. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  326. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  327. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  328. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  329. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  330. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  331. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  333. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  334. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  336. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  337. opentrons/protocol_engine/commands/home.py +100 -0
  338. opentrons/protocol_engine/commands/identify_module.py +86 -0
  339. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  340. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  341. opentrons/protocol_engine/commands/load_labware.py +210 -0
  342. opentrons/protocol_engine/commands/load_lid.py +154 -0
  343. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  344. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  345. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  346. opentrons/protocol_engine/commands/load_module.py +223 -0
  347. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  348. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  349. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  350. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  351. opentrons/protocol_engine/commands/move_labware.py +546 -0
  352. opentrons/protocol_engine/commands/move_relative.py +102 -0
  353. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  355. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  356. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  357. opentrons/protocol_engine/commands/movement_common.py +338 -0
  358. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  359. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  360. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  361. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  362. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  363. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  364. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  365. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  366. opentrons/protocol_engine/commands/robot/common.py +18 -0
  367. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  369. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  370. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  371. opentrons/protocol_engine/commands/save_position.py +109 -0
  372. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  373. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  374. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  375. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  376. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  377. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  378. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  379. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  380. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  381. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  384. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  386. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  388. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  390. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  391. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  392. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  401. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  402. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  403. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  404. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  405. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  406. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  407. opentrons/protocol_engine/engine_support.py +28 -0
  408. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  409. opentrons/protocol_engine/errors/__init__.py +191 -0
  410. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  411. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  412. opentrons/protocol_engine/execution/__init__.py +50 -0
  413. opentrons/protocol_engine/execution/command_executor.py +216 -0
  414. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  415. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  416. opentrons/protocol_engine/execution/equipment.py +819 -0
  417. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  418. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  419. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  420. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  421. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  422. opentrons/protocol_engine/execution/movement.py +349 -0
  423. opentrons/protocol_engine/execution/pipetting.py +607 -0
  424. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  425. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  426. opentrons/protocol_engine/execution/run_control.py +33 -0
  427. opentrons/protocol_engine/execution/status_bar.py +34 -0
  428. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  429. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  430. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  431. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  432. opentrons/protocol_engine/notes/__init__.py +17 -0
  433. opentrons/protocol_engine/notes/notes.py +59 -0
  434. opentrons/protocol_engine/plugins.py +104 -0
  435. opentrons/protocol_engine/protocol_engine.py +683 -0
  436. opentrons/protocol_engine/resources/__init__.py +26 -0
  437. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  438. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  439. opentrons/protocol_engine/resources/file_provider.py +161 -0
  440. opentrons/protocol_engine/resources/fixture_validation.py +58 -0
  441. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  442. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  443. opentrons/protocol_engine/resources/model_utils.py +32 -0
  444. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  445. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  446. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  447. opentrons/protocol_engine/slot_standardization.py +128 -0
  448. opentrons/protocol_engine/state/__init__.py +1 -0
  449. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  450. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  451. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  452. opentrons/protocol_engine/state/_move_types.py +83 -0
  453. opentrons/protocol_engine/state/_well_math.py +193 -0
  454. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  455. opentrons/protocol_engine/state/command_history.py +309 -0
  456. opentrons/protocol_engine/state/commands.py +1158 -0
  457. opentrons/protocol_engine/state/config.py +39 -0
  458. opentrons/protocol_engine/state/files.py +57 -0
  459. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  460. opentrons/protocol_engine/state/geometry.py +2359 -0
  461. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  462. opentrons/protocol_engine/state/labware.py +1459 -0
  463. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  464. opentrons/protocol_engine/state/liquids.py +73 -0
  465. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  466. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  467. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  468. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  469. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  471. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  472. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  473. opentrons/protocol_engine/state/modules.py +1500 -0
  474. opentrons/protocol_engine/state/motion.py +373 -0
  475. opentrons/protocol_engine/state/pipettes.py +905 -0
  476. opentrons/protocol_engine/state/state.py +421 -0
  477. opentrons/protocol_engine/state/state_summary.py +36 -0
  478. opentrons/protocol_engine/state/tips.py +420 -0
  479. opentrons/protocol_engine/state/update_types.py +904 -0
  480. opentrons/protocol_engine/state/wells.py +290 -0
  481. opentrons/protocol_engine/types/__init__.py +308 -0
  482. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  483. opentrons/protocol_engine/types/command_annotations.py +53 -0
  484. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  485. opentrons/protocol_engine/types/execution.py +96 -0
  486. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  487. opentrons/protocol_engine/types/instrument.py +47 -0
  488. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  489. opentrons/protocol_engine/types/labware.py +131 -0
  490. opentrons/protocol_engine/types/labware_movement.py +22 -0
  491. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  492. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  493. opentrons/protocol_engine/types/liquid.py +40 -0
  494. opentrons/protocol_engine/types/liquid_class.py +59 -0
  495. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  496. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  497. opentrons/protocol_engine/types/location.py +194 -0
  498. opentrons/protocol_engine/types/module.py +303 -0
  499. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  500. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  501. opentrons/protocol_engine/types/tip.py +18 -0
  502. opentrons/protocol_engine/types/util.py +21 -0
  503. opentrons/protocol_engine/types/well_position.py +124 -0
  504. opentrons/protocol_reader/__init__.py +37 -0
  505. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  506. opentrons/protocol_reader/file_format_validator.py +152 -0
  507. opentrons/protocol_reader/file_hasher.py +27 -0
  508. opentrons/protocol_reader/file_identifier.py +284 -0
  509. opentrons/protocol_reader/file_reader_writer.py +90 -0
  510. opentrons/protocol_reader/input_file.py +16 -0
  511. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  512. opentrons/protocol_reader/protocol_reader.py +188 -0
  513. opentrons/protocol_reader/protocol_source.py +124 -0
  514. opentrons/protocol_reader/role_analyzer.py +86 -0
  515. opentrons/protocol_runner/__init__.py +26 -0
  516. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  517. opentrons/protocol_runner/json_file_reader.py +55 -0
  518. opentrons/protocol_runner/json_translator.py +314 -0
  519. opentrons/protocol_runner/legacy_command_mapper.py +848 -0
  520. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  521. opentrons/protocol_runner/protocol_runner.py +530 -0
  522. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  523. opentrons/protocol_runner/run_orchestrator.py +496 -0
  524. opentrons/protocol_runner/task_queue.py +95 -0
  525. opentrons/protocols/__init__.py +6 -0
  526. opentrons/protocols/advanced_control/__init__.py +0 -0
  527. opentrons/protocols/advanced_control/common.py +38 -0
  528. opentrons/protocols/advanced_control/mix.py +60 -0
  529. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  530. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  531. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  532. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  533. opentrons/protocols/api_support/__init__.py +0 -0
  534. opentrons/protocols/api_support/constants.py +8 -0
  535. opentrons/protocols/api_support/deck_type.py +110 -0
  536. opentrons/protocols/api_support/definitions.py +18 -0
  537. opentrons/protocols/api_support/instrument.py +151 -0
  538. opentrons/protocols/api_support/labware_like.py +233 -0
  539. opentrons/protocols/api_support/tip_tracker.py +175 -0
  540. opentrons/protocols/api_support/types.py +32 -0
  541. opentrons/protocols/api_support/util.py +403 -0
  542. opentrons/protocols/bundle.py +89 -0
  543. opentrons/protocols/duration/__init__.py +4 -0
  544. opentrons/protocols/duration/errors.py +5 -0
  545. opentrons/protocols/duration/estimator.py +628 -0
  546. opentrons/protocols/execution/__init__.py +0 -0
  547. opentrons/protocols/execution/dev_types.py +181 -0
  548. opentrons/protocols/execution/errors.py +40 -0
  549. opentrons/protocols/execution/execute.py +84 -0
  550. opentrons/protocols/execution/execute_json_v3.py +275 -0
  551. opentrons/protocols/execution/execute_json_v4.py +359 -0
  552. opentrons/protocols/execution/execute_json_v5.py +28 -0
  553. opentrons/protocols/execution/execute_python.py +169 -0
  554. opentrons/protocols/execution/json_dispatchers.py +87 -0
  555. opentrons/protocols/execution/types.py +7 -0
  556. opentrons/protocols/geometry/__init__.py +0 -0
  557. opentrons/protocols/geometry/planning.py +297 -0
  558. opentrons/protocols/labware.py +312 -0
  559. opentrons/protocols/models/__init__.py +0 -0
  560. opentrons/protocols/models/json_protocol.py +679 -0
  561. opentrons/protocols/parameters/__init__.py +0 -0
  562. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  563. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  564. opentrons/protocols/parameters/exceptions.py +34 -0
  565. opentrons/protocols/parameters/parameter_definition.py +272 -0
  566. opentrons/protocols/parameters/types.py +17 -0
  567. opentrons/protocols/parameters/validation.py +267 -0
  568. opentrons/protocols/parse.py +671 -0
  569. opentrons/protocols/types.py +159 -0
  570. opentrons/py.typed +0 -0
  571. opentrons/resources/scripts/lpc21isp +0 -0
  572. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  573. opentrons/simulate.py +1065 -0
  574. opentrons/system/__init__.py +6 -0
  575. opentrons/system/camera.py +51 -0
  576. opentrons/system/log_control.py +59 -0
  577. opentrons/system/nmcli.py +856 -0
  578. opentrons/system/resin.py +24 -0
  579. opentrons/system/smoothie_update.py +15 -0
  580. opentrons/system/wifi.py +204 -0
  581. opentrons/tools/__init__.py +0 -0
  582. opentrons/tools/args_handler.py +22 -0
  583. opentrons/tools/write_pipette_memory.py +157 -0
  584. opentrons/types.py +618 -0
  585. opentrons/util/__init__.py +1 -0
  586. opentrons/util/async_helpers.py +166 -0
  587. opentrons/util/broker.py +84 -0
  588. opentrons/util/change_notifier.py +47 -0
  589. opentrons/util/entrypoint_util.py +278 -0
  590. opentrons/util/get_union_elements.py +26 -0
  591. opentrons/util/helpers.py +6 -0
  592. opentrons/util/linal.py +178 -0
  593. opentrons/util/logging_config.py +265 -0
  594. opentrons/util/logging_queue_handler.py +61 -0
  595. opentrons/util/performance_helpers.py +157 -0
  596. opentrons-8.6.0a1.dist-info/METADATA +37 -0
  597. opentrons-8.6.0a1.dist-info/RECORD +600 -0
  598. opentrons-8.6.0a1.dist-info/WHEEL +4 -0
  599. opentrons-8.6.0a1.dist-info/entry_points.txt +3 -0
  600. opentrons-8.6.0a1.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,176 @@
1
+ """Move to addressable area command request, result, and implementation models."""
2
+ from __future__ import annotations
3
+ from pydantic import Field
4
+ from typing import TYPE_CHECKING, Optional, Type
5
+ from typing_extensions import Literal
6
+
7
+ from opentrons_shared_data.pipette.types import PipetteNameType
8
+
9
+ from ..errors import LocationNotAccessibleByPipetteError
10
+ from ..types import AddressableOffsetVector
11
+ from ..resources import fixture_validation
12
+ from .pipetting_common import (
13
+ PipetteIdMixin,
14
+ )
15
+ from .movement_common import (
16
+ MovementMixin,
17
+ DestinationPositionResult,
18
+ move_to_addressable_area,
19
+ StallOrCollisionError,
20
+ )
21
+ from .command import (
22
+ AbstractCommandImpl,
23
+ BaseCommand,
24
+ BaseCommandCreate,
25
+ SuccessData,
26
+ DefinedErrorData,
27
+ )
28
+
29
+ if TYPE_CHECKING:
30
+ from ..execution import MovementHandler
31
+ from ..state.state import StateView
32
+ from ..resources.model_utils import ModelUtils
33
+
34
+ MoveToAddressableAreaCommandType = Literal["moveToAddressableArea"]
35
+
36
+
37
+ class MoveToAddressableAreaParams(PipetteIdMixin, MovementMixin):
38
+ """Payload required to move a pipette to a specific addressable area.
39
+
40
+ An *addressable area* is a space in the robot that may or may not be usable depending on how
41
+ the robot's deck is configured. For example, if a Flex is configured with a waste chute, it will
42
+ have additional addressable areas representing the opening of the waste chute, where tips and
43
+ labware can be dropped.
44
+
45
+ This moves the pipette so all of its nozzles are centered over the addressable area.
46
+ If the pipette is currently configured with a partial tip layout, this centering is over all
47
+ the pipette's physical nozzles, not just the nozzles that are active.
48
+
49
+ The z-position will be chosen to put the bottom of the tips---or the bottom of the nozzles,
50
+ if there are no tips---level with the top of the addressable area.
51
+
52
+ When this command is executed, Protocol Engine will make sure the robot's deck is configured
53
+ such that the requested addressable area actually exists. For example, if you request
54
+ the addressable area B4, it will make sure the robot is set up with a B3/B4 staging area slot.
55
+ If that's not the case, the command will fail.
56
+ """
57
+
58
+ addressableAreaName: str = Field(
59
+ ...,
60
+ description=(
61
+ "The name of the addressable area that you want to use."
62
+ " Valid values are the `id`s of `addressableArea`s in the"
63
+ " [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)."
64
+ ),
65
+ )
66
+ offset: AddressableOffsetVector = Field(
67
+ AddressableOffsetVector(x=0, y=0, z=0),
68
+ description="Relative offset of addressable area to move pipette's critical point.",
69
+ )
70
+ stayAtHighestPossibleZ: bool = Field(
71
+ False,
72
+ description=(
73
+ "If `true`, the pipette will retract to its highest possible height"
74
+ " and stay there instead of descending to the destination."
75
+ " `minimumZHeight` will be ignored."
76
+ ),
77
+ )
78
+
79
+
80
+ class MoveToAddressableAreaResult(DestinationPositionResult):
81
+ """Result data from the execution of a MoveToAddressableArea command."""
82
+
83
+ pass
84
+
85
+
86
+ _ExecuteReturn = (
87
+ SuccessData[MoveToAddressableAreaResult] | DefinedErrorData[StallOrCollisionError]
88
+ )
89
+
90
+
91
+ class MoveToAddressableAreaImplementation(
92
+ AbstractCommandImpl[MoveToAddressableAreaParams, _ExecuteReturn]
93
+ ):
94
+ """Move to addressable area command implementation."""
95
+
96
+ def __init__(
97
+ self,
98
+ movement: MovementHandler,
99
+ state_view: StateView,
100
+ model_utils: ModelUtils,
101
+ **kwargs: object,
102
+ ) -> None:
103
+ self._movement = movement
104
+ self._state_view = state_view
105
+ self._model_utils = model_utils
106
+
107
+ async def execute(self, params: MoveToAddressableAreaParams) -> _ExecuteReturn:
108
+ """Move the requested pipette to the requested addressable area."""
109
+ self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
110
+ params.addressableAreaName
111
+ )
112
+ loaded_pipette = self._state_view.pipettes.get(params.pipetteId)
113
+ if loaded_pipette.pipetteName in (
114
+ PipetteNameType.P10_SINGLE,
115
+ PipetteNameType.P10_MULTI,
116
+ PipetteNameType.P50_MULTI,
117
+ PipetteNameType.P50_SINGLE,
118
+ PipetteNameType.P300_SINGLE,
119
+ PipetteNameType.P300_MULTI,
120
+ PipetteNameType.P1000_SINGLE,
121
+ ):
122
+ extra_z_offset: Optional[float] = 5.0
123
+ else:
124
+ extra_z_offset = None
125
+
126
+ if fixture_validation.is_staging_slot(params.addressableAreaName):
127
+ raise LocationNotAccessibleByPipetteError(
128
+ f"Cannot move pipette to staging slot {params.addressableAreaName}"
129
+ )
130
+
131
+ result = await move_to_addressable_area(
132
+ movement=self._movement,
133
+ model_utils=self._model_utils,
134
+ pipette_id=params.pipetteId,
135
+ addressable_area_name=params.addressableAreaName,
136
+ offset=params.offset,
137
+ force_direct=params.forceDirect,
138
+ minimum_z_height=params.minimumZHeight,
139
+ speed=params.speed,
140
+ stay_at_highest_possible_z=params.stayAtHighestPossibleZ,
141
+ highest_possible_z_extra_offset=extra_z_offset,
142
+ )
143
+ if isinstance(result, DefinedErrorData):
144
+ return result
145
+ else:
146
+ return SuccessData(
147
+ public=MoveToAddressableAreaResult(position=result.public.position),
148
+ state_update=result.state_update,
149
+ )
150
+
151
+
152
+ class MoveToAddressableArea(
153
+ BaseCommand[
154
+ MoveToAddressableAreaParams,
155
+ MoveToAddressableAreaResult,
156
+ StallOrCollisionError,
157
+ ]
158
+ ):
159
+ """Move to addressable area command model."""
160
+
161
+ commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea"
162
+ params: MoveToAddressableAreaParams
163
+ result: Optional[MoveToAddressableAreaResult] = None
164
+
165
+ _ImplementationCls: Type[
166
+ MoveToAddressableAreaImplementation
167
+ ] = MoveToAddressableAreaImplementation
168
+
169
+
170
+ class MoveToAddressableAreaCreate(BaseCommandCreate[MoveToAddressableAreaParams]):
171
+ """Move to addressable area command creation request model."""
172
+
173
+ commandType: MoveToAddressableAreaCommandType = "moveToAddressableArea"
174
+ params: MoveToAddressableAreaParams
175
+
176
+ _CommandCls: Type[MoveToAddressableArea] = MoveToAddressableArea
@@ -0,0 +1,198 @@
1
+ """Move to addressable area for drop tip command request, result, and implementation models."""
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING, Optional, Type, Any
4
+ from typing_extensions import Literal
5
+
6
+ from pydantic import Field
7
+ from pydantic.json_schema import SkipJsonSchema
8
+
9
+ from ..errors import LocationNotAccessibleByPipetteError
10
+ from ..types import AddressableOffsetVector
11
+ from ..resources import fixture_validation
12
+ from .pipetting_common import (
13
+ PipetteIdMixin,
14
+ )
15
+ from .movement_common import (
16
+ MovementMixin,
17
+ DestinationPositionResult,
18
+ move_to_addressable_area,
19
+ StallOrCollisionError,
20
+ )
21
+ from .command import (
22
+ AbstractCommandImpl,
23
+ BaseCommand,
24
+ BaseCommandCreate,
25
+ SuccessData,
26
+ DefinedErrorData,
27
+ )
28
+
29
+ if TYPE_CHECKING:
30
+ from ..execution import MovementHandler
31
+ from ..state.state import StateView
32
+ from ..resources.model_utils import ModelUtils
33
+
34
+ MoveToAddressableAreaForDropTipCommandType = Literal["moveToAddressableAreaForDropTip"]
35
+
36
+
37
+ def _remove_default(s: dict[str, Any]) -> None:
38
+ s.pop("default", None)
39
+
40
+
41
+ class MoveToAddressableAreaForDropTipParams(PipetteIdMixin, MovementMixin):
42
+ """Payload required to move a pipette to a specific addressable area.
43
+
44
+ An *addressable area* is a space in the robot that may or may not be usable depending on how
45
+ the robot's deck is configured. For example, if a Flex is configured with a waste chute, it will
46
+ have additional addressable areas representing the opening of the waste chute, where tips and
47
+ labware can be dropped.
48
+
49
+ This moves the pipette so all of its nozzles are centered over the addressable area.
50
+ If the pipette is currently configured with a partial tip layout, this centering is over all
51
+ the pipette's physical nozzles, not just the nozzles that are active.
52
+
53
+ The z-position will be chosen to put the bottom of the tips---or the bottom of the nozzles,
54
+ if there are no tips---level with the top of the addressable area.
55
+
56
+ When this command is executed, Protocol Engine will make sure the robot's deck is configured
57
+ such that the requested addressable area actually exists. For example, if you request
58
+ the addressable area B4, it will make sure the robot is set up with a B3/B4 staging area slot.
59
+ If that's not the case, the command will fail.
60
+ """
61
+
62
+ addressableAreaName: str = Field(
63
+ ...,
64
+ description=(
65
+ "The name of the addressable area that you want to use."
66
+ " Valid values are the `id`s of `addressableArea`s in the"
67
+ " [deck definition](https://github.com/Opentrons/opentrons/tree/edge/shared-data/deck)."
68
+ ),
69
+ )
70
+ offset: AddressableOffsetVector = Field(
71
+ AddressableOffsetVector(x=0, y=0, z=0),
72
+ description="Relative offset of addressable area to move pipette's critical point.",
73
+ )
74
+ alternateDropLocation: bool | SkipJsonSchema[None] = Field(
75
+ False,
76
+ description=(
77
+ "Whether to alternate location where tip is dropped within the addressable area."
78
+ " If True, this command will ignore the offset provided and alternate"
79
+ " between dropping tips at two predetermined locations inside the specified"
80
+ " labware well."
81
+ " If False, the tip will be dropped at the top center of the area."
82
+ ),
83
+ json_schema_extra=_remove_default,
84
+ )
85
+ ignoreTipConfiguration: bool | SkipJsonSchema[None] = Field(
86
+ True,
87
+ description=(
88
+ "Whether to utilize the critical point of the tip configuraiton when moving to an addressable area."
89
+ " If True, this command will ignore the tip configuration and use the center of the entire instrument"
90
+ " as the critical point for movement."
91
+ " If False, this command will use the critical point provided by the current tip configuration."
92
+ ),
93
+ json_schema_extra=_remove_default,
94
+ )
95
+
96
+
97
+ class MoveToAddressableAreaForDropTipResult(DestinationPositionResult):
98
+ """Result data from the execution of a MoveToAddressableAreaForDropTip command."""
99
+
100
+ pass
101
+
102
+
103
+ _ExecuteReturn = (
104
+ SuccessData[MoveToAddressableAreaForDropTipResult]
105
+ | DefinedErrorData[StallOrCollisionError]
106
+ )
107
+
108
+
109
+ class MoveToAddressableAreaForDropTipImplementation(
110
+ AbstractCommandImpl[MoveToAddressableAreaForDropTipParams, _ExecuteReturn]
111
+ ):
112
+ """Move to addressable area for drop tip command implementation."""
113
+
114
+ def __init__(
115
+ self,
116
+ movement: MovementHandler,
117
+ state_view: StateView,
118
+ model_utils: ModelUtils,
119
+ **kwargs: object,
120
+ ) -> None:
121
+ self._movement = movement
122
+ self._state_view = state_view
123
+ self._model_utils = model_utils
124
+
125
+ async def execute(
126
+ self, params: MoveToAddressableAreaForDropTipParams
127
+ ) -> _ExecuteReturn:
128
+ """Move the requested pipette to the requested addressable area in preperation of a drop tip."""
129
+ self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
130
+ params.addressableAreaName
131
+ )
132
+
133
+ if fixture_validation.is_staging_slot(params.addressableAreaName):
134
+ raise LocationNotAccessibleByPipetteError(
135
+ f"Cannot move pipette to staging slot {params.addressableAreaName}"
136
+ )
137
+
138
+ if params.alternateDropLocation:
139
+ offset = self._state_view.geometry.get_next_tip_drop_location_for_addressable_area(
140
+ addressable_area_name=params.addressableAreaName,
141
+ pipette_id=params.pipetteId,
142
+ )
143
+ else:
144
+ offset = params.offset
145
+
146
+ result = await move_to_addressable_area(
147
+ movement=self._movement,
148
+ model_utils=self._model_utils,
149
+ pipette_id=params.pipetteId,
150
+ addressable_area_name=params.addressableAreaName,
151
+ offset=offset,
152
+ force_direct=params.forceDirect,
153
+ minimum_z_height=params.minimumZHeight,
154
+ speed=params.speed,
155
+ ignore_tip_configuration=params.ignoreTipConfiguration,
156
+ )
157
+ if isinstance(result, DefinedErrorData):
158
+ return result
159
+ else:
160
+ return SuccessData(
161
+ public=MoveToAddressableAreaForDropTipResult(
162
+ position=result.public.position,
163
+ ),
164
+ state_update=result.state_update,
165
+ )
166
+
167
+
168
+ class MoveToAddressableAreaForDropTip(
169
+ BaseCommand[
170
+ MoveToAddressableAreaForDropTipParams,
171
+ MoveToAddressableAreaForDropTipResult,
172
+ StallOrCollisionError,
173
+ ]
174
+ ):
175
+ """Move to addressable area for drop tip command model."""
176
+
177
+ commandType: MoveToAddressableAreaForDropTipCommandType = (
178
+ "moveToAddressableAreaForDropTip"
179
+ )
180
+ params: MoveToAddressableAreaForDropTipParams
181
+ result: Optional[MoveToAddressableAreaForDropTipResult] = None
182
+
183
+ _ImplementationCls: Type[
184
+ MoveToAddressableAreaForDropTipImplementation
185
+ ] = MoveToAddressableAreaForDropTipImplementation
186
+
187
+
188
+ class MoveToAddressableAreaForDropTipCreate(
189
+ BaseCommandCreate[MoveToAddressableAreaForDropTipParams]
190
+ ):
191
+ """Move to addressable area for drop tip command creation request model."""
192
+
193
+ commandType: MoveToAddressableAreaForDropTipCommandType = (
194
+ "moveToAddressableAreaForDropTip"
195
+ )
196
+ params: MoveToAddressableAreaForDropTipParams
197
+
198
+ _CommandCls: Type[MoveToAddressableAreaForDropTip] = MoveToAddressableAreaForDropTip
@@ -0,0 +1,107 @@
1
+ """Move to coordinates command request, result, and implementation models."""
2
+ from __future__ import annotations
3
+
4
+ from pydantic import Field
5
+ from typing import Optional, Type, TYPE_CHECKING
6
+ from typing_extensions import Literal
7
+
8
+
9
+ from ..types import DeckPoint
10
+ from .pipetting_common import PipetteIdMixin
11
+ from .movement_common import (
12
+ MovementMixin,
13
+ DestinationPositionResult,
14
+ move_to_coordinates,
15
+ StallOrCollisionError,
16
+ )
17
+ from .command import (
18
+ AbstractCommandImpl,
19
+ BaseCommand,
20
+ BaseCommandCreate,
21
+ SuccessData,
22
+ DefinedErrorData,
23
+ )
24
+
25
+ if TYPE_CHECKING:
26
+ from ..execution import MovementHandler
27
+ from ..resources.model_utils import ModelUtils
28
+
29
+
30
+ MoveToCoordinatesCommandType = Literal["moveToCoordinates"]
31
+
32
+
33
+ class MoveToCoordinatesParams(PipetteIdMixin, MovementMixin):
34
+ """Payload required to move a pipette to coordinates."""
35
+
36
+ coordinates: DeckPoint = Field(
37
+ ...,
38
+ description="X, Y and Z coordinates in mm from deck's origin location (left-front-bottom corner of work space)",
39
+ )
40
+
41
+
42
+ class MoveToCoordinatesResult(DestinationPositionResult):
43
+ """Result data from the execution of a MoveToCoordinates command."""
44
+
45
+ pass
46
+
47
+
48
+ _ExecuteReturn = (
49
+ SuccessData[MoveToCoordinatesResult] | DefinedErrorData[StallOrCollisionError]
50
+ )
51
+
52
+
53
+ class MoveToCoordinatesImplementation(
54
+ AbstractCommandImpl[MoveToCoordinatesParams, _ExecuteReturn]
55
+ ):
56
+ """Move to coordinates command implementation."""
57
+
58
+ def __init__(
59
+ self,
60
+ movement: MovementHandler,
61
+ model_utils: ModelUtils,
62
+ **kwargs: object,
63
+ ) -> None:
64
+ self._movement = movement
65
+ self._model_utils = model_utils
66
+
67
+ async def execute(self, params: MoveToCoordinatesParams) -> _ExecuteReturn:
68
+ """Move the requested pipette to the requested coordinates."""
69
+ result = await move_to_coordinates(
70
+ movement=self._movement,
71
+ model_utils=self._model_utils,
72
+ pipette_id=params.pipetteId,
73
+ deck_coordinates=params.coordinates,
74
+ direct=params.forceDirect,
75
+ additional_min_travel_z=params.minimumZHeight,
76
+ speed=params.speed,
77
+ )
78
+ if isinstance(result, DefinedErrorData):
79
+ return result
80
+ else:
81
+ return SuccessData(
82
+ public=MoveToCoordinatesResult(position=result.public.position),
83
+ state_update=result.state_update,
84
+ )
85
+
86
+
87
+ class MoveToCoordinates(
88
+ BaseCommand[MoveToCoordinatesParams, MoveToCoordinatesResult, StallOrCollisionError]
89
+ ):
90
+ """Move to well command model."""
91
+
92
+ commandType: MoveToCoordinatesCommandType = "moveToCoordinates"
93
+ params: MoveToCoordinatesParams
94
+ result: Optional[MoveToCoordinatesResult] = None
95
+
96
+ _ImplementationCls: Type[
97
+ MoveToCoordinatesImplementation
98
+ ] = MoveToCoordinatesImplementation
99
+
100
+
101
+ class MoveToCoordinatesCreate(BaseCommandCreate[MoveToCoordinatesParams]):
102
+ """Move to coordinates command creation request model."""
103
+
104
+ commandType: MoveToCoordinatesCommandType = "moveToCoordinates"
105
+ params: MoveToCoordinatesParams
106
+
107
+ _CommandCls: Type[MoveToCoordinates] = MoveToCoordinates
@@ -0,0 +1,119 @@
1
+ """Move to well command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type
5
+ from typing_extensions import Literal
6
+
7
+ from .pipetting_common import (
8
+ PipetteIdMixin,
9
+ )
10
+ from .movement_common import (
11
+ LiquidHandlingWellLocationMixin,
12
+ MovementMixin,
13
+ DestinationPositionResult,
14
+ StallOrCollisionError,
15
+ move_to_well,
16
+ )
17
+ from .command import (
18
+ AbstractCommandImpl,
19
+ BaseCommand,
20
+ BaseCommandCreate,
21
+ SuccessData,
22
+ DefinedErrorData,
23
+ )
24
+
25
+ if TYPE_CHECKING:
26
+ from ..execution import MovementHandler
27
+ from ..state.state import StateView
28
+ from ..resources.model_utils import ModelUtils
29
+
30
+ MoveToWellCommandType = Literal["moveToWell"]
31
+
32
+
33
+ class MoveToWellParams(PipetteIdMixin, LiquidHandlingWellLocationMixin, MovementMixin):
34
+ """Payload required to move a pipette to a specific well."""
35
+
36
+ pass
37
+
38
+
39
+ class MoveToWellResult(DestinationPositionResult):
40
+ """Result data from the execution of a MoveToWell command."""
41
+
42
+ pass
43
+
44
+
45
+ class MoveToWellImplementation(
46
+ AbstractCommandImpl[
47
+ MoveToWellParams,
48
+ SuccessData[MoveToWellResult] | DefinedErrorData[StallOrCollisionError],
49
+ ]
50
+ ):
51
+ """Move to well command implementation."""
52
+
53
+ def __init__(
54
+ self,
55
+ state_view: StateView,
56
+ movement: MovementHandler,
57
+ model_utils: ModelUtils,
58
+ **kwargs: object,
59
+ ) -> None:
60
+ self._state_view = state_view
61
+ self._movement = movement
62
+ self._model_utils = model_utils
63
+
64
+ async def execute(
65
+ self, params: MoveToWellParams
66
+ ) -> SuccessData[MoveToWellResult] | DefinedErrorData[StallOrCollisionError]:
67
+ """Move the requested pipette to the requested well."""
68
+ pipette_id = params.pipetteId
69
+ labware_id = params.labwareId
70
+ well_name = params.wellName
71
+ well_location = params.wellLocation
72
+ # TODO(cm): implement move_to_well with meniscus + volume offset
73
+ if well_location.volumeOffset:
74
+ if (
75
+ well_location.volumeOffset != 0
76
+ and well_location.volumeOffset != "operationVolume"
77
+ ):
78
+ raise ValueError("volume offset not supported with MoveToWell")
79
+
80
+ move_result = await move_to_well(
81
+ model_utils=self._model_utils,
82
+ movement=self._movement,
83
+ pipette_id=pipette_id,
84
+ labware_id=labware_id,
85
+ well_name=well_name,
86
+ well_location=well_location,
87
+ force_direct=params.forceDirect,
88
+ minimum_z_height=params.minimumZHeight,
89
+ speed=params.speed,
90
+ operation_volume=None,
91
+ )
92
+ if isinstance(move_result, DefinedErrorData):
93
+ return move_result
94
+ else:
95
+ return SuccessData(
96
+ public=MoveToWellResult(position=move_result.public.position),
97
+ state_update=move_result.state_update,
98
+ )
99
+
100
+
101
+ class MoveToWell(
102
+ BaseCommand[MoveToWellParams, MoveToWellResult, StallOrCollisionError]
103
+ ):
104
+ """Move to well command model."""
105
+
106
+ commandType: MoveToWellCommandType = "moveToWell"
107
+ params: MoveToWellParams
108
+ result: Optional[MoveToWellResult] = None
109
+
110
+ _ImplementationCls: Type[MoveToWellImplementation] = MoveToWellImplementation
111
+
112
+
113
+ class MoveToWellCreate(BaseCommandCreate[MoveToWellParams]):
114
+ """Move to well command creation request model."""
115
+
116
+ commandType: MoveToWellCommandType = "moveToWell"
117
+ params: MoveToWellParams
118
+
119
+ _CommandCls: Type[MoveToWell] = MoveToWell