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,184 @@
1
+ """Aspirate in place command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type, Union
5
+ from typing_extensions import Literal
6
+
7
+ from opentrons.hardware_control import HardwareControlAPI
8
+
9
+ from .pipetting_common import (
10
+ PipetteIdMixin,
11
+ AspirateVolumeMixin,
12
+ FlowRateMixin,
13
+ BaseLiquidHandlingResult,
14
+ OverpressureError,
15
+ aspirate_in_place,
16
+ DEFAULT_CORRECTION_VOLUME,
17
+ )
18
+ from .command import (
19
+ AbstractCommandImpl,
20
+ BaseCommand,
21
+ BaseCommandCreate,
22
+ SuccessData,
23
+ DefinedErrorData,
24
+ )
25
+ from ..errors.exceptions import PipetteNotReadyToAspirateError
26
+ from ..state.update_types import CLEAR
27
+ from ..types import CurrentWell
28
+
29
+ if TYPE_CHECKING:
30
+ from ..execution import PipettingHandler, GantryMover
31
+ from ..resources import ModelUtils
32
+ from ..state.state import StateView
33
+ from ..notes import CommandNoteAdder
34
+
35
+ AspirateInPlaceCommandType = Literal["aspirateInPlace"]
36
+
37
+
38
+ class AspirateInPlaceParams(PipetteIdMixin, AspirateVolumeMixin, FlowRateMixin):
39
+ """Payload required to aspirate in place."""
40
+
41
+ pass
42
+
43
+
44
+ class AspirateInPlaceResult(BaseLiquidHandlingResult):
45
+ """Result data from the execution of a AspirateInPlace command."""
46
+
47
+ pass
48
+
49
+
50
+ _ExecuteReturn = Union[
51
+ SuccessData[AspirateInPlaceResult],
52
+ DefinedErrorData[OverpressureError],
53
+ ]
54
+
55
+
56
+ class AspirateInPlaceImplementation(
57
+ AbstractCommandImpl[AspirateInPlaceParams, _ExecuteReturn]
58
+ ):
59
+ """AspirateInPlace command implementation."""
60
+
61
+ def __init__(
62
+ self,
63
+ pipetting: PipettingHandler,
64
+ hardware_api: HardwareControlAPI,
65
+ state_view: StateView,
66
+ command_note_adder: CommandNoteAdder,
67
+ model_utils: ModelUtils,
68
+ gantry_mover: GantryMover,
69
+ **kwargs: object,
70
+ ) -> None:
71
+ self._pipetting = pipetting
72
+ self._state_view = state_view
73
+ self._hardware_api = hardware_api
74
+ self._command_note_adder = command_note_adder
75
+ self._model_utils = model_utils
76
+ self._gantry_mover = gantry_mover
77
+
78
+ async def execute(self, params: AspirateInPlaceParams) -> _ExecuteReturn:
79
+ """Aspirate without moving the pipette.
80
+
81
+ Raises:
82
+ TipNotAttachedError: if no tip is attached to the pipette.
83
+ PipetteNotReadyToAspirateError: pipette plunger is not ready.
84
+ """
85
+ ready_to_aspirate = self._pipetting.get_is_ready_to_aspirate(
86
+ pipette_id=params.pipetteId
87
+ )
88
+ if not ready_to_aspirate:
89
+ raise PipetteNotReadyToAspirateError(
90
+ "Pipette cannot aspirate in place because a previous dispense or blowout"
91
+ " pushed the plunger beyond the bottom position."
92
+ " The subsequent aspirate must be from a specific well so the plunger"
93
+ " can be reset in a known safe position."
94
+ )
95
+
96
+ current_position = await self._gantry_mover.get_position(params.pipetteId)
97
+ current_location = self._state_view.pipettes.get_current_location()
98
+
99
+ result = await aspirate_in_place(
100
+ pipette_id=params.pipetteId,
101
+ volume=params.volume,
102
+ flow_rate=params.flowRate,
103
+ location_if_error={
104
+ "retryLocation": (
105
+ current_position.x,
106
+ current_position.y,
107
+ current_position.z,
108
+ )
109
+ },
110
+ command_note_adder=self._command_note_adder,
111
+ pipetting=self._pipetting,
112
+ model_utils=self._model_utils,
113
+ correction_volume=params.correctionVolume or DEFAULT_CORRECTION_VOLUME,
114
+ )
115
+ if isinstance(result, DefinedErrorData):
116
+ if (
117
+ isinstance(current_location, CurrentWell)
118
+ and current_location.pipette_id == params.pipetteId
119
+ ):
120
+ return DefinedErrorData(
121
+ public=result.public,
122
+ state_update=result.state_update.set_liquid_operated(
123
+ labware_id=current_location.labware_id,
124
+ well_names=self._state_view.geometry.get_wells_covered_by_pipette_with_active_well(
125
+ current_location.labware_id,
126
+ current_location.well_name,
127
+ params.pipetteId,
128
+ ),
129
+ volume_added=CLEAR,
130
+ ),
131
+ state_update_if_false_positive=result.state_update_if_false_positive,
132
+ )
133
+ else:
134
+ return result
135
+ else:
136
+ if (
137
+ isinstance(current_location, CurrentWell)
138
+ and current_location.pipette_id == params.pipetteId
139
+ ):
140
+ return SuccessData(
141
+ public=AspirateInPlaceResult(volume=result.public.volume),
142
+ state_update=result.state_update.set_liquid_operated(
143
+ labware_id=current_location.labware_id,
144
+ well_names=self._state_view.geometry.get_wells_covered_by_pipette_with_active_well(
145
+ current_location.labware_id,
146
+ current_location.well_name,
147
+ params.pipetteId,
148
+ ),
149
+ volume_added=-result.public.volume
150
+ * self._state_view.geometry.get_nozzles_per_well(
151
+ current_location.labware_id,
152
+ current_location.well_name,
153
+ params.pipetteId,
154
+ ),
155
+ ),
156
+ )
157
+ else:
158
+ return SuccessData(
159
+ public=AspirateInPlaceResult(volume=result.public.volume),
160
+ state_update=result.state_update,
161
+ )
162
+
163
+
164
+ class AspirateInPlace(
165
+ BaseCommand[AspirateInPlaceParams, AspirateInPlaceResult, OverpressureError]
166
+ ):
167
+ """AspirateInPlace command model."""
168
+
169
+ commandType: AspirateInPlaceCommandType = "aspirateInPlace"
170
+ params: AspirateInPlaceParams
171
+ result: Optional[AspirateInPlaceResult] = None
172
+
173
+ _ImplementationCls: Type[
174
+ AspirateInPlaceImplementation
175
+ ] = AspirateInPlaceImplementation
176
+
177
+
178
+ class AspirateInPlaceCreate(BaseCommandCreate[AspirateInPlaceParams]):
179
+ """AspirateInPlace command request model."""
180
+
181
+ commandType: AspirateInPlaceCommandType = "aspirateInPlace"
182
+ params: AspirateInPlaceParams
183
+
184
+ _CommandCls: Type[AspirateInPlace] = AspirateInPlace
@@ -0,0 +1,211 @@
1
+ """Aspirate command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type, Union
5
+ from typing_extensions import Literal
6
+
7
+ from .pipetting_common import (
8
+ OverpressureError,
9
+ PipetteIdMixin,
10
+ AspirateVolumeMixin,
11
+ FlowRateMixin,
12
+ BaseLiquidHandlingResult,
13
+ aspirate_while_tracking,
14
+ )
15
+ from .movement_common import (
16
+ LiquidHandlingWellLocationMixin,
17
+ DestinationPositionResult,
18
+ StallOrCollisionError,
19
+ move_to_well,
20
+ )
21
+ from .command import (
22
+ AbstractCommandImpl,
23
+ BaseCommand,
24
+ BaseCommandCreate,
25
+ DefinedErrorData,
26
+ SuccessData,
27
+ )
28
+ from ..state.update_types import StateUpdate
29
+ from ..errors.exceptions import PipetteNotReadyToAspirateError
30
+ from opentrons.hardware_control import HardwareControlAPI
31
+ from ..state.update_types import CLEAR
32
+ from ..types import DeckPoint
33
+
34
+ if TYPE_CHECKING:
35
+ from ..execution import PipettingHandler, GantryMover, MovementHandler
36
+ from ..resources import ModelUtils
37
+ from ..state.state import StateView
38
+ from ..notes import CommandNoteAdder
39
+
40
+
41
+ AspirateWhileTrackingCommandType = Literal["aspirateWhileTracking"]
42
+
43
+
44
+ class AspirateWhileTrackingParams(
45
+ PipetteIdMixin,
46
+ AspirateVolumeMixin,
47
+ FlowRateMixin,
48
+ LiquidHandlingWellLocationMixin,
49
+ ):
50
+ """Parameters required to aspirate from a specific well."""
51
+
52
+ pass
53
+
54
+
55
+ class AspirateWhileTrackingResult(BaseLiquidHandlingResult, DestinationPositionResult):
56
+ """Result data from execution of an Aspirate command."""
57
+
58
+ pass
59
+
60
+
61
+ _ExecuteReturn = Union[
62
+ SuccessData[AspirateWhileTrackingResult],
63
+ DefinedErrorData[OverpressureError] | DefinedErrorData[StallOrCollisionError],
64
+ ]
65
+
66
+
67
+ class AspirateWhileTrackingImplementation(
68
+ AbstractCommandImpl[AspirateWhileTrackingParams, _ExecuteReturn]
69
+ ):
70
+ """AspirateWhileTracking command implementation."""
71
+
72
+ def __init__(
73
+ self,
74
+ pipetting: PipettingHandler,
75
+ state_view: StateView,
76
+ hardware_api: HardwareControlAPI,
77
+ command_note_adder: CommandNoteAdder,
78
+ model_utils: ModelUtils,
79
+ gantry_mover: GantryMover,
80
+ movement: MovementHandler,
81
+ **kwargs: object,
82
+ ) -> None:
83
+ self._pipetting = pipetting
84
+ self._state_view = state_view
85
+ self._hardware_api = hardware_api
86
+ self._command_note_adder = command_note_adder
87
+ self._model_utils = model_utils
88
+ self._gantry_mover = gantry_mover
89
+ self._movement = movement
90
+
91
+ async def execute(self, params: AspirateWhileTrackingParams) -> _ExecuteReturn:
92
+ """Move to and aspirate from the requested well.
93
+
94
+ Raises:
95
+ TipNotAttachedError: if no tip is attached to the pipette.
96
+ PipetteNotReadyToAspirateError: pipette plunger is not ready.
97
+ """
98
+ ready_to_aspirate = self._state_view.pipettes.get_ready_to_aspirate(
99
+ pipette_id=params.pipetteId
100
+ )
101
+ if not ready_to_aspirate:
102
+ raise PipetteNotReadyToAspirateError(
103
+ "Pipette cannot aspirate while tracking because a previous dispense or"
104
+ " blowout pushed the plunger beyond the bottom position."
105
+ " The subsequent aspirate must be from a specific well so the plunger"
106
+ " can be reset in a known safe position."
107
+ )
108
+ state_update = StateUpdate()
109
+
110
+ move_result = await move_to_well(
111
+ movement=self._movement,
112
+ model_utils=self._model_utils,
113
+ pipette_id=params.pipetteId,
114
+ labware_id=params.labwareId,
115
+ well_name=params.wellName,
116
+ well_location=params.wellLocation,
117
+ operation_volume=-params.volume,
118
+ )
119
+ state_update.append(move_result.state_update)
120
+ if isinstance(move_result, DefinedErrorData):
121
+ return DefinedErrorData(
122
+ public=move_result.public, state_update=state_update
123
+ )
124
+
125
+ aspirate_result = await aspirate_while_tracking(
126
+ pipette_id=params.pipetteId,
127
+ labware_id=params.labwareId,
128
+ well_name=params.wellName,
129
+ volume=params.volume,
130
+ flow_rate=params.flowRate,
131
+ location_if_error={
132
+ "retryLocation": (
133
+ move_result.public.position.x,
134
+ move_result.public.position.y,
135
+ move_result.public.position.z,
136
+ )
137
+ },
138
+ command_note_adder=self._command_note_adder,
139
+ pipetting=self._pipetting,
140
+ model_utils=self._model_utils,
141
+ )
142
+ position_after_aspirate = await self._gantry_mover.get_position(
143
+ params.pipetteId
144
+ )
145
+ result_deck_point = DeckPoint.model_construct(
146
+ x=position_after_aspirate.x,
147
+ y=position_after_aspirate.y,
148
+ z=position_after_aspirate.z,
149
+ )
150
+ if isinstance(aspirate_result, DefinedErrorData):
151
+ return DefinedErrorData(
152
+ public=aspirate_result.public,
153
+ state_update=aspirate_result.state_update.set_liquid_operated(
154
+ labware_id=params.labwareId,
155
+ well_names=self._state_view.geometry.get_wells_covered_by_pipette_with_active_well(
156
+ params.labwareId,
157
+ params.wellName,
158
+ params.pipetteId,
159
+ ),
160
+ volume_added=CLEAR,
161
+ ),
162
+ state_update_if_false_positive=aspirate_result.state_update_if_false_positive,
163
+ )
164
+
165
+ return SuccessData(
166
+ public=AspirateWhileTrackingResult(
167
+ volume=aspirate_result.public.volume,
168
+ position=result_deck_point,
169
+ ),
170
+ state_update=aspirate_result.state_update.set_liquid_operated(
171
+ labware_id=params.labwareId,
172
+ well_names=self._state_view.geometry.get_wells_covered_by_pipette_with_active_well(
173
+ params.labwareId,
174
+ params.wellName,
175
+ params.pipetteId,
176
+ ),
177
+ volume_added=-aspirate_result.public.volume
178
+ * self._state_view.geometry.get_nozzles_per_well(
179
+ params.labwareId,
180
+ params.wellName,
181
+ params.pipetteId,
182
+ ),
183
+ ),
184
+ )
185
+
186
+
187
+ class AspirateWhileTracking(
188
+ BaseCommand[
189
+ AspirateWhileTrackingParams,
190
+ AspirateWhileTrackingResult,
191
+ OverpressureError | StallOrCollisionError,
192
+ ]
193
+ ):
194
+ """AspirateWhileTracking command model."""
195
+
196
+ commandType: AspirateWhileTrackingCommandType = "aspirateWhileTracking"
197
+ params: AspirateWhileTrackingParams
198
+ result: Optional[AspirateWhileTrackingResult] = None
199
+
200
+ _ImplementationCls: Type[
201
+ AspirateWhileTrackingImplementation
202
+ ] = AspirateWhileTrackingImplementation
203
+
204
+
205
+ class AspirateWhileTrackingCreate(BaseCommandCreate[AspirateWhileTrackingParams]):
206
+ """Create aspirateWhileTracking command request model."""
207
+
208
+ commandType: AspirateWhileTrackingCommandType = "aspirateWhileTracking"
209
+ params: AspirateWhileTrackingParams
210
+
211
+ _CommandCls: Type[AspirateWhileTracking] = AspirateWhileTracking
@@ -0,0 +1,146 @@
1
+ """Blow-out command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type, Union
5
+ from typing_extensions import Literal
6
+
7
+
8
+ from .pipetting_common import (
9
+ OverpressureError,
10
+ PipetteIdMixin,
11
+ FlowRateMixin,
12
+ blow_out_in_place,
13
+ )
14
+ from .movement_common import (
15
+ WellLocationMixin,
16
+ DestinationPositionResult,
17
+ move_to_well,
18
+ StallOrCollisionError,
19
+ )
20
+ from .command import (
21
+ AbstractCommandImpl,
22
+ BaseCommand,
23
+ BaseCommandCreate,
24
+ DefinedErrorData,
25
+ SuccessData,
26
+ )
27
+ from ..state.update_types import StateUpdate
28
+
29
+ from opentrons.hardware_control import HardwareControlAPI
30
+
31
+
32
+ if TYPE_CHECKING:
33
+ from ..execution import MovementHandler, PipettingHandler
34
+ from ..state.state import StateView
35
+ from ..resources import ModelUtils
36
+
37
+
38
+ BlowOutCommandType = Literal["blowout"]
39
+
40
+
41
+ class BlowOutParams(PipetteIdMixin, FlowRateMixin, WellLocationMixin):
42
+ """Payload required to blow-out a specific well."""
43
+
44
+ pass
45
+
46
+
47
+ class BlowOutResult(DestinationPositionResult):
48
+ """Result data from the execution of a blow-out command."""
49
+
50
+ pass
51
+
52
+
53
+ _ExecuteReturn = Union[
54
+ SuccessData[BlowOutResult],
55
+ DefinedErrorData[OverpressureError] | DefinedErrorData[StallOrCollisionError],
56
+ ]
57
+
58
+
59
+ class BlowOutImplementation(AbstractCommandImpl[BlowOutParams, _ExecuteReturn]):
60
+ """BlowOut command implementation."""
61
+
62
+ def __init__(
63
+ self,
64
+ movement: MovementHandler,
65
+ pipetting: PipettingHandler,
66
+ state_view: StateView,
67
+ hardware_api: HardwareControlAPI,
68
+ model_utils: ModelUtils,
69
+ **kwargs: object,
70
+ ) -> None:
71
+ self._movement = movement
72
+ self._pipetting = pipetting
73
+ self._state_view = state_view
74
+ self._hardware_api = hardware_api
75
+ self._model_utils = model_utils
76
+
77
+ async def execute(self, params: BlowOutParams) -> _ExecuteReturn:
78
+ """Move to and blow-out the requested well."""
79
+ move_result = await move_to_well(
80
+ movement=self._movement,
81
+ model_utils=self._model_utils,
82
+ pipette_id=params.pipetteId,
83
+ labware_id=params.labwareId,
84
+ well_name=params.wellName,
85
+ well_location=params.wellLocation,
86
+ )
87
+ if isinstance(move_result, DefinedErrorData):
88
+ return move_result
89
+ blow_out_result = await blow_out_in_place(
90
+ pipette_id=params.pipetteId,
91
+ flow_rate=params.flowRate,
92
+ location_if_error={
93
+ "retryLocation": (
94
+ move_result.public.position.x,
95
+ move_result.public.position.y,
96
+ move_result.public.position.z,
97
+ )
98
+ },
99
+ pipetting=self._pipetting,
100
+ model_utils=self._model_utils,
101
+ )
102
+ if isinstance(blow_out_result, DefinedErrorData):
103
+ return DefinedErrorData(
104
+ public=blow_out_result.public,
105
+ state_update=StateUpdate.reduce(
106
+ move_result.state_update, blow_out_result.state_update
107
+ ),
108
+ state_update_if_false_positive=StateUpdate.reduce(
109
+ move_result.state_update,
110
+ blow_out_result.state_update_if_false_positive,
111
+ ),
112
+ )
113
+ else:
114
+ return SuccessData(
115
+ public=BlowOutResult(position=move_result.public.position),
116
+ state_update=StateUpdate.reduce(
117
+ move_result.state_update, blow_out_result.state_update
118
+ ).set_pipette_ready_to_aspirate(
119
+ pipette_id=params.pipetteId, ready_to_aspirate=False
120
+ ),
121
+ )
122
+
123
+
124
+ class BlowOut(
125
+ BaseCommand[
126
+ BlowOutParams,
127
+ BlowOutResult,
128
+ OverpressureError | StallOrCollisionError,
129
+ ]
130
+ ):
131
+ """Blow-out command model."""
132
+
133
+ commandType: BlowOutCommandType = "blowout"
134
+ params: BlowOutParams
135
+ result: Optional[BlowOutResult] = None
136
+
137
+ _ImplementationCls: Type[BlowOutImplementation] = BlowOutImplementation
138
+
139
+
140
+ class BlowOutCreate(BaseCommandCreate[BlowOutParams]):
141
+ """Create blow-out command request model."""
142
+
143
+ commandType: BlowOutCommandType = "blowout"
144
+ params: BlowOutParams
145
+
146
+ _CommandCls: Type[BlowOut] = BlowOut
@@ -0,0 +1,119 @@
1
+ """Blow-out in place command request, result, and implementation models."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type, Union
5
+ from typing_extensions import Literal
6
+ from pydantic import BaseModel
7
+
8
+ from .pipetting_common import (
9
+ OverpressureError,
10
+ PipetteIdMixin,
11
+ FlowRateMixin,
12
+ blow_out_in_place,
13
+ )
14
+ from .command import (
15
+ AbstractCommandImpl,
16
+ BaseCommand,
17
+ BaseCommandCreate,
18
+ DefinedErrorData,
19
+ SuccessData,
20
+ )
21
+ from ..errors.error_occurrence import ErrorOccurrence
22
+
23
+ from opentrons.hardware_control import HardwareControlAPI
24
+
25
+
26
+ if TYPE_CHECKING:
27
+ from ..execution import PipettingHandler, GantryMover
28
+ from ..state.state import StateView
29
+ from ..resources import ModelUtils
30
+
31
+
32
+ BlowOutInPlaceCommandType = Literal["blowOutInPlace"]
33
+
34
+
35
+ class BlowOutInPlaceParams(PipetteIdMixin, FlowRateMixin):
36
+ """Payload required to blow-out in place."""
37
+
38
+ pass
39
+
40
+
41
+ class BlowOutInPlaceResult(BaseModel):
42
+ """Result data from the execution of a BlowOutInPlace command."""
43
+
44
+ pass
45
+
46
+
47
+ _ExecuteReturn = Union[
48
+ SuccessData[BlowOutInPlaceResult],
49
+ DefinedErrorData[OverpressureError],
50
+ ]
51
+
52
+
53
+ class BlowOutInPlaceImplementation(
54
+ AbstractCommandImpl[BlowOutInPlaceParams, _ExecuteReturn]
55
+ ):
56
+ """BlowOutInPlace command implementation."""
57
+
58
+ def __init__(
59
+ self,
60
+ pipetting: PipettingHandler,
61
+ state_view: StateView,
62
+ hardware_api: HardwareControlAPI,
63
+ model_utils: ModelUtils,
64
+ gantry_mover: GantryMover,
65
+ **kwargs: object,
66
+ ) -> None:
67
+ self._pipetting = pipetting
68
+ self._state_view = state_view
69
+ self._hardware_api = hardware_api
70
+ self._model_utils = model_utils
71
+ self._gantry_mover = gantry_mover
72
+
73
+ async def execute(self, params: BlowOutInPlaceParams) -> _ExecuteReturn:
74
+ """Blow-out without moving the pipette."""
75
+ current_position = await self._gantry_mover.get_position(params.pipetteId)
76
+ result = await blow_out_in_place(
77
+ pipette_id=params.pipetteId,
78
+ flow_rate=params.flowRate,
79
+ location_if_error={
80
+ "retryLocation": (
81
+ current_position.x,
82
+ current_position.y,
83
+ current_position.z,
84
+ )
85
+ },
86
+ pipetting=self._pipetting,
87
+ model_utils=self._model_utils,
88
+ )
89
+ if isinstance(result, DefinedErrorData):
90
+ return result
91
+ return SuccessData(
92
+ public=BlowOutInPlaceResult(),
93
+ state_update=result.state_update.set_pipette_ready_to_aspirate(
94
+ pipette_id=params.pipetteId, ready_to_aspirate=False
95
+ ),
96
+ )
97
+
98
+
99
+ class BlowOutInPlace(
100
+ BaseCommand[BlowOutInPlaceParams, BlowOutInPlaceResult, ErrorOccurrence]
101
+ ):
102
+ """BlowOutInPlace command model."""
103
+
104
+ commandType: BlowOutInPlaceCommandType = "blowOutInPlace"
105
+ params: BlowOutInPlaceParams
106
+ result: Optional[BlowOutInPlaceResult] = None
107
+
108
+ _ImplementationCls: Type[
109
+ BlowOutInPlaceImplementation
110
+ ] = BlowOutInPlaceImplementation
111
+
112
+
113
+ class BlowOutInPlaceCreate(BaseCommandCreate[BlowOutInPlaceParams]):
114
+ """BlowOutInPlace command request model."""
115
+
116
+ commandType: BlowOutInPlaceCommandType = "blowOutInPlace"
117
+ params: BlowOutInPlaceParams
118
+
119
+ _CommandCls: Type[BlowOutInPlace] = BlowOutInPlace