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,293 @@
1
+ """Command models to engage a user to empty a Flex Stacker."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from __future__ import annotations
6
+ from typing import Optional, Literal, TYPE_CHECKING, Annotated
7
+ from typing_extensions import Type
8
+
9
+ from pydantic import BaseModel, Field
10
+ from pydantic.json_schema import SkipJsonSchema
11
+
12
+ from ..command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
13
+ from ...errors import (
14
+ ErrorOccurrence,
15
+ )
16
+ from ...errors.exceptions import FlexStackerLabwarePoolNotYetDefinedError
17
+ from ...state import update_types
18
+ from ...types import (
19
+ StackerFillEmptyStrategy,
20
+ StackerStoredLabwareGroup,
21
+ NotOnDeckLocationSequenceComponent,
22
+ OFF_DECK_LOCATION,
23
+ InStackerHopperLocation,
24
+ LabwareLocationSequence,
25
+ OnLabwareLocation,
26
+ LabwareLocation,
27
+ )
28
+ from .common import (
29
+ labware_locations_for_group,
30
+ primary_location_sequences,
31
+ adapter_location_sequences_with_default,
32
+ lid_location_sequences_with_default,
33
+ )
34
+
35
+ if TYPE_CHECKING:
36
+ from ...state.state import StateView
37
+ from ...execution import RunControlHandler, EquipmentHandler
38
+
39
+ EmptyCommandType = Literal["flexStacker/empty"]
40
+
41
+
42
+ class EmptyParams(BaseModel):
43
+ """The parameters defining how a stacker should be emptied."""
44
+
45
+ moduleId: str = Field(..., description="Unique ID of the Flex Stacker")
46
+
47
+ strategy: StackerFillEmptyStrategy = Field(
48
+ ...,
49
+ description=(
50
+ "How to empty the stacker. "
51
+ "If manualWithPause, pause the protocol until the client sends an interaction, and mark "
52
+ "the labware pool as empty thereafter. If logical, do not pause but immediately apply the "
53
+ "specified count."
54
+ ),
55
+ )
56
+
57
+ message: str | SkipJsonSchema[None] = Field(
58
+ None,
59
+ description="The message to display on connected clients during a manualWithPause strategy empty.",
60
+ )
61
+
62
+ count: Optional[Annotated[int, Field(ge=0)]] = Field(
63
+ None,
64
+ description=(
65
+ "The new count of labware in the pool. If None, default to an empty pool. If this number is "
66
+ "larger than the amount of labware currently in the pool, default to the smaller amount. "
67
+ "Do not use the value in the parameters as an outside observer; instead, use the count value "
68
+ "from the results."
69
+ ),
70
+ )
71
+
72
+
73
+ class EmptyResult(BaseModel):
74
+ """Result data from a stacker empty command."""
75
+
76
+ count: int = Field(
77
+ ..., description="The new amount of labware stored in the stacker labware pool."
78
+ )
79
+ primaryLabwareURI: str = Field(
80
+ ...,
81
+ description="The labware definition URI of the primary labware.",
82
+ )
83
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
84
+ None,
85
+ description="The labware definition URI of the adapter labware.",
86
+ )
87
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
88
+ None,
89
+ description="The labware definition URI of the lid labware.",
90
+ )
91
+ storedLabware: list[StackerStoredLabwareGroup] | SkipJsonSchema[None] = Field(
92
+ ..., description="The primary labware loaded into the stacker labware pool."
93
+ )
94
+ removedLabware: list[StackerStoredLabwareGroup] | SkipJsonSchema[None] = Field(
95
+ ...,
96
+ description="The labware objects that have just been removed from the stacker labware pool.",
97
+ )
98
+ originalPrimaryLabwareLocationSequences: (
99
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
100
+ ) = Field(
101
+ None,
102
+ description="The previous position of each newly-removed primary labware, in the same order as removedLabware.",
103
+ )
104
+ originalAdapterLabwareLocationSequences: (
105
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
106
+ ) = Field(
107
+ None,
108
+ description="The previous position of each newly-removed adapter labware, in the same order as removedLabware. None if the pool does not specify an adapter.",
109
+ )
110
+ originalLidLabwareLocationSequences: (
111
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
112
+ ) = Field(
113
+ None,
114
+ description="The previous position of each newly-removed lid labware, in the same order as removedLabware. None if the pool does not specify a lid.",
115
+ )
116
+ newPrimaryLabwareLocationSequences: (
117
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
118
+ ) = Field(
119
+ None,
120
+ description="The new position of each newly-removed primary labware, in the same order as removedLabware.",
121
+ )
122
+ newAdapterLabwareLocationSequences: (
123
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
124
+ ) = Field(
125
+ None,
126
+ description="The new position of each newly-removed adapter labware, in the same order as removedLabware. None if the pool does not specify an adapter.",
127
+ )
128
+ newLidLabwareLocationSequences: (
129
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
130
+ ) = Field(
131
+ None,
132
+ description="The new position of each newly-removed lid labware, in the same order as removedLabware. None if the pool does not specify a lid labware.",
133
+ )
134
+
135
+
136
+ class EmptyImpl(AbstractCommandImpl[EmptyParams, SuccessData[EmptyResult]]):
137
+ """Implementation of a stacker empty command."""
138
+
139
+ def __init__(
140
+ self,
141
+ state_view: StateView,
142
+ run_control: RunControlHandler,
143
+ equipment: EquipmentHandler,
144
+ **kwargs: object,
145
+ ) -> None:
146
+ self._state_view = state_view
147
+ self._run_control = run_control
148
+ self._equipment = equipment
149
+
150
+ async def execute( # noqa: C901
151
+ self, params: EmptyParams
152
+ ) -> SuccessData[EmptyResult]:
153
+ """Execute the stacker empty command."""
154
+ stacker_state = self._state_view.modules.get_flex_stacker_substate(
155
+ params.moduleId
156
+ )
157
+
158
+ if stacker_state.pool_primary_definition is None:
159
+ location = self._state_view.modules.get_location(params.moduleId)
160
+ raise FlexStackerLabwarePoolNotYetDefinedError(
161
+ message=f"The Flex Stacker in {location} has not been configured yet and cannot be emptied."
162
+ )
163
+
164
+ count = params.count if params.count is not None else 0
165
+
166
+ new_count = min(len(stacker_state.contained_labware_bottom_first), count)
167
+
168
+ new_stored_labware = stacker_state.contained_labware_bottom_first[:new_count]
169
+ removed_labware = stacker_state.contained_labware_bottom_first[new_count:]
170
+ new_locations_by_id: dict[str, LabwareLocation] = {}
171
+ new_offset_ids_by_id: dict[str, str | None] = {}
172
+
173
+ def _add_to_dicts(labware_group: StackerStoredLabwareGroup) -> None:
174
+ if labware_group.adapterLabwareId:
175
+ new_locations_by_id[labware_group.primaryLabwareId] = OnLabwareLocation(
176
+ labwareId=labware_group.adapterLabwareId
177
+ )
178
+ new_locations_by_id[labware_group.adapterLabwareId] = OFF_DECK_LOCATION
179
+ new_offset_ids_by_id[labware_group.primaryLabwareId] = None
180
+ new_offset_ids_by_id[labware_group.adapterLabwareId] = None
181
+ else:
182
+ new_locations_by_id[labware_group.primaryLabwareId] = OFF_DECK_LOCATION
183
+ new_offset_ids_by_id[labware_group.primaryLabwareId] = None
184
+ if labware_group.lidLabwareId:
185
+ new_locations_by_id[labware_group.lidLabwareId] = OnLabwareLocation(
186
+ labwareId=labware_group.primaryLabwareId
187
+ )
188
+ new_offset_ids_by_id[labware_group.lidLabwareId] = None
189
+
190
+ for group in removed_labware:
191
+ _add_to_dicts(group)
192
+
193
+ state_update = (
194
+ update_types.StateUpdate()
195
+ .update_flex_stacker_contained_labware(
196
+ module_id=params.moduleId,
197
+ contained_labware_bottom_first=new_stored_labware,
198
+ )
199
+ .set_batch_labware_location(
200
+ new_locations_by_id=new_locations_by_id,
201
+ new_offset_ids_by_id=new_offset_ids_by_id,
202
+ )
203
+ )
204
+
205
+ stacker_hw = self._equipment.get_module_hardware_api(
206
+ module_id=stacker_state.module_id
207
+ )
208
+ if stacker_hw:
209
+ stacker_hw.set_stacker_identify(True)
210
+
211
+ if params.strategy == StackerFillEmptyStrategy.MANUAL_WITH_PAUSE:
212
+ await self._run_control.wait_for_resume()
213
+
214
+ if stacker_hw:
215
+ stacker_hw.set_stacker_identify(False)
216
+
217
+ if stacker_state.pool_primary_definition is None:
218
+ raise FlexStackerLabwarePoolNotYetDefinedError(
219
+ "The Primary Labware must be defined in the stacker pool."
220
+ )
221
+
222
+ original_locations = [
223
+ labware_locations_for_group(
224
+ group, [InStackerHopperLocation(moduleId=params.moduleId)]
225
+ )
226
+ for group in removed_labware
227
+ ]
228
+ new_locations = [
229
+ labware_locations_for_group(
230
+ group,
231
+ [
232
+ NotOnDeckLocationSequenceComponent(
233
+ logicalLocationName=OFF_DECK_LOCATION
234
+ )
235
+ ],
236
+ )
237
+ for group in removed_labware
238
+ ]
239
+
240
+ return SuccessData(
241
+ public=EmptyResult.model_construct(
242
+ count=new_count,
243
+ primaryLabwareURI=self._state_view.labware.get_uri_from_definition(
244
+ stacker_state.pool_primary_definition
245
+ ),
246
+ adapterLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
247
+ stacker_state.pool_adapter_definition
248
+ ),
249
+ lidLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
250
+ stacker_state.pool_lid_definition
251
+ ),
252
+ storedLabware=new_stored_labware,
253
+ removedLabware=removed_labware,
254
+ originalPrimaryLabwareLocationSequences=primary_location_sequences(
255
+ original_locations
256
+ ),
257
+ originalAdapterLabwareLocationSequences=adapter_location_sequences_with_default(
258
+ original_locations, stacker_state.pool_adapter_definition
259
+ ),
260
+ originalLidLabwareLocationSequences=lid_location_sequences_with_default(
261
+ original_locations, stacker_state.pool_lid_definition
262
+ ),
263
+ newPrimaryLabwareLocationSequences=primary_location_sequences(
264
+ new_locations
265
+ ),
266
+ newAdapterLabwareLocationSequences=adapter_location_sequences_with_default(
267
+ new_locations, stacker_state.pool_adapter_definition
268
+ ),
269
+ newLidLabwareLocationSequences=lid_location_sequences_with_default(
270
+ new_locations, stacker_state.pool_lid_definition
271
+ ),
272
+ ),
273
+ state_update=state_update,
274
+ )
275
+
276
+
277
+ class Empty(BaseCommand[EmptyParams, EmptyResult, ErrorOccurrence]):
278
+ """A command to empty the Flex Stacker of labware."""
279
+
280
+ commandType: EmptyCommandType = "flexStacker/empty"
281
+ params: EmptyParams
282
+ result: Optional[EmptyResult] = None
283
+
284
+ _ImplementationCls: Type[EmptyImpl] = EmptyImpl
285
+
286
+
287
+ class EmptyCreate(BaseCommandCreate[EmptyParams]):
288
+ """A request to execute a Flex Stacker empty command."""
289
+
290
+ commandType: EmptyCommandType = "flexStacker/empty"
291
+ params: EmptyParams
292
+
293
+ _CommandCls: Type[Empty] = Empty
@@ -0,0 +1,281 @@
1
+ """Command models to engage a user to empty a Flex Stacker."""
2
+
3
+ from __future__ import annotations
4
+ from typing import Optional, Literal, TYPE_CHECKING, Annotated
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 AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
11
+ from ...errors import (
12
+ ErrorOccurrence,
13
+ )
14
+ from ...errors.exceptions import FlexStackerLabwarePoolNotYetDefinedError
15
+ from ...types import (
16
+ StackerFillEmptyStrategy,
17
+ StackerStoredLabwareGroup,
18
+ LabwareLocationSequence,
19
+ NotOnDeckLocationSequenceComponent,
20
+ SYSTEM_LOCATION,
21
+ InStackerHopperLocation,
22
+ )
23
+ from .common import (
24
+ INITIAL_STORED_LABWARE_DESCRIPTION,
25
+ build_ids_to_fill,
26
+ build_or_assign_labware_to_hopper,
27
+ labware_locations_for_group,
28
+ labware_location_base_sequence,
29
+ primary_location_sequences,
30
+ adapter_location_sequences_with_default,
31
+ lid_location_sequences_with_default,
32
+ )
33
+
34
+ if TYPE_CHECKING:
35
+ from opentrons.protocol_engine.state.state import StateView
36
+ from opentrons.protocol_engine.execution import EquipmentHandler, RunControlHandler
37
+ from opentrons.protocol_engine.resources import ModelUtils
38
+
39
+
40
+ FillCommandType = Literal["flexStacker/fill"]
41
+
42
+
43
+ class FillParams(BaseModel):
44
+ """The parameters defining how a stacker should be filled."""
45
+
46
+ moduleId: str = Field(..., description="Unique ID of the Flex Stacker")
47
+
48
+ strategy: StackerFillEmptyStrategy = Field(
49
+ ...,
50
+ description=(
51
+ "How to fill the stacker. "
52
+ "If manualWithPause, pause the protocol until the client sends an interaction, and apply "
53
+ "the new specified count thereafter. If logical, do not pause but immediately apply the "
54
+ "specified count."
55
+ ),
56
+ )
57
+
58
+ message: str | SkipJsonSchema[None] = Field(
59
+ None,
60
+ description="The message to display on connected clients during a manualWithPause strategy fill.",
61
+ )
62
+
63
+ count: Optional[Annotated[int, Field(ge=1)]] = Field(
64
+ None,
65
+ description=(
66
+ "How full the labware pool should now be. If None, default to the maximum amount "
67
+ "of the currently-configured labware the pool can hold. "
68
+ "If this number is larger than the maximum the pool can hold, it will be clamped to "
69
+ "the maximum. If this number is smaller than the current amount of labware the pool "
70
+ "holds, it will be clamped to that minimum. Do not use the value in the parameters as "
71
+ "an outside observer; instead, use the count value from the results."
72
+ ),
73
+ )
74
+ labwareToStore: list[StackerStoredLabwareGroup] | None = Field(
75
+ None, description=INITIAL_STORED_LABWARE_DESCRIPTION
76
+ )
77
+
78
+
79
+ class FillResult(BaseModel):
80
+ """Result data from a stacker fill command."""
81
+
82
+ count: int = Field(
83
+ ..., description="The new amount of labware stored in the stacker."
84
+ )
85
+ primaryLabwareURI: str = Field(
86
+ ..., description="The labware definition URI of the primary labware."
87
+ )
88
+ adapterLabwareURI: str | SkipJsonSchema[None] = Field(
89
+ None,
90
+ description="The labware definition URI of the adapter labware.",
91
+ )
92
+ lidLabwareURI: str | SkipJsonSchema[None] = Field(
93
+ None,
94
+ description="The labware definition URI of the lid labware.",
95
+ )
96
+ storedLabware: list[StackerStoredLabwareGroup] | SkipJsonSchema[None] = Field(
97
+ None, description="The labware now stored in the stacker."
98
+ )
99
+ addedLabware: list[StackerStoredLabwareGroup] | SkipJsonSchema[None] = Field(
100
+ None, description="The labware just added to the stacker."
101
+ )
102
+ originalPrimaryLabwareLocationSequences: (
103
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
104
+ ) = Field(
105
+ None,
106
+ description="The previous position of each primary labware, in the same order as storedLabware.",
107
+ )
108
+ originalAdapterLabwareLocationSequences: (
109
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
110
+ ) = Field(
111
+ None,
112
+ description="The previous position of each adapter labware, in the same order as storedLabware. None if the pool does not specify an adapter.",
113
+ )
114
+ originalLidLabwareLocationSequences: (
115
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
116
+ ) = Field(
117
+ None,
118
+ description="The previous position of each lid labware, in the same order as storedLabware. None if the pool does not specify a lid.",
119
+ )
120
+ newPrimaryLabwareLocationSequences: (
121
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
122
+ ) = Field(
123
+ None,
124
+ description="The new position of each primary labware, in the same order as storedLabware.",
125
+ )
126
+ newAdapterLabwareLocationSequences: (
127
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
128
+ ) = Field(
129
+ None,
130
+ description="The new position of each adapter labware, in the same order as storedLabware. None if the pool does not specify an adapter.",
131
+ )
132
+ newLidLabwareLocationSequences: (
133
+ list[LabwareLocationSequence] | SkipJsonSchema[None]
134
+ ) = Field(
135
+ None,
136
+ description="The new position of each lid labware, in the same order as storedLabware. None if the pool does not specify a lid labware.",
137
+ )
138
+
139
+
140
+ class FillImpl(AbstractCommandImpl[FillParams, SuccessData[FillResult]]):
141
+ """Implementation of a stacker fill command."""
142
+
143
+ def __init__(
144
+ self,
145
+ state_view: StateView,
146
+ run_control: RunControlHandler,
147
+ model_utils: ModelUtils,
148
+ equipment: EquipmentHandler,
149
+ **kwargs: object,
150
+ ) -> None:
151
+ self._state_view = state_view
152
+ self._run_control = run_control
153
+ self._model_utils = model_utils
154
+ self._equipment = equipment
155
+
156
+ async def execute(self, params: FillParams) -> SuccessData[FillResult]:
157
+ """Execute the stacker fill command."""
158
+ stacker_state = self._state_view.modules.get_flex_stacker_substate(
159
+ params.moduleId
160
+ )
161
+
162
+ if stacker_state.pool_primary_definition is None:
163
+ location = self._state_view.modules.get_location(params.moduleId)
164
+ raise FlexStackerLabwarePoolNotYetDefinedError(
165
+ message=f"The Flex Stacker in {location} has not been configured yet and cannot be filled."
166
+ )
167
+
168
+ groups_to_load = build_ids_to_fill(
169
+ stacker_state.pool_adapter_definition is not None,
170
+ stacker_state.pool_lid_definition is not None,
171
+ params.labwareToStore,
172
+ params.count,
173
+ stacker_state.max_pool_count,
174
+ len(stacker_state.contained_labware_bottom_first),
175
+ self._model_utils,
176
+ )
177
+
178
+ state_update, new_contained_labware = await build_or_assign_labware_to_hopper(
179
+ stacker_state.pool_primary_definition,
180
+ stacker_state.pool_adapter_definition,
181
+ stacker_state.pool_lid_definition,
182
+ params.moduleId,
183
+ groups_to_load,
184
+ stacker_state.get_contained_labware(),
185
+ self._equipment,
186
+ self._state_view,
187
+ )
188
+ added_labware = [
189
+ labware
190
+ for labware in new_contained_labware
191
+ if labware not in stacker_state.contained_labware_bottom_first
192
+ ]
193
+
194
+ original_location_sequences = [
195
+ labware_locations_for_group(
196
+ group,
197
+ labware_location_base_sequence(
198
+ group,
199
+ self._state_view,
200
+ [
201
+ NotOnDeckLocationSequenceComponent(
202
+ logicalLocationName=SYSTEM_LOCATION
203
+ )
204
+ ],
205
+ ),
206
+ )
207
+ for group in added_labware
208
+ ]
209
+ new_location_sequences = [
210
+ labware_locations_for_group(
211
+ group, [InStackerHopperLocation(moduleId=params.moduleId)]
212
+ )
213
+ for group in added_labware
214
+ ]
215
+
216
+ stacker_hw = self._equipment.get_module_hardware_api(
217
+ module_id=stacker_state.module_id
218
+ )
219
+ if stacker_hw:
220
+ stacker_hw.set_stacker_identify(True)
221
+
222
+ if params.strategy == StackerFillEmptyStrategy.MANUAL_WITH_PAUSE:
223
+ await self._run_control.wait_for_resume()
224
+
225
+ if stacker_hw:
226
+ stacker_hw.set_stacker_identify(False)
227
+
228
+ return SuccessData(
229
+ public=FillResult.model_construct(
230
+ count=len(new_contained_labware),
231
+ storedLabware=new_contained_labware,
232
+ addedLabware=added_labware,
233
+ primaryLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
234
+ stacker_state.pool_primary_definition
235
+ ),
236
+ adapterLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
237
+ stacker_state.pool_adapter_definition
238
+ ),
239
+ lidLabwareURI=self._state_view.labware.get_uri_from_definition_unless_none(
240
+ stacker_state.pool_lid_definition
241
+ ),
242
+ originalPrimaryLabwareLocationSequences=primary_location_sequences(
243
+ original_location_sequences
244
+ ),
245
+ originalAdapterLabwareLocationSequences=adapter_location_sequences_with_default(
246
+ original_location_sequences, stacker_state.pool_adapter_definition
247
+ ),
248
+ originalLidLabwareLocationSequences=lid_location_sequences_with_default(
249
+ original_location_sequences, stacker_state.pool_lid_definition
250
+ ),
251
+ newPrimaryLabwareLocationSequences=primary_location_sequences(
252
+ new_location_sequences
253
+ ),
254
+ newAdapterLabwareLocationSequences=adapter_location_sequences_with_default(
255
+ new_location_sequences, stacker_state.pool_adapter_definition
256
+ ),
257
+ newLidLabwareLocationSequences=lid_location_sequences_with_default(
258
+ new_location_sequences, stacker_state.pool_lid_definition
259
+ ),
260
+ ),
261
+ state_update=state_update,
262
+ )
263
+
264
+
265
+ class Fill(BaseCommand[FillParams, FillResult, ErrorOccurrence]):
266
+ """A command to fill the Flex Stacker with labware."""
267
+
268
+ commandType: FillCommandType = "flexStacker/fill"
269
+ params: FillParams
270
+ result: Optional[FillResult] = None
271
+
272
+ _ImplementationCls: Type[FillImpl] = FillImpl
273
+
274
+
275
+ class FillCreate(BaseCommandCreate[FillParams]):
276
+ """A request to execute a Flex Stacker fill command."""
277
+
278
+ commandType: FillCommandType = "flexStacker/fill"
279
+ params: FillParams
280
+
281
+ _CommandCls: Type[Fill] = Fill