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,179 @@
1
+ """Wrappers for Protocol API v2 execution pipeline."""
2
+ import asyncio
3
+ from typing import Dict, Iterable, Optional, cast
4
+
5
+ from anyio import to_thread
6
+
7
+ from opentrons_shared_data.labware.types import (
8
+ LabwareDefinition as LabwareDefinitionTypedDict,
9
+ )
10
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
11
+
12
+ from opentrons.calibration_storage.helpers import uri_from_details
13
+ from opentrons.hardware_control import HardwareControlAPI
14
+ from opentrons.legacy_broker import LegacyBroker
15
+ from opentrons.protocol_engine import ProtocolEngine
16
+ from opentrons.protocol_engine.types import (
17
+ PrimitiveRunTimeParamValuesType,
18
+ CSVRuntimeParamPaths,
19
+ )
20
+ from opentrons.protocol_reader import ProtocolSource, ProtocolFileRole
21
+ from opentrons.util.broker import Broker
22
+
23
+ from opentrons.protocol_api import (
24
+ ProtocolContext,
25
+ ParameterContext,
26
+ create_protocol_context,
27
+ Parameters,
28
+ )
29
+ from opentrons.protocol_api.core.engine import ENGINE_CORE_API_VERSION
30
+ from opentrons.protocol_api.core.legacy.load_info import LoadInfo
31
+
32
+ from opentrons.protocols.parse import PythonParseMode, parse
33
+ from opentrons.protocols.execution.execute import run_protocol
34
+ from opentrons.protocols.execution.execute_python import exec_add_parameters
35
+ from opentrons.protocols.types import Protocol, PythonProtocol
36
+
37
+
38
+ # The earliest Python Protocol API version ("apiLevel") where the protocol's simulation
39
+ # and execution will be handled by Protocol Engine, rather than the previous direct hardware calls from protocol api.
40
+ #
41
+ # Note that even when simulation and execution are handled by the legacy machinery,
42
+ # Protocol Engine still has some involvement for analyzing the simulation and
43
+ # monitoring the execution.
44
+ LEGACY_PYTHON_API_VERSION_CUTOFF = ENGINE_CORE_API_VERSION
45
+
46
+
47
+ # The earliest JSON protocol schema version where the protocol is executed directly by
48
+ # Protocol Engine, rather than going through Python Protocol API v2.
49
+ LEGACY_JSON_SCHEMA_VERSION_CUTOFF = 6
50
+
51
+
52
+ class PythonAndLegacyFileReader:
53
+ """Interface to read Protocol API v2 protocols prior to execution."""
54
+
55
+ @staticmethod
56
+ def read(
57
+ protocol_source: ProtocolSource,
58
+ labware_definitions: Iterable[LabwareDefinition],
59
+ python_parse_mode: PythonParseMode,
60
+ ) -> Protocol:
61
+ """Read a PAPIv2 protocol into a data structure."""
62
+ protocol_file_path = protocol_source.main_file
63
+ protocol_contents = protocol_file_path.read_text(encoding="utf-8")
64
+ extra_labware: Dict[str, LabwareDefinitionTypedDict] = {
65
+ uri_from_details(
66
+ namespace=lw.namespace,
67
+ load_name=lw.parameters.loadName,
68
+ version=lw.version,
69
+ ): cast(LabwareDefinitionTypedDict, lw.model_dump(exclude_none=True))
70
+ for lw in labware_definitions
71
+ }
72
+ data_file_paths = [
73
+ data_file.path
74
+ for data_file in protocol_source.files
75
+ if data_file.role == ProtocolFileRole.DATA
76
+ ]
77
+
78
+ return parse(
79
+ protocol_file=protocol_contents,
80
+ filename=protocol_file_path.name,
81
+ extra_labware=extra_labware,
82
+ extra_data={
83
+ data_path.name: data_path.read_bytes() for data_path in data_file_paths
84
+ },
85
+ python_parse_mode=python_parse_mode,
86
+ )
87
+
88
+
89
+ class ProtocolContextCreator:
90
+ """Interface to construct Protocol API v2 contexts."""
91
+
92
+ _USE_SIMULATING_CORE = False
93
+
94
+ def __init__(
95
+ self,
96
+ hardware_api: HardwareControlAPI,
97
+ protocol_engine: ProtocolEngine,
98
+ ) -> None:
99
+ """Prepare the LegacyContextCreator.
100
+
101
+ Args:
102
+ hardware_api: The hardware control interface.
103
+ Will be wrapped in a `SynchronousAdapter`.
104
+ May be real hardware or a simulator.
105
+ protocol_engine: Interface for the context to load labware offsets.
106
+ """
107
+ self._hardware_api = hardware_api
108
+ self._protocol_engine = protocol_engine
109
+
110
+ def create(
111
+ self,
112
+ protocol: Protocol,
113
+ broker: Optional[LegacyBroker],
114
+ equipment_broker: Optional[Broker[LoadInfo]],
115
+ ) -> ProtocolContext:
116
+ """Create a Protocol API v2 context."""
117
+ extra_labware = (
118
+ protocol.extra_labware if isinstance(protocol, PythonProtocol) else None
119
+ )
120
+
121
+ bundled_data = (
122
+ protocol.bundled_data if isinstance(protocol, PythonProtocol) else None
123
+ )
124
+
125
+ return create_protocol_context(
126
+ api_version=protocol.api_level,
127
+ hardware_api=self._hardware_api,
128
+ deck_type=self._protocol_engine.state_view.config.deck_type.value,
129
+ protocol_engine=self._protocol_engine,
130
+ protocol_engine_loop=asyncio.get_running_loop(),
131
+ broker=broker,
132
+ equipment_broker=equipment_broker,
133
+ extra_labware=extra_labware,
134
+ use_simulating_core=self._USE_SIMULATING_CORE,
135
+ bundled_data=bundled_data,
136
+ )
137
+
138
+
139
+ class SimulatingContextCreator(ProtocolContextCreator):
140
+ """Interface to construct PAPIv2 contexts using simulating implementations.
141
+
142
+ Avoids some calls to the hardware API for performance.
143
+ See `opentrons.protocols.context.simulator`.
144
+ """
145
+
146
+ _USE_SIMULATING_CORE = True
147
+
148
+
149
+ class PythonProtocolExecutor:
150
+ """Interface to execute Protocol API v2 protocols in a child thread."""
151
+
152
+ @staticmethod
153
+ async def execute(
154
+ protocol: Protocol,
155
+ context: ProtocolContext,
156
+ run_time_parameters_with_overrides: Optional[Parameters],
157
+ ) -> None:
158
+ """Execute a PAPIv2 protocol with a given ProtocolContext in a child thread."""
159
+ await to_thread.run_sync(
160
+ run_protocol,
161
+ protocol,
162
+ context,
163
+ run_time_parameters_with_overrides,
164
+ )
165
+
166
+ @staticmethod
167
+ def extract_run_parameters(
168
+ protocol: PythonProtocol,
169
+ parameter_context: ParameterContext,
170
+ run_time_param_overrides: Optional[PrimitiveRunTimeParamValuesType],
171
+ run_time_param_file_overrides: Optional[CSVRuntimeParamPaths],
172
+ ) -> Optional[Parameters]:
173
+ """Extract the parameters defined in the protocol, overridden with values for the run."""
174
+ return exec_add_parameters(
175
+ protocol=protocol,
176
+ parameter_context=parameter_context,
177
+ run_time_param_overrides=run_time_param_overrides,
178
+ run_time_param_file_overrides=run_time_param_file_overrides,
179
+ )
@@ -0,0 +1,496 @@
1
+ """Engine/Runner provider."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import enum
6
+ from typing import Optional, Union, List, Dict, AsyncGenerator, Mapping
7
+
8
+ from anyio import move_on_after
9
+
10
+ from opentrons.types import NozzleMapInterface
11
+ from opentrons_shared_data.labware.types import LabwareUri
12
+ from opentrons_shared_data.labware.labware_definition import LabwareDefinition
13
+ from opentrons_shared_data.errors import GeneralError
14
+ from opentrons_shared_data.robot.types import RobotType
15
+
16
+ from . import protocol_runner, RunResult, JsonRunner, PythonAndLegacyRunner
17
+ from ..hardware_control import HardwareControlAPI
18
+ from ..hardware_control.modules import AbstractModule as HardwareModuleAPI
19
+ from ..protocol_engine import (
20
+ ProtocolEngine,
21
+ CommandCreate,
22
+ Command,
23
+ StateSummary,
24
+ CommandPointer,
25
+ CommandSlice,
26
+ CommandErrorSlice,
27
+ DeckType,
28
+ ErrorOccurrence,
29
+ )
30
+ from ..protocol_engine.errors import RunStoppedError
31
+ from ..protocol_engine.types import (
32
+ PostRunHardwareState,
33
+ EngineStatus,
34
+ LabwareOffsetCreate,
35
+ LegacyLabwareOffsetCreate,
36
+ LabwareOffset,
37
+ DeckConfigurationType,
38
+ RunTimeParameter,
39
+ PrimitiveRunTimeParamValuesType,
40
+ CSVRuntimeParamPaths,
41
+ CommandAnnotation,
42
+ ModuleModel,
43
+ )
44
+ from ..protocol_engine.error_recovery_policy import ErrorRecoveryPolicy
45
+
46
+ from ..protocol_reader import JsonProtocolConfig, PythonProtocolConfig, ProtocolSource
47
+ from ..protocols.parse import PythonParseMode
48
+ from ..protocol_engine.state.module_substates import FlexStackerSubState
49
+
50
+
51
+ class NoProtocolRunAvailable(RuntimeError):
52
+ """An error raised if there is no protocol run available."""
53
+
54
+
55
+ class UnknownProtocolParseMode(RuntimeError):
56
+ """An error raised if given an unknown protocol parse mode."""
57
+
58
+
59
+ class RunNotFound(GeneralError):
60
+ """An error raised if there is no run associated."""
61
+
62
+
63
+ class ParseMode(enum.Enum):
64
+ """Configure optional rules for when `opentrons.protocols.parse.parse()` parses protocols."""
65
+
66
+ NORMAL = enum.auto()
67
+ ALLOW_LEGACY_METADATA_AND_REQUIREMENTS = enum.auto()
68
+
69
+
70
+ class RunOrchestrator:
71
+ """Provider for runners and associated protocol engine.
72
+
73
+ Build runners, manage command execution, run state and in-memory protocol engine associated to the runners.
74
+ """
75
+
76
+ _protocol_runner: Optional[
77
+ Union[protocol_runner.JsonRunner, protocol_runner.PythonAndLegacyRunner, None]
78
+ ]
79
+ _setup_runner: protocol_runner.LiveRunner
80
+ _fixit_runner: protocol_runner.LiveRunner
81
+ _protocol_live_runner: protocol_runner.LiveRunner
82
+ _hardware_api: HardwareControlAPI
83
+ _protocol_engine: ProtocolEngine
84
+
85
+ def __init__(
86
+ self,
87
+ protocol_engine: ProtocolEngine,
88
+ # todo(mm, 2024-07-05): This hardware_api param looks unused?
89
+ hardware_api: HardwareControlAPI,
90
+ fixit_runner: protocol_runner.LiveRunner,
91
+ setup_runner: protocol_runner.LiveRunner,
92
+ protocol_live_runner: protocol_runner.LiveRunner,
93
+ json_or_python_protocol_runner: Optional[
94
+ Union[protocol_runner.PythonAndLegacyRunner, protocol_runner.JsonRunner]
95
+ ] = None,
96
+ run_id: Optional[str] = None,
97
+ ) -> None:
98
+ """Initialize a run orchestrator interface.
99
+
100
+ Arguments:
101
+ protocol_engine: Protocol engine instance.
102
+ hardware_api: Hardware control API instance.
103
+ fixit_runner: LiveRunner for fixit commands.
104
+ setup_runner: LiveRunner for setup commands.
105
+ protocol_live_runner: LiveRunner for protocol commands.
106
+ json_or_python_protocol_runner: JsonRunner/PythonAndLegacyRunner for protocol commands.
107
+ run_id: run id if any, associated to the runner/engine.
108
+ """
109
+ self._run_id = run_id
110
+ self._protocol_engine = protocol_engine
111
+ self._protocol_runner = json_or_python_protocol_runner
112
+ self._setup_runner = setup_runner
113
+ self._fixit_runner = fixit_runner
114
+ self._protocol_live_runner = protocol_live_runner
115
+ self._fixit_runner.prepare()
116
+ self._setup_runner.prepare()
117
+ self._protocol_engine.set_and_start_queue_worker(self.command_generator)
118
+
119
+ @property
120
+ def run_id(self) -> str:
121
+ """Get the "current" persisted run_id."""
122
+ if not self._run_id:
123
+ raise RunNotFound()
124
+ return self._run_id
125
+
126
+ @classmethod
127
+ def build_orchestrator(
128
+ cls,
129
+ hardware_api: HardwareControlAPI,
130
+ protocol_engine: ProtocolEngine,
131
+ protocol_config: Optional[
132
+ Union[JsonProtocolConfig, PythonProtocolConfig]
133
+ ] = None,
134
+ post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED,
135
+ drop_tips_after_run: bool = True,
136
+ run_id: Optional[str] = None,
137
+ ) -> "RunOrchestrator":
138
+ """Build a RunOrchestrator provider."""
139
+ setup_runner = protocol_runner.LiveRunner(
140
+ protocol_engine=protocol_engine,
141
+ hardware_api=hardware_api,
142
+ )
143
+ fixit_runner = protocol_runner.LiveRunner(
144
+ protocol_engine=protocol_engine,
145
+ hardware_api=hardware_api,
146
+ )
147
+ protocol_live_runner = protocol_runner.LiveRunner(
148
+ protocol_engine=protocol_engine,
149
+ hardware_api=hardware_api,
150
+ )
151
+ json_or_python_runner = None
152
+ if protocol_config:
153
+ json_or_python_runner = protocol_runner.create_protocol_runner(
154
+ protocol_config=protocol_config,
155
+ protocol_engine=protocol_engine,
156
+ hardware_api=hardware_api,
157
+ post_run_hardware_state=post_run_hardware_state,
158
+ drop_tips_after_run=drop_tips_after_run,
159
+ )
160
+ return cls(
161
+ run_id=run_id,
162
+ json_or_python_protocol_runner=json_or_python_runner,
163
+ setup_runner=setup_runner,
164
+ fixit_runner=fixit_runner,
165
+ hardware_api=hardware_api,
166
+ protocol_engine=protocol_engine,
167
+ protocol_live_runner=protocol_live_runner,
168
+ )
169
+
170
+ def play(self, deck_configuration: Optional[DeckConfigurationType] = None) -> None:
171
+ """Start or resume the run."""
172
+ # todo(mm, 2024-07-09): The deck configuration is set at the same time here for
173
+ # historical reasons. It's unsafe to change the deck configuration mid-run
174
+ # and we're relying on the caller to not do that.
175
+ self._protocol_engine.set_deck_configuration(deck_configuration)
176
+ self._protocol_engine.play()
177
+
178
+ async def run(
179
+ self,
180
+ deck_configuration: DeckConfigurationType,
181
+ protocol_source: Optional[ProtocolSource] = None,
182
+ run_time_param_values: Optional[PrimitiveRunTimeParamValuesType] = None,
183
+ ) -> RunResult:
184
+ """Start the run."""
185
+ if self._protocol_runner:
186
+ return await self._protocol_runner.run(
187
+ deck_configuration=deck_configuration,
188
+ protocol_source=protocol_source,
189
+ run_time_param_values=run_time_param_values,
190
+ )
191
+ elif self._protocol_live_runner:
192
+ return await self._protocol_live_runner.run(
193
+ deck_configuration=deck_configuration
194
+ )
195
+ else:
196
+ return await self._setup_runner.run(deck_configuration=deck_configuration)
197
+
198
+ def pause(self) -> None:
199
+ """Pause the run."""
200
+ self._protocol_engine.request_pause()
201
+
202
+ async def stop(self) -> None:
203
+ """Stop the run."""
204
+ if self.run_has_started():
205
+ await self._protocol_engine.request_stop()
206
+ else:
207
+ await self.finish(
208
+ drop_tips_after_run=False,
209
+ set_run_status=False,
210
+ post_run_hardware_state=PostRunHardwareState.STAY_ENGAGED_IN_PLACE,
211
+ )
212
+
213
+ def resume_from_recovery(self, reconcile_false_positive: bool) -> None:
214
+ """Resume the run from recovery."""
215
+ self._protocol_engine.resume_from_recovery(reconcile_false_positive)
216
+
217
+ async def finish(
218
+ self,
219
+ error: Optional[Exception] = None,
220
+ drop_tips_after_run: bool = True,
221
+ set_run_status: bool = True,
222
+ post_run_hardware_state: PostRunHardwareState = PostRunHardwareState.HOME_AND_STAY_ENGAGED,
223
+ ) -> None:
224
+ """Finish the run."""
225
+ await self._protocol_engine.finish(
226
+ error=error,
227
+ drop_tips_after_run=drop_tips_after_run,
228
+ set_run_status=set_run_status,
229
+ post_run_hardware_state=post_run_hardware_state,
230
+ )
231
+
232
+ def get_state_summary(self) -> StateSummary:
233
+ """Get protocol run data."""
234
+ return self._protocol_engine.state_view.get_summary()
235
+
236
+ def get_loaded_labware_definitions(self) -> List[LabwareDefinition]:
237
+ """Get loaded labware definitions."""
238
+ return self._protocol_engine.state_view.labware.get_loaded_labware_definitions()
239
+
240
+ def get_run_time_parameters(self) -> List[RunTimeParameter]:
241
+ """Get the list of run time parameters defined in the protocol, if any.
242
+
243
+ This returns a list of all run time parameters with their validated definitions
244
+ and client-requested values. Will always be empty before loading the runner.
245
+
246
+ If there was an error during RTP definition validation, then this list will
247
+ contain the parameter definitions that were validated before the error occurred.
248
+ These parameters' values will be default values.
249
+
250
+ If all definitions validated successfully but an error occurred while
251
+ setting the RTP values with those sent by the client, then only the parameters
252
+ whose values were successfully set will have the client-requested values while
253
+ the others will contain the default values.
254
+ """
255
+ return (
256
+ []
257
+ if self._protocol_runner is None
258
+ else self._protocol_runner.run_time_parameters
259
+ )
260
+
261
+ def get_command_annotations(self) -> List[CommandAnnotation]:
262
+ """Get the list of command annotations defined in the protocol, if any."""
263
+ return (
264
+ []
265
+ if self._protocol_runner is None
266
+ else self._protocol_runner.command_annotations
267
+ )
268
+
269
+ def get_current_command(self) -> Optional[CommandPointer]:
270
+ """Get the "current" command, if any."""
271
+ return self._protocol_engine.state_view.commands.get_current()
272
+
273
+ def get_most_recently_finalized_command(self) -> Optional[CommandPointer]:
274
+ """Get the most recently finalized command, if any."""
275
+ most_recently_finalized_command = (
276
+ self._protocol_engine.state_view.commands.get_most_recently_finalized_command()
277
+ )
278
+ return (
279
+ CommandPointer(
280
+ command_id=most_recently_finalized_command.command.id,
281
+ command_key=most_recently_finalized_command.command.key,
282
+ created_at=most_recently_finalized_command.command.createdAt,
283
+ index=most_recently_finalized_command.index,
284
+ )
285
+ if most_recently_finalized_command
286
+ else None
287
+ )
288
+
289
+ def get_command_slice(
290
+ self, cursor: Optional[int], length: int, include_fixit_commands: bool
291
+ ) -> CommandSlice:
292
+ """Get a slice of run commands.
293
+
294
+ Args:
295
+ cursor: Requested index of first command in the returned slice.
296
+ length: Length of slice to return.
297
+ include_fixit_commands: Get all command intents.
298
+ """
299
+ return self._protocol_engine.state_view.commands.get_slice(
300
+ cursor=cursor, length=length, include_fixit_commands=include_fixit_commands
301
+ )
302
+
303
+ def get_command_error_slice(
304
+ self,
305
+ cursor: int,
306
+ length: int,
307
+ ) -> CommandErrorSlice:
308
+ """Get a slice of run commands errors.
309
+
310
+ Args:
311
+ cursor: Requested index of first error in the returned slice.
312
+ If the cursor is omitted, a cursor will be selected automatically
313
+ based on the last error occurence.
314
+ length: Length of slice to return.
315
+ """
316
+ return self._protocol_engine.state_view.commands.get_errors_slice(
317
+ cursor=cursor, length=length
318
+ )
319
+
320
+ def get_command_recovery_target(self) -> Optional[CommandPointer]:
321
+ """Get the current error recovery target."""
322
+ return self._protocol_engine.state_view.commands.get_recovery_target()
323
+
324
+ def get_command(self, command_id: str) -> Command:
325
+ """Get a run's command by ID."""
326
+ return self._protocol_engine.state_view.commands.get(command_id=command_id)
327
+
328
+ def get_all_commands(self) -> List[Command]:
329
+ """Get all run commands."""
330
+ return self._protocol_engine.state_view.commands.get_all()
331
+
332
+ def get_command_errors(self) -> List[ErrorOccurrence]:
333
+ """Get all run command errors."""
334
+ return self._protocol_engine.state_view.commands.get_all_errors()
335
+
336
+ def get_run_status(self) -> EngineStatus:
337
+ """Get the current execution status of the engine."""
338
+ return self._protocol_engine.state_view.commands.get_status()
339
+
340
+ def get_is_run_terminal(self) -> bool:
341
+ """Get whether engine is in a terminal state."""
342
+ return self._protocol_engine.state_view.commands.get_is_terminal()
343
+
344
+ def run_has_started(self) -> bool:
345
+ """Get whether the run has started."""
346
+ return self._protocol_engine.state_view.commands.has_been_played()
347
+
348
+ def run_has_stopped(self) -> bool:
349
+ """Get whether the run has stopped."""
350
+ return self._protocol_engine.state_view.commands.get_is_stopped()
351
+
352
+ def add_labware_offset(
353
+ self, request: LabwareOffsetCreate | LegacyLabwareOffsetCreate
354
+ ) -> LabwareOffset:
355
+ """Add a new labware offset to state."""
356
+ return self._protocol_engine.add_labware_offset(request)
357
+
358
+ def add_labware_definition(self, definition: LabwareDefinition) -> LabwareUri:
359
+ """Add a new labware definition to state."""
360
+ return self._protocol_engine.add_labware_definition(definition)
361
+
362
+ async def add_command_and_wait_for_interval(
363
+ self,
364
+ command: CommandCreate,
365
+ wait_until_complete: bool = False,
366
+ timeout: Optional[int] = None,
367
+ failed_command_id: Optional[str] = None,
368
+ ) -> Command:
369
+ """Add a new command to execute and wait for it to complete if needed."""
370
+ added_command = self._protocol_engine.add_command(
371
+ request=command, failed_command_id=failed_command_id
372
+ )
373
+ if wait_until_complete:
374
+ timeout_sec = None if timeout is None else timeout / 1000.0
375
+ with move_on_after(timeout_sec):
376
+ await self._protocol_engine.wait_for_command(added_command.id)
377
+ return added_command
378
+
379
+ def estop(self) -> None:
380
+ """Handle an E-stop event from the hardware API."""
381
+ return self._protocol_engine.estop()
382
+
383
+ async def use_attached_modules(
384
+ self, modules_by_id: Dict[str, HardwareModuleAPI]
385
+ ) -> None:
386
+ """Load attached modules directly into state, without locations."""
387
+ await self._protocol_engine.use_attached_modules(modules_by_id=modules_by_id)
388
+
389
+ def get_protocol_runner(self) -> Optional[Union[JsonRunner, PythonAndLegacyRunner]]:
390
+ """Get run's protocol runner if any, if not return None."""
391
+ return self._protocol_runner
392
+
393
+ async def load(
394
+ self,
395
+ protocol_source: ProtocolSource,
396
+ run_time_param_values: Optional[PrimitiveRunTimeParamValuesType],
397
+ run_time_param_paths: Optional[CSVRuntimeParamPaths],
398
+ parse_mode: ParseMode,
399
+ ) -> None:
400
+ """Load a json/python protocol."""
401
+ assert self._protocol_runner is not None
402
+ if isinstance(self._protocol_runner, JsonRunner):
403
+ await self._protocol_runner.load(protocol_source=protocol_source)
404
+ elif isinstance(self._protocol_runner, PythonAndLegacyRunner):
405
+ python_parse_mode = self._map_parse_mode_to_python_parse_mode(parse_mode)
406
+ await self._protocol_runner.load(
407
+ protocol_source=protocol_source,
408
+ # Conservatively assume that we're re-running a protocol that
409
+ # was uploaded before we added stricter validation, and that
410
+ # doesn't conform to the new rules.
411
+ python_parse_mode=python_parse_mode,
412
+ run_time_param_values=run_time_param_values,
413
+ run_time_param_paths=run_time_param_paths,
414
+ )
415
+
416
+ def get_is_okay_to_clear(self) -> bool:
417
+ """Get whether the engine is stopped or sitting idly, so it could be removed."""
418
+ return self._protocol_engine.state_view.commands.get_is_okay_to_clear()
419
+
420
+ def prepare(self) -> None:
421
+ """Prepare live runner for a run."""
422
+ self._protocol_live_runner.prepare()
423
+
424
+ def get_robot_type(self) -> RobotType:
425
+ """Get engine robot type."""
426
+ return self._protocol_engine.state_view.config.robot_type
427
+
428
+ def get_deck_type(self) -> DeckType:
429
+ """Get engine deck type."""
430
+ return self._protocol_engine.state_view.config.deck_type
431
+
432
+ def get_nozzle_maps(self) -> Mapping[str, NozzleMapInterface]:
433
+ """Get current nozzle maps keyed by pipette id."""
434
+ return self._protocol_engine.state_view.pipettes.get_nozzle_configurations()
435
+
436
+ def get_tip_attached(self) -> Dict[str, bool]:
437
+ """Get current tip state keyed by pipette id."""
438
+
439
+ def has_tip_attached(pipette_id: str) -> bool:
440
+ return (
441
+ self._protocol_engine.state_view.pipettes.get_attached_tip(pipette_id)
442
+ is not None
443
+ )
444
+
445
+ pipette_ids = (
446
+ pipette.id
447
+ for pipette in self._protocol_engine.state_view.pipettes.get_all()
448
+ )
449
+ return {pipette_id: has_tip_attached(pipette_id) for pipette_id in pipette_ids}
450
+
451
+ def set_error_recovery_policy(self, policy: ErrorRecoveryPolicy) -> None:
452
+ """Create error recovery policy for the run."""
453
+ self._protocol_engine.set_error_recovery_policy(policy)
454
+
455
+ def get_flex_stacker_substate(self) -> Mapping[str, FlexStackerSubState]:
456
+ """Get current (if any) Flex Stacker Substates keyed by module id."""
457
+ modules = self._protocol_engine.state_view.modules.get_all()
458
+ stackers: Dict[str, FlexStackerSubState] = {}
459
+ for module in modules:
460
+ if module.model == ModuleModel.FLEX_STACKER_MODULE_V1:
461
+ stackers[
462
+ module.id
463
+ ] = self._protocol_engine.state_view.modules.get_flex_stacker_substate(
464
+ module.id
465
+ )
466
+ return stackers
467
+
468
+ async def command_generator(self) -> AsyncGenerator[str, None]:
469
+ """Yield next command to execute."""
470
+ while True:
471
+ try:
472
+ # TODO(tz, 6-26-2024): avoid using private accessor in a follow up pr.
473
+ command_id = await self._protocol_engine._state_store.wait_for(
474
+ condition=self._protocol_engine.state_view.commands.get_next_to_execute
475
+ )
476
+ # Assert for type hinting. This is valid because the wait_for() above
477
+ # only returns when the value is truthy.
478
+ assert command_id is not None
479
+ yield command_id
480
+ except RunStoppedError:
481
+ # There are no more commands that we should execute, either because the run has
482
+ # completed on its own, or because a client requested it to stop.
483
+ break
484
+
485
+ @staticmethod
486
+ def _map_parse_mode_to_python_parse_mode(parse_mode: ParseMode) -> PythonParseMode:
487
+ if parse_mode == ParseMode.NORMAL:
488
+ return PythonParseMode.NORMAL
489
+ elif parse_mode == ParseMode.ALLOW_LEGACY_METADATA_AND_REQUIREMENTS:
490
+ return PythonParseMode.ALLOW_LEGACY_METADATA_AND_REQUIREMENTS
491
+ else:
492
+ raise UnknownProtocolParseMode()
493
+
494
+ def clear_command_history(self) -> None:
495
+ """Force cleanup of command history."""
496
+ self._protocol_engine.clear_command_history()