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,82 @@
1
+ """Update position estimators payload, result, and implementaiton."""
2
+
3
+ from __future__ import annotations
4
+ from pydantic import BaseModel, Field
5
+ from typing import TYPE_CHECKING, Optional, List, Type
6
+ from typing_extensions import Literal
7
+
8
+ from ...types import MotorAxis
9
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
10
+ from ...errors.error_occurrence import ErrorOccurrence
11
+ from ...resources import ensure_ot3_hardware
12
+
13
+ from opentrons.hardware_control import HardwareControlAPI
14
+
15
+ if TYPE_CHECKING:
16
+ from ...execution import GantryMover
17
+
18
+
19
+ UnsafeEngageAxesCommandType = Literal["unsafe/engageAxes"]
20
+
21
+
22
+ class UnsafeEngageAxesParams(BaseModel):
23
+ """Payload required for an UnsafeEngageAxes command."""
24
+
25
+ axes: List[MotorAxis] = Field(..., description="The axes for which to enable.")
26
+
27
+
28
+ class UnsafeEngageAxesResult(BaseModel):
29
+ """Result data from the execution of an UnsafeEngageAxes command."""
30
+
31
+
32
+ class UnsafeEngageAxesImplementation(
33
+ AbstractCommandImpl[
34
+ UnsafeEngageAxesParams,
35
+ SuccessData[UnsafeEngageAxesResult],
36
+ ]
37
+ ):
38
+ """Enable axes command implementation."""
39
+
40
+ def __init__(
41
+ self,
42
+ hardware_api: HardwareControlAPI,
43
+ gantry_mover: GantryMover,
44
+ **kwargs: object,
45
+ ) -> None:
46
+ self._hardware_api = hardware_api
47
+ self._gantry_mover = gantry_mover
48
+
49
+ async def execute(
50
+ self, params: UnsafeEngageAxesParams
51
+ ) -> SuccessData[UnsafeEngageAxesResult]:
52
+ """Enable exes."""
53
+ ot3_hardware_api = ensure_ot3_hardware(self._hardware_api)
54
+ await ot3_hardware_api.engage_axes(
55
+ self._gantry_mover.motor_axes_to_present_hardware_axes(params.axes)
56
+ )
57
+ return SuccessData(
58
+ public=UnsafeEngageAxesResult(),
59
+ )
60
+
61
+
62
+ class UnsafeEngageAxes(
63
+ BaseCommand[UnsafeEngageAxesParams, UnsafeEngageAxesResult, ErrorOccurrence]
64
+ ):
65
+ """UnsafeEngageAxes command model."""
66
+
67
+ commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes"
68
+ params: UnsafeEngageAxesParams
69
+ result: Optional[UnsafeEngageAxesResult] = None
70
+
71
+ _ImplementationCls: Type[
72
+ UnsafeEngageAxesImplementation
73
+ ] = UnsafeEngageAxesImplementation
74
+
75
+
76
+ class UnsafeEngageAxesCreate(BaseCommandCreate[UnsafeEngageAxesParams]):
77
+ """UnsafeEngageAxes command request model."""
78
+
79
+ commandType: UnsafeEngageAxesCommandType = "unsafe/engageAxes"
80
+ params: UnsafeEngageAxesParams
81
+
82
+ _CommandCls: Type[UnsafeEngageAxes] = UnsafeEngageAxes
@@ -0,0 +1,208 @@
1
+ """Place labware payload, result, and implementaiton."""
2
+
3
+ from __future__ import annotations
4
+ from typing import TYPE_CHECKING, Optional, Type
5
+ from typing_extensions import Literal
6
+
7
+ from opentrons_shared_data.labware.types import LabwareUri
8
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
9
+ from pydantic import BaseModel, Field
10
+
11
+ from opentrons.hardware_control.types import Axis, OT3Mount
12
+ from opentrons.motion_planning.waypoints import get_gripper_labware_placement_waypoints
13
+ from opentrons.protocol_engine.errors.exceptions import (
14
+ CannotPerformGripperAction,
15
+ GripperNotAttachedError,
16
+ )
17
+ from opentrons.types import Point
18
+
19
+ from ...types import (
20
+ DeckSlotLocation,
21
+ ModuleModel,
22
+ OnDeckLabwareLocation,
23
+ )
24
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
25
+ from ...errors.error_occurrence import ErrorOccurrence
26
+ from ...resources import ensure_ot3_hardware
27
+
28
+ from opentrons.hardware_control import HardwareControlAPI, OT3HardwareControlAPI
29
+
30
+ if TYPE_CHECKING:
31
+ from ...state.state import StateView
32
+ from ...execution.equipment import EquipmentHandler
33
+
34
+
35
+ UnsafePlaceLabwareCommandType = Literal["unsafe/placeLabware"]
36
+
37
+
38
+ class UnsafePlaceLabwareParams(BaseModel):
39
+ """Payload required for an UnsafePlaceLabware command."""
40
+
41
+ labwareURI: str = Field(..., description="Labware URI for labware.")
42
+ location: OnDeckLabwareLocation = Field(
43
+ ..., description="Where to place the labware."
44
+ )
45
+
46
+
47
+ class UnsafePlaceLabwareResult(BaseModel):
48
+ """Result data from the execution of an UnsafePlaceLabware command."""
49
+
50
+
51
+ class UnsafePlaceLabwareImplementation(
52
+ AbstractCommandImpl[
53
+ UnsafePlaceLabwareParams,
54
+ SuccessData[UnsafePlaceLabwareResult],
55
+ ]
56
+ ):
57
+ """The UnsafePlaceLabware command implementation."""
58
+
59
+ def __init__(
60
+ self,
61
+ hardware_api: HardwareControlAPI,
62
+ state_view: StateView,
63
+ equipment: EquipmentHandler,
64
+ **kwargs: object,
65
+ ) -> None:
66
+ self._hardware_api = hardware_api
67
+ self._state_view = state_view
68
+ self._equipment = equipment
69
+
70
+ async def execute(
71
+ self, params: UnsafePlaceLabwareParams
72
+ ) -> SuccessData[UnsafePlaceLabwareResult]:
73
+ """Place Labware.
74
+
75
+ This command is used only when the gripper is in the middle of moving
76
+ labware but is interrupted before completing the move. (i.e., the e-stop
77
+ is pressed, get into error recovery, etc).
78
+
79
+ Unlike the `moveLabware` command, where you pick a source and destination
80
+ location, this command takes the labwareURI of the labware to be moved
81
+ and location to move it to.
82
+
83
+ """
84
+ ot3api = ensure_ot3_hardware(self._hardware_api)
85
+ if not ot3api.has_gripper():
86
+ raise GripperNotAttachedError("No gripper found to perform labware place.")
87
+
88
+ if ot3api.gripper_jaw_can_home():
89
+ raise CannotPerformGripperAction(
90
+ "Cannot place labware when gripper is not gripping."
91
+ )
92
+
93
+ location = self._state_view.geometry.ensure_valid_gripper_location(
94
+ params.location,
95
+ )
96
+
97
+ definition = self._state_view.labware.get_definition_by_uri(
98
+ # todo(mm, 2024-11-07): This is an unsafe cast from untrusted input.
99
+ # We need a str -> LabwareUri parse/validate function.
100
+ LabwareUri(params.labwareURI)
101
+ )
102
+
103
+ # todo(mm, 2024-11-06): This is only correct in the special case of an
104
+ # absorbance reader lid. Its definition currently puts the offsets for *itself*
105
+ # in the property that's normally meant for offsets for its *children.*
106
+ final_offsets = self._state_view.labware.get_child_gripper_offsets(
107
+ labware_definition=definition, slot_name=None
108
+ )
109
+ drop_offset = (
110
+ Point(
111
+ final_offsets.dropOffset.x,
112
+ final_offsets.dropOffset.y,
113
+ final_offsets.dropOffset.z,
114
+ )
115
+ if final_offsets
116
+ else None
117
+ )
118
+
119
+ if isinstance(params.location, DeckSlotLocation):
120
+ self._state_view.addressable_areas.raise_if_area_not_in_deck_configuration(
121
+ params.location.slotName.id
122
+ )
123
+
124
+ # This is an absorbance reader, move the lid to its dock (staging area).
125
+ if isinstance(location, DeckSlotLocation):
126
+ module = self._state_view.modules.get_by_slot(location.slotName)
127
+ if module and module.model == ModuleModel.ABSORBANCE_READER_V1:
128
+ location = self._state_view.modules.absorbance_reader_dock_location(
129
+ module.id
130
+ )
131
+
132
+ # NOTE: When the estop is pressed, the gantry loses position, lets use
133
+ # the encoders to sync position.
134
+ # Ideally, we'd do a full home, but this command is used when
135
+ # the gripper is holding the plate reader, and a full home would
136
+ # bang it into the right window.
137
+ await ot3api.home(axes=[Axis.Z_L, Axis.Z_R, Axis.Z_G])
138
+ await ot3api.engage_axes([Axis.X, Axis.Y])
139
+ await ot3api.update_axis_position_estimations([Axis.X, Axis.Y])
140
+
141
+ # Place the labware down
142
+ await self._start_movement(ot3api, definition, location, drop_offset)
143
+
144
+ return SuccessData(public=UnsafePlaceLabwareResult())
145
+
146
+ async def _start_movement(
147
+ self,
148
+ ot3api: OT3HardwareControlAPI,
149
+ labware_definition: LabwareDefinition,
150
+ location: OnDeckLabwareLocation,
151
+ drop_offset: Optional[Point],
152
+ ) -> None:
153
+ gripper_homed_position = await ot3api.gantry_position(
154
+ mount=OT3Mount.GRIPPER,
155
+ refresh=True,
156
+ )
157
+
158
+ to_labware_center = self._state_view.geometry.get_labware_grip_point(
159
+ labware_definition=labware_definition, location=location
160
+ )
161
+
162
+ movement_waypoints = get_gripper_labware_placement_waypoints(
163
+ to_labware_center=to_labware_center,
164
+ gripper_home_z=gripper_homed_position.z,
165
+ drop_offset=drop_offset,
166
+ )
167
+
168
+ # start movement
169
+ for waypoint_data in movement_waypoints:
170
+ if waypoint_data.jaw_open:
171
+ if waypoint_data.dropping:
172
+ # This `disengage_axes` step is important in order to engage
173
+ # the electronic brake on the Z axis of the gripper. The brake
174
+ # has a stronger holding force on the axis than the hold current,
175
+ # and prevents the axis from spuriously dropping when e.g. the notch
176
+ # on the side of a falling tiprack catches the jaw.
177
+ await ot3api.disengage_axes([Axis.Z_G])
178
+ await ot3api.ungrip()
179
+ if waypoint_data.dropping:
180
+ # We lost the position estimation after disengaging the axis, so
181
+ # it is necessary to home it next
182
+ await ot3api.home_z(OT3Mount.GRIPPER)
183
+ await ot3api.move_to(
184
+ mount=OT3Mount.GRIPPER, abs_position=waypoint_data.position
185
+ )
186
+
187
+
188
+ class UnsafePlaceLabware(
189
+ BaseCommand[UnsafePlaceLabwareParams, UnsafePlaceLabwareResult, ErrorOccurrence]
190
+ ):
191
+ """UnsafePlaceLabware command model."""
192
+
193
+ commandType: UnsafePlaceLabwareCommandType = "unsafe/placeLabware"
194
+ params: UnsafePlaceLabwareParams
195
+ result: Optional[UnsafePlaceLabwareResult] = None
196
+
197
+ _ImplementationCls: Type[
198
+ UnsafePlaceLabwareImplementation
199
+ ] = UnsafePlaceLabwareImplementation
200
+
201
+
202
+ class UnsafePlaceLabwareCreate(BaseCommandCreate[UnsafePlaceLabwareParams]):
203
+ """UnsafePlaceLabware command request model."""
204
+
205
+ commandType: UnsafePlaceLabwareCommandType = "unsafe/placeLabware"
206
+ params: UnsafePlaceLabwareParams
207
+
208
+ _CommandCls: Type[UnsafePlaceLabware] = UnsafePlaceLabware
@@ -0,0 +1,94 @@
1
+ """Command models to close the latch of a Flex Stacker."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from __future__ import annotations
6
+ from typing import Optional, Literal, TYPE_CHECKING
7
+ from typing_extensions import Type
8
+
9
+ from pydantic import BaseModel, Field
10
+
11
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
12
+ from ...errors import ErrorOccurrence
13
+
14
+ if TYPE_CHECKING:
15
+ from ...state.state import StateView
16
+ from opentrons.protocol_engine.execution import EquipmentHandler
17
+
18
+ UnsafeFlexStackerCloseLatchCommandType = Literal["unsafe/flexStacker/closeLatch"]
19
+
20
+
21
+ class UnsafeFlexStackerCloseLatchParams(BaseModel):
22
+ """The parameters defining how a stacker should close its latch."""
23
+
24
+ moduleId: str = Field(..., description="Unique ID of the Flex Stacker")
25
+
26
+
27
+ class UnsafeFlexStackerCloseLatchResult(BaseModel):
28
+ """Result data from a stacker UnsafeFlexStackerCloseLatch command."""
29
+
30
+
31
+ class UnsafeFlexStackerCloseLatchImpl(
32
+ AbstractCommandImpl[
33
+ UnsafeFlexStackerCloseLatchParams,
34
+ SuccessData[UnsafeFlexStackerCloseLatchResult],
35
+ ]
36
+ ):
37
+ """Implementation of a stacker UnsafeFlexStackerCloseLatch command."""
38
+
39
+ def __init__(
40
+ self, state_view: StateView, equipment: EquipmentHandler, **kwargs: object
41
+ ) -> None:
42
+ self._state_view = state_view
43
+ self._equipment = equipment
44
+
45
+ async def execute(
46
+ self, params: UnsafeFlexStackerCloseLatchParams
47
+ ) -> SuccessData[UnsafeFlexStackerCloseLatchResult]:
48
+ """Execute the stacker UnsafeFlexStackerCloseLatch command.
49
+
50
+ Closing the latch modifies the state of the flex stacker and affects its
51
+ ability to execute the next command. This command should be used with care
52
+ outside of a protocol.
53
+ """
54
+ stacker_state = self._state_view.modules.get_flex_stacker_substate(
55
+ params.moduleId
56
+ )
57
+ stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
58
+
59
+ if stacker_hw is not None:
60
+ await stacker_hw.close_latch()
61
+ return SuccessData(public=UnsafeFlexStackerCloseLatchResult())
62
+
63
+
64
+ class UnsafeFlexStackerCloseLatch(
65
+ BaseCommand[
66
+ UnsafeFlexStackerCloseLatchParams,
67
+ UnsafeFlexStackerCloseLatchResult,
68
+ ErrorOccurrence,
69
+ ]
70
+ ):
71
+ """A command to UnsafeFlexStackerCloseLatch the Flex Stacker of labware."""
72
+
73
+ commandType: UnsafeFlexStackerCloseLatchCommandType = (
74
+ "unsafe/flexStacker/closeLatch"
75
+ )
76
+ params: UnsafeFlexStackerCloseLatchParams
77
+ result: Optional[UnsafeFlexStackerCloseLatchResult] = None
78
+
79
+ _ImplementationCls: Type[
80
+ UnsafeFlexStackerCloseLatchImpl
81
+ ] = UnsafeFlexStackerCloseLatchImpl
82
+
83
+
84
+ class UnsafeFlexStackerCloseLatchCreate(
85
+ BaseCommandCreate[UnsafeFlexStackerCloseLatchParams]
86
+ ):
87
+ """A request to execute a Flex Stacker UnsafeFlexStackerCloseLatch command."""
88
+
89
+ commandType: UnsafeFlexStackerCloseLatchCommandType = (
90
+ "unsafe/flexStacker/closeLatch"
91
+ )
92
+ params: UnsafeFlexStackerCloseLatchParams
93
+
94
+ _CommandCls: Type[UnsafeFlexStackerCloseLatch] = UnsafeFlexStackerCloseLatch
@@ -0,0 +1,295 @@
1
+ """Command models to manually retrieve a labware from a Flex Stacker in an unsafe situation."""
2
+
3
+ from __future__ import annotations
4
+ from typing import Literal, TYPE_CHECKING, Any, Union, cast
5
+ from typing_extensions import Type
6
+
7
+ from pydantic import BaseModel, Field
8
+ from pydantic.json_schema import SkipJsonSchema
9
+
10
+ from ..command import (
11
+ AbstractCommandImpl,
12
+ BaseCommand,
13
+ BaseCommandCreate,
14
+ SuccessData,
15
+ DefinedErrorData,
16
+ )
17
+ from ..flex_stacker.common import (
18
+ FlexStackerStallOrCollisionError,
19
+ labware_locations_for_group,
20
+ build_retrieve_labware_move_updates,
21
+ primary_location_sequence,
22
+ adapter_location_sequence,
23
+ lid_location_sequence,
24
+ )
25
+ from ...errors import (
26
+ ErrorOccurrence,
27
+ CannotPerformModuleAction,
28
+ LocationIsOccupiedError,
29
+ FlexStackerLabwarePoolNotYetDefinedError,
30
+ )
31
+ from ...resources import ModelUtils
32
+ from ...state import update_types
33
+ from ...types import (
34
+ ModuleLocation,
35
+ LabwareLocationSequence,
36
+ InStackerHopperLocation,
37
+ )
38
+ from opentrons.hardware_control.modules.types import PlatformState
39
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
40
+
41
+ if TYPE_CHECKING:
42
+ from opentrons.protocol_engine.state.state import StateView
43
+ from opentrons.protocol_engine.execution import EquipmentHandler
44
+
45
+ UnsafeFlexStackerManualRetrieveCommandType = Literal[
46
+ "unsafe/flexStacker/manualRetrieve"
47
+ ]
48
+
49
+
50
+ def _remove_default(s: dict[str, Any]) -> None:
51
+ s.pop("default", None)
52
+
53
+
54
+ class UnsafeFlexStackerManualRetrieveParams(BaseModel):
55
+ """Input parameters for a labware retrieval command."""
56
+
57
+ moduleId: str = Field(
58
+ ...,
59
+ description="Unique ID of the Flex Stacker.",
60
+ )
61
+ labwareId: str | SkipJsonSchema[None] = Field(
62
+ None,
63
+ description="Do not use. Present for internal backward compatibility.",
64
+ json_schema_extra=_remove_default,
65
+ )
66
+ displayName: str | SkipJsonSchema[None] = Field(
67
+ None,
68
+ description="Do not use. Present for internal backward compatibility.",
69
+ json_schema_extra=_remove_default,
70
+ )
71
+ adapterId: str | SkipJsonSchema[None] = Field(
72
+ None,
73
+ description="Do not use. Present for internal backward compatibility.",
74
+ json_schema_extra=_remove_default,
75
+ )
76
+ lidId: str | SkipJsonSchema[None] = Field(
77
+ None,
78
+ description="Do not use. Present for internal backward compatibility.",
79
+ json_schema_extra=_remove_default,
80
+ )
81
+
82
+
83
+ class UnsafeFlexStackerManualRetrieveResult(BaseModel):
84
+ """Result data from a labware retrieval command."""
85
+
86
+ labwareId: str = Field(
87
+ ...,
88
+ description="The labware ID of the primary retrieved labware.",
89
+ )
90
+ adapterId: str | None = Field(
91
+ None,
92
+ description="The optional Adapter Labware ID of the adapter under a primary labware.",
93
+ )
94
+ lidId: str | None = Field(
95
+ None,
96
+ description="The optional Lid Labware ID of the lid on a primary labware.",
97
+ )
98
+ primaryLocationSequence: LabwareLocationSequence = Field(
99
+ ..., description="The origin location of the primary labware."
100
+ )
101
+ lidLocationSequence: LabwareLocationSequence | None = Field(
102
+ None,
103
+ description="The origin location of the adapter labware under a primary labware.",
104
+ )
105
+ adapterLocationSequence: LabwareLocationSequence | None = Field(
106
+ None, description="The origin location of the lid labware on a primary labware."
107
+ )
108
+ originalPrimaryLocationSequence: LabwareLocationSequence = Field(
109
+ ..., description="The original location of the just-retrieved primary labware"
110
+ )
111
+ originalAdapterLocationSequence: LabwareLocationSequence | None = Field(
112
+ None, description="The original location of an adapter labware if any"
113
+ )
114
+ originalLidLocationSequence: LabwareLocationSequence | None = Field(
115
+ None, description="The original location of a lid labware if any"
116
+ )
117
+ primaryLabwareURI: str = Field(
118
+ ...,
119
+ description="The labware definition URI of the primary labware.",
120
+ )
121
+ adapterLabwareURI: str | None = Field(
122
+ None,
123
+ description="The labware definition URI of the adapter labware.",
124
+ )
125
+ lidLabwareURI: str | None = Field(
126
+ None,
127
+ description="The labware definition URI of the lid labware.",
128
+ )
129
+
130
+
131
+ _ExecuteReturn = Union[
132
+ SuccessData[UnsafeFlexStackerManualRetrieveResult],
133
+ DefinedErrorData[FlexStackerStallOrCollisionError],
134
+ ]
135
+
136
+
137
+ class UnsafeFlexStackerManualRetrieveImpl(
138
+ AbstractCommandImpl[UnsafeFlexStackerManualRetrieveParams, _ExecuteReturn]
139
+ ):
140
+ """Implementation of a labware retrieval command."""
141
+
142
+ def __init__(
143
+ self,
144
+ state_view: StateView,
145
+ equipment: EquipmentHandler,
146
+ model_utils: ModelUtils,
147
+ **kwargs: object,
148
+ ) -> None:
149
+ self._state_view = state_view
150
+ self._equipment = equipment
151
+ self._model_utils = model_utils
152
+
153
+ async def execute(
154
+ self, params: UnsafeFlexStackerManualRetrieveParams
155
+ ) -> _ExecuteReturn:
156
+ """Execute the labware retrieval command."""
157
+ stacker_state = self._state_view.modules.get_flex_stacker_substate(
158
+ params.moduleId
159
+ )
160
+
161
+ pool_definitions = stacker_state.get_pool_definition_ordered_list()
162
+ location = self._state_view.modules.get_location(params.moduleId)
163
+ if pool_definitions is None:
164
+ raise FlexStackerLabwarePoolNotYetDefinedError(
165
+ message=f"The Flex Stacker in {location} has not been configured yet and cannot be filled."
166
+ )
167
+
168
+ if len(stacker_state.contained_labware_bottom_first) == 0:
169
+ raise CannotPerformModuleAction(
170
+ message=f"Cannot retrieve labware from Flex Stacker in {location} because it contains no labware"
171
+ )
172
+
173
+ stacker_loc = ModuleLocation(moduleId=params.moduleId)
174
+ # Allow propagation of ModuleNotAttachedError.
175
+ stacker_hw = self._equipment.get_module_hardware_api(stacker_state.module_id)
176
+
177
+ # Validate that the stacker is fully in the gripper position
178
+ if stacker_hw:
179
+ stacker_hw.set_stacker_identify(True)
180
+ if stacker_hw.platform_state != PlatformState.EXTENDED:
181
+ raise CannotPerformModuleAction(
182
+ f"Cannot manually retrieve a labware from Flex Stacker in {location} if the carriage is not in gripper position."
183
+ )
184
+
185
+ try:
186
+ # In theory given this is an unsafe manual retrieve this should never raise
187
+ self._state_view.labware.raise_if_labware_in_location(stacker_loc)
188
+ except LocationIsOccupiedError:
189
+ raise CannotPerformModuleAction(
190
+ f"Cannot retrieve a labware from Flex Stacker in {location} if the carriage is occupied"
191
+ )
192
+
193
+ to_retrieve = stacker_state.contained_labware_bottom_first[0]
194
+ remaining = stacker_state.contained_labware_bottom_first[1:]
195
+
196
+ locations, offsets = build_retrieve_labware_move_updates(
197
+ to_retrieve, stacker_state, self._state_view
198
+ )
199
+
200
+ # Update the state to reflect the labware is now in the Flex Stacker slot
201
+ # todo(chb, 2025-02-19): This ModuleLocation piece should probably instead be an AddressableAreaLocation
202
+ # but that has implications for where labware are set by things like module.load_labware(..) and what
203
+ # happens when we move labware.
204
+ stacker_area = (
205
+ self._state_view.modules.ensure_and_convert_module_fixture_location(
206
+ deck_slot=self._state_view.modules.get_location(
207
+ params.moduleId
208
+ ).slotName,
209
+ model=self._state_view.modules.get(params.moduleId).model,
210
+ )
211
+ )
212
+
213
+ original_locations = labware_locations_for_group(
214
+ to_retrieve,
215
+ self._state_view.geometry.get_predicted_location_sequence(
216
+ InStackerHopperLocation(moduleId=params.moduleId)
217
+ ),
218
+ )
219
+ new_locations = labware_locations_for_group(
220
+ to_retrieve,
221
+ self._state_view.geometry.get_predicted_location_sequence(
222
+ ModuleLocation(moduleId=params.moduleId)
223
+ ),
224
+ )
225
+
226
+ if stacker_hw is not None:
227
+ stacker_hw.set_stacker_identify(False)
228
+
229
+ return SuccessData(
230
+ public=UnsafeFlexStackerManualRetrieveResult(
231
+ labwareId=to_retrieve.primaryLabwareId,
232
+ adapterId=to_retrieve.adapterLabwareId,
233
+ lidId=to_retrieve.lidLabwareId,
234
+ primaryLocationSequence=primary_location_sequence(new_locations),
235
+ adapterLocationSequence=adapter_location_sequence(new_locations),
236
+ lidLocationSequence=lid_location_sequence(new_locations),
237
+ originalPrimaryLocationSequence=primary_location_sequence(
238
+ original_locations
239
+ ),
240
+ originalAdapterLocationSequence=adapter_location_sequence(
241
+ original_locations
242
+ ),
243
+ originalLidLocationSequence=lid_location_sequence(original_locations),
244
+ primaryLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
245
+ cast(LabwareDefinition, stacker_state.pool_primary_definition)
246
+ ),
247
+ adapterLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
248
+ stacker_state.pool_adapter_definition
249
+ ),
250
+ lidLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
251
+ stacker_state.pool_lid_definition
252
+ ),
253
+ ),
254
+ state_update=(
255
+ update_types.StateUpdate()
256
+ .set_batch_labware_location(
257
+ new_locations_by_id=locations, new_offset_ids_by_id=offsets
258
+ )
259
+ .update_flex_stacker_contained_labware(params.moduleId, remaining)
260
+ .set_addressable_area_used(stacker_area)
261
+ ),
262
+ )
263
+
264
+
265
+ class UnsafeFlexStackerManualRetrieve(
266
+ BaseCommand[
267
+ UnsafeFlexStackerManualRetrieveParams,
268
+ UnsafeFlexStackerManualRetrieveResult,
269
+ ErrorOccurrence,
270
+ ]
271
+ ):
272
+ """A command to manually retrieve a labware from a Flex Stacker."""
273
+
274
+ commandType: UnsafeFlexStackerManualRetrieveCommandType = (
275
+ "unsafe/flexStacker/manualRetrieve"
276
+ )
277
+ params: UnsafeFlexStackerManualRetrieveParams
278
+ result: UnsafeFlexStackerManualRetrieveResult | None = None
279
+
280
+ _ImplementationCls: Type[
281
+ UnsafeFlexStackerManualRetrieveImpl
282
+ ] = UnsafeFlexStackerManualRetrieveImpl
283
+
284
+
285
+ class UnsafeFlexStackerManualRetrieveCreate(
286
+ BaseCommandCreate[UnsafeFlexStackerManualRetrieveParams]
287
+ ):
288
+ """A request to execute a Flex Stacker manual retrieve command."""
289
+
290
+ commandType: UnsafeFlexStackerManualRetrieveCommandType = (
291
+ "unsafe/flexStacker/manualRetrieve"
292
+ )
293
+ params: UnsafeFlexStackerManualRetrieveParams
294
+
295
+ _CommandCls: Type[UnsafeFlexStackerManualRetrieve] = UnsafeFlexStackerManualRetrieve