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,76 @@
1
+ """Wait for duration command request, result, and implementation models."""
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING, Optional, Type, Any
4
+
5
+ from pydantic import BaseModel, Field
6
+ from pydantic.json_schema import SkipJsonSchema
7
+ from typing_extensions import Literal
8
+
9
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
10
+ from ..errors.error_occurrence import ErrorOccurrence
11
+
12
+ if TYPE_CHECKING:
13
+ from ..execution import RunControlHandler
14
+
15
+
16
+ WaitForDurationCommandType = Literal["waitForDuration"]
17
+
18
+
19
+ def _remove_default(s: dict[str, Any]) -> None:
20
+ s.pop("default", None)
21
+
22
+
23
+ class WaitForDurationParams(BaseModel):
24
+ """Payload required to pause the protocol."""
25
+
26
+ seconds: float = Field(..., description="Duration, in seconds, to wait for.")
27
+ message: str | SkipJsonSchema[None] = Field(
28
+ None,
29
+ description="A user-facing message associated with the pause",
30
+ json_schema_extra=_remove_default,
31
+ )
32
+
33
+
34
+ class WaitForDurationResult(BaseModel):
35
+ """Result data from the execution of a wait for duration command."""
36
+
37
+
38
+ class WaitForDurationImplementation(
39
+ AbstractCommandImpl[WaitForDurationParams, SuccessData[WaitForDurationResult]]
40
+ ):
41
+ """Wait for duration command implementation."""
42
+
43
+ def __init__(self, run_control: RunControlHandler, **kwargs: object) -> None:
44
+ self._run_control = run_control
45
+
46
+ async def execute(
47
+ self, params: WaitForDurationParams
48
+ ) -> SuccessData[WaitForDurationResult]:
49
+ """Wait for a duration of time."""
50
+ await self._run_control.wait_for_duration(params.seconds)
51
+ return SuccessData(
52
+ public=WaitForDurationResult(),
53
+ )
54
+
55
+
56
+ class WaitForDuration(
57
+ BaseCommand[WaitForDurationParams, WaitForDurationResult, ErrorOccurrence]
58
+ ):
59
+ """Wait for duration command model."""
60
+
61
+ commandType: WaitForDurationCommandType = "waitForDuration"
62
+ params: WaitForDurationParams
63
+ result: Optional[WaitForDurationResult] = None
64
+
65
+ _ImplementationCls: Type[
66
+ WaitForDurationImplementation
67
+ ] = WaitForDurationImplementation
68
+
69
+
70
+ class WaitForDurationCreate(BaseCommandCreate[WaitForDurationParams]):
71
+ """Wait for duration command request model."""
72
+
73
+ commandType: WaitForDurationCommandType = "waitForDuration"
74
+ params: WaitForDurationParams
75
+
76
+ _CommandCls: Type[WaitForDuration] = WaitForDuration
@@ -0,0 +1,75 @@
1
+ """Wait for resume command request, result, and implementation models."""
2
+ from __future__ import annotations
3
+ from typing import TYPE_CHECKING, Optional, Type, Any
4
+
5
+ from pydantic import BaseModel, Field
6
+ from pydantic.json_schema import SkipJsonSchema
7
+ from typing_extensions import Literal
8
+
9
+ from .command import AbstractCommandImpl, BaseCommand, BaseCommandCreate, SuccessData
10
+ from ..errors.error_occurrence import ErrorOccurrence
11
+
12
+ if TYPE_CHECKING:
13
+ from ..execution import RunControlHandler
14
+
15
+
16
+ # NOTE: multiple values accepted for backwards compatibility
17
+ # with the 6.0.0-beta.0 release, which used `pause`
18
+ WaitForResumeCommandType = Literal["waitForResume", "pause"]
19
+
20
+
21
+ def _remove_default(s: dict[str, Any]) -> None:
22
+ s.pop("default", None)
23
+
24
+
25
+ class WaitForResumeParams(BaseModel):
26
+ """Payload required to pause the protocol."""
27
+
28
+ message: str | SkipJsonSchema[None] = Field(
29
+ None,
30
+ description="A user-facing message associated with the pause",
31
+ json_schema_extra=_remove_default,
32
+ )
33
+
34
+
35
+ class WaitForResumeResult(BaseModel):
36
+ """Result data from the execution of a WaitForResume command."""
37
+
38
+
39
+ class WaitForResumeImplementation(
40
+ AbstractCommandImpl[WaitForResumeParams, SuccessData[WaitForResumeResult]]
41
+ ):
42
+ """Wait for resume command implementation."""
43
+
44
+ def __init__(self, run_control: RunControlHandler, **kwargs: object) -> None:
45
+ self._run_control = run_control
46
+
47
+ async def execute(
48
+ self, params: WaitForResumeParams
49
+ ) -> SuccessData[WaitForResumeResult]:
50
+ """Dispatch a PauseAction to the store to pause the protocol."""
51
+ await self._run_control.wait_for_resume()
52
+ return SuccessData(
53
+ public=WaitForResumeResult(),
54
+ )
55
+
56
+
57
+ class WaitForResume(
58
+ BaseCommand[WaitForResumeParams, WaitForResumeResult, ErrorOccurrence]
59
+ ):
60
+ """Wait for resume command model."""
61
+
62
+ commandType: WaitForResumeCommandType = "waitForResume"
63
+ params: WaitForResumeParams
64
+ result: Optional[WaitForResumeResult] = None
65
+
66
+ _ImplementationCls: Type[WaitForResumeImplementation] = WaitForResumeImplementation
67
+
68
+
69
+ class WaitForResumeCreate(BaseCommandCreate[WaitForResumeParams]):
70
+ """Wait for resume command request model."""
71
+
72
+ commandType: WaitForResumeCommandType = "waitForResume"
73
+ params: WaitForResumeParams
74
+
75
+ _CommandCls: Type[WaitForResume] = WaitForResume
@@ -0,0 +1,193 @@
1
+ """Main ProtocolEngine factory."""
2
+ import asyncio
3
+ import contextlib
4
+ import typing
5
+
6
+ from opentrons.hardware_control import HardwareControlAPI
7
+ from opentrons.hardware_control.types import DoorState
8
+ from opentrons.protocol_engine.execution.error_recovery_hardware_state_synchronizer import (
9
+ ErrorRecoveryHardwareStateSynchronizer,
10
+ )
11
+ from opentrons.protocol_engine.resources.labware_data_provider import (
12
+ LabwareDataProvider,
13
+ )
14
+ from opentrons.util.async_helpers import async_context_manager_in_thread
15
+
16
+ from opentrons_shared_data.robot import load as load_robot
17
+
18
+ from .actions.action_dispatcher import ActionDispatcher
19
+ from .error_recovery_policy import ErrorRecoveryPolicy
20
+ from .execution.door_watcher import DoorWatcher
21
+ from .execution.hardware_stopper import HardwareStopper
22
+ from .plugins import PluginStarter
23
+ from .protocol_engine import ProtocolEngine
24
+ from .resources import DeckDataProvider, ModuleDataProvider, FileProvider, ModelUtils
25
+ from .state.config import Config
26
+ from .state.state import StateStore
27
+ from .types import PostRunHardwareState, DeckConfigurationType
28
+
29
+ from .engine_support import create_run_orchestrator
30
+
31
+
32
+ # TODO(mm, 2023-06-16): Arguably, this not being a context manager makes us prone to forgetting to
33
+ # clean it up properly, especially in tests. See e.g. https://opentrons.atlassian.net/browse/RSS-222
34
+ async def create_protocol_engine(
35
+ hardware_api: HardwareControlAPI,
36
+ config: Config,
37
+ error_recovery_policy: ErrorRecoveryPolicy,
38
+ load_fixed_trash: bool = False,
39
+ deck_configuration: typing.Optional[DeckConfigurationType] = None,
40
+ file_provider: typing.Optional[FileProvider] = None,
41
+ notify_publishers: typing.Optional[typing.Callable[[], None]] = None,
42
+ ) -> ProtocolEngine:
43
+ """Create a ProtocolEngine instance.
44
+
45
+ Arguments:
46
+ hardware_api: Hardware control API to pass down to dependencies.
47
+ config: ProtocolEngine configuration.
48
+ error_recovery_policy: The error recovery policy to create the engine with.
49
+ See documentation on `ErrorRecoveryPolicy`.
50
+ load_fixed_trash: Automatically load fixed trash labware in engine.
51
+ deck_configuration: The initial deck configuration the engine will be instantiated with.
52
+ file_provider: Provides access to robot server file writing procedures for protocol output.
53
+ notify_publishers: Notifies robot server publishers of internal state change.
54
+ """
55
+ deck_data = DeckDataProvider(config.deck_type)
56
+ deck_definition = await deck_data.get_deck_definition()
57
+ deck_fixed_labware = await deck_data.get_deck_fixed_labware(
58
+ load_fixed_trash, deck_definition, deck_configuration
59
+ )
60
+
61
+ module_calibration_offsets = ModuleDataProvider.load_module_calibrations()
62
+ robot_definition = load_robot(config.robot_type)
63
+
64
+ state_store = StateStore(
65
+ config=config,
66
+ deck_definition=deck_definition,
67
+ deck_fixed_labware=deck_fixed_labware,
68
+ robot_definition=robot_definition,
69
+ is_door_open=hardware_api.door_state is DoorState.OPEN,
70
+ error_recovery_policy=error_recovery_policy,
71
+ module_calibration_offsets=module_calibration_offsets,
72
+ deck_configuration=deck_configuration,
73
+ notify_publishers=notify_publishers,
74
+ )
75
+ hardware_state_synchronizer = ErrorRecoveryHardwareStateSynchronizer(
76
+ hardware_api, state_store
77
+ )
78
+ action_dispatcher = ActionDispatcher(state_store)
79
+ action_dispatcher.add_handler(hardware_state_synchronizer)
80
+ plugin_starter = PluginStarter(state_store, action_dispatcher)
81
+ model_utils = ModelUtils()
82
+ hardware_stopper = HardwareStopper(hardware_api, state_store)
83
+ door_watcher = DoorWatcher(state_store, hardware_api, action_dispatcher)
84
+ module_data_provider = ModuleDataProvider()
85
+ file_provider = file_provider or FileProvider()
86
+
87
+ pe = ProtocolEngine(
88
+ hardware_api=hardware_api,
89
+ state_store=state_store,
90
+ action_dispatcher=action_dispatcher,
91
+ plugin_starter=plugin_starter,
92
+ model_utils=model_utils,
93
+ hardware_stopper=hardware_stopper,
94
+ door_watcher=door_watcher,
95
+ module_data_provider=module_data_provider,
96
+ file_provider=file_provider,
97
+ )
98
+
99
+ # todo(mm, 2024-11-08): This is a quick hack to support the absorbance reader, which
100
+ # expects the engine to have this special labware definition available. It would be
101
+ # cleaner for the `loadModule` command to do this I/O and insert the definition
102
+ # into state. That gets easier after https://opentrons.atlassian.net/browse/EXEC-756.
103
+ #
104
+ # NOTE: This needs to stay in sync with LabwareView.get_absorbance_reader_lid_definition().
105
+ pe.add_labware_definition(
106
+ await LabwareDataProvider().get_labware_definition(
107
+ "opentrons_flex_lid_absorbance_plate_reader_module", "opentrons", 1
108
+ )
109
+ )
110
+
111
+ return pe
112
+
113
+
114
+ @contextlib.contextmanager
115
+ def create_protocol_engine_in_thread(
116
+ hardware_api: HardwareControlAPI,
117
+ config: Config,
118
+ deck_configuration: typing.Optional[DeckConfigurationType],
119
+ file_provider: typing.Optional[FileProvider],
120
+ error_recovery_policy: ErrorRecoveryPolicy,
121
+ drop_tips_after_run: bool,
122
+ post_run_hardware_state: PostRunHardwareState,
123
+ load_fixed_trash: bool = False,
124
+ ) -> typing.Generator[
125
+ typing.Tuple[ProtocolEngine, asyncio.AbstractEventLoop], None, None
126
+ ]:
127
+ """Run a `ProtocolEngine` in a worker thread.
128
+
129
+ When this context manager is entered, it:
130
+
131
+ 1. Starts a worker thread.
132
+ 2. Starts an asyncio event loop in that worker thread.
133
+ 3. Creates and `.play()`s a `ProtocolEngine` in that event loop.
134
+ 4. Returns the `ProtocolEngine` and the event loop.
135
+ Use functions like `asyncio.run_coroutine_threadsafe()` to safely interact with
136
+ the `ProtocolEngine` from your thread.
137
+
138
+ When this context manager is exited, it:
139
+
140
+ 1. Cleans up the `ProtocolEngine`.
141
+ 2. Stops and cleans up the event loop.
142
+ 3. Joins the thread.
143
+ """
144
+ with async_context_manager_in_thread(
145
+ _protocol_engine(
146
+ hardware_api,
147
+ file_provider,
148
+ config,
149
+ deck_configuration,
150
+ error_recovery_policy,
151
+ drop_tips_after_run,
152
+ post_run_hardware_state,
153
+ load_fixed_trash,
154
+ )
155
+ ) as (
156
+ protocol_engine,
157
+ loop,
158
+ ):
159
+ yield protocol_engine, loop
160
+
161
+
162
+ @contextlib.asynccontextmanager
163
+ async def _protocol_engine(
164
+ hardware_api: HardwareControlAPI,
165
+ file_provider: typing.Optional[FileProvider],
166
+ config: Config,
167
+ deck_configuration: typing.Optional[DeckConfigurationType],
168
+ error_recovery_policy: ErrorRecoveryPolicy,
169
+ drop_tips_after_run: bool,
170
+ post_run_hardware_state: PostRunHardwareState,
171
+ load_fixed_trash: bool = False,
172
+ ) -> typing.AsyncGenerator[ProtocolEngine, None]:
173
+ protocol_engine = await create_protocol_engine(
174
+ hardware_api=hardware_api,
175
+ file_provider=file_provider,
176
+ config=config,
177
+ error_recovery_policy=error_recovery_policy,
178
+ load_fixed_trash=load_fixed_trash,
179
+ )
180
+
181
+ # TODO(tz, 6-20-2024): This feels like a hack, we should probably return the orchestrator instead of pe.
182
+ orchestrator = create_run_orchestrator(
183
+ hardware_api=hardware_api,
184
+ protocol_engine=protocol_engine,
185
+ )
186
+ try:
187
+ orchestrator.play(deck_configuration)
188
+ yield protocol_engine
189
+ finally:
190
+ await orchestrator.finish(
191
+ drop_tips_after_run=drop_tips_after_run,
192
+ post_run_hardware_state=post_run_hardware_state,
193
+ )
@@ -0,0 +1,28 @@
1
+ """Support for create_protocol_engine module."""
2
+ from . import ProtocolEngine
3
+ from ..hardware_control import HardwareControlAPI
4
+
5
+ from opentrons.protocol_runner import protocol_runner, RunOrchestrator
6
+
7
+
8
+ def create_run_orchestrator(
9
+ hardware_api: HardwareControlAPI,
10
+ protocol_engine: ProtocolEngine,
11
+ ) -> RunOrchestrator:
12
+ """Create a RunOrchestrator instance."""
13
+ return RunOrchestrator(
14
+ protocol_engine=protocol_engine,
15
+ hardware_api=hardware_api,
16
+ setup_runner=protocol_runner.LiveRunner(
17
+ protocol_engine=protocol_engine,
18
+ hardware_api=hardware_api,
19
+ ),
20
+ fixit_runner=protocol_runner.LiveRunner(
21
+ protocol_engine=protocol_engine,
22
+ hardware_api=hardware_api,
23
+ ),
24
+ protocol_live_runner=protocol_runner.LiveRunner(
25
+ protocol_engine=protocol_engine,
26
+ hardware_api=hardware_api,
27
+ ),
28
+ )
@@ -0,0 +1,81 @@
1
+ # noqa: D100
2
+
3
+ from __future__ import annotations
4
+
5
+ import enum
6
+ from typing import Optional, Protocol, TYPE_CHECKING
7
+
8
+ if TYPE_CHECKING:
9
+ from opentrons.protocol_engine.commands import (
10
+ Command,
11
+ CommandDefinedErrorData,
12
+ )
13
+ from opentrons.protocol_engine.state.config import Config
14
+
15
+
16
+ class ErrorRecoveryType(enum.Enum):
17
+ """Ways to handle a command failure."""
18
+
19
+ FAIL_RUN = enum.auto()
20
+ """Permanently fail the entire run.
21
+
22
+ TODO(mm, 2024-03-18): This might be a misnomer because failing the run is not
23
+ a decision that's up to Protocol Engine. It's decided by what the caller supplies
24
+ to `ProtocolEngine.finish()`. For example, a Python protocol can
25
+ theoretically swallow the exception and continue on.
26
+ """
27
+
28
+ WAIT_FOR_RECOVERY = enum.auto()
29
+ """Enter interactive error recovery mode."""
30
+
31
+ CONTINUE_WITH_ERROR = enum.auto()
32
+ """Continue without interruption, carrying on from whatever error state the failed
33
+ command left the engine in.
34
+
35
+ This is like `ProtocolEngine.resume_from_recovery(reconcile_false_positive=False)`.
36
+ """
37
+
38
+ ASSUME_FALSE_POSITIVE_AND_CONTINUE = enum.auto()
39
+ """Continue without interruption, acting as if the underlying error was a false positive.
40
+
41
+ This is like `ProtocolEngine.resume_from_recovery(reconcile_false_positive=True)`.
42
+ """
43
+
44
+
45
+ class ErrorRecoveryPolicy(Protocol):
46
+ """An interface to decide how to handle a command failure.
47
+
48
+ This describes a function that Protocol Engine calls after each command failure,
49
+ with the details of that failure. The implementation should inspect those details
50
+ and return an appropriate `ErrorRecoveryType`.
51
+
52
+ Args:
53
+ config: The config of the calling `ProtocolEngine`.
54
+ failed_command: The command that failed, in its final `status=="failed"` state.
55
+ defined_error_data: If the command failed with a defined error, details about
56
+ that error. If the command failed with an undefined error, `None`.
57
+ By design, this callable isn't given details about undefined errors,
58
+ since it would be fragile to rely on them.
59
+ """
60
+
61
+ @staticmethod
62
+ def __call__( # noqa: D102
63
+ config: Config,
64
+ failed_command: Command,
65
+ defined_error_data: Optional[CommandDefinedErrorData],
66
+ ) -> ErrorRecoveryType:
67
+ ...
68
+
69
+
70
+ def never_recover(
71
+ config: Config,
72
+ failed_command: Command,
73
+ defined_error_data: Optional[CommandDefinedErrorData],
74
+ ) -> ErrorRecoveryType:
75
+ """An error recovery policy where error recovery is never attempted.
76
+
77
+ This makes sense for things like the `opentrons_simulate` and `opentrons_execute`
78
+ CLIs. Those don't expose any way to bring the run out of recovery mode after it's
79
+ been entered, so we need to avoid entering recovery mode in the first place.
80
+ """
81
+ return ErrorRecoveryType.FAIL_RUN
@@ -0,0 +1,191 @@
1
+ """Protocol engine errors module."""
2
+
3
+ from .exceptions import (
4
+ ProtocolEngineError,
5
+ UnexpectedProtocolError,
6
+ FailedToLoadPipetteError,
7
+ PipetteNotAttachedError,
8
+ InvalidSpecificationForRobotTypeError,
9
+ InvalidLoadPipetteSpecsError,
10
+ TipNotAttachedError,
11
+ PickUpTipTipNotAttachedError,
12
+ TipAttachedError,
13
+ CommandDoesNotExistError,
14
+ UnsupportedLabwareForActionError,
15
+ LabwareNotLoadedError,
16
+ LabwareNotLoadedOnModuleError,
17
+ LabwareNotLoadedOnLabwareError,
18
+ LabwareNotOnDeckError,
19
+ LiquidDoesNotExistError,
20
+ LabwareDefinitionDoesNotExistError,
21
+ LabwareCannotBeStackedError,
22
+ LabwareCannotSitOnDeckError,
23
+ LabwareIsInStackError,
24
+ LabwareOffsetDoesNotExistError,
25
+ LabwareIsNotTipRackError,
26
+ LabwareIsTipRackError,
27
+ LabwareIsAdapterError,
28
+ TouchTipDisabledError,
29
+ TouchTipIncompatibleArgumentsError,
30
+ WellDoesNotExistError,
31
+ PipetteNotLoadedError,
32
+ ModuleNotLoadedError,
33
+ ModuleNotOnDeckError,
34
+ ModuleNotConnectedError,
35
+ SlotDoesNotExistError,
36
+ CutoutDoesNotExistError,
37
+ FixtureDoesNotExistError,
38
+ AddressableAreaDoesNotExistError,
39
+ FixtureDoesNotProvideAreasError,
40
+ AreaNotInDeckConfigurationError,
41
+ IncompatibleAddressableAreaError,
42
+ FailedToPlanMoveError,
43
+ MustHomeError,
44
+ RunStoppedError,
45
+ SetupCommandNotAllowedError,
46
+ FixitCommandNotAllowedError,
47
+ ModuleNotAttachedError,
48
+ ModuleAlreadyPresentError,
49
+ WrongModuleTypeError,
50
+ ThermocyclerNotOpenError,
51
+ RobotDoorOpenError,
52
+ PipetteMovementRestrictedByHeaterShakerError,
53
+ HeaterShakerLabwareLatchNotOpenError,
54
+ HeaterShakerLabwareLatchStatusUnknown,
55
+ EngageHeightOutOfRangeError,
56
+ NoTargetTemperatureSetError,
57
+ InvalidTargetSpeedError,
58
+ InvalidTargetTemperatureError,
59
+ InvalidBlockVolumeError,
60
+ InvalidHoldTimeError,
61
+ InvalidWavelengthError,
62
+ CannotPerformModuleAction,
63
+ PauseNotAllowedError,
64
+ ResumeFromRecoveryNotAllowedError,
65
+ GripperNotAttachedError,
66
+ CannotPerformGripperAction,
67
+ HardwareNotSupportedError,
68
+ LabwareMovementNotAllowedError,
69
+ LabwareIsNotAllowedInLocationError,
70
+ LocationIsOccupiedError,
71
+ LocationNotAccessibleByPipetteError,
72
+ LocationIsStagingSlotError,
73
+ LocationIsLidDockSlotError,
74
+ InvalidAxisForRobotType,
75
+ NotSupportedOnRobotType,
76
+ CommandNotAllowedError,
77
+ InvalidLiquidHeightFound,
78
+ LiquidHeightUnknownError,
79
+ LiquidVolumeUnknownError,
80
+ IncompleteLabwareDefinitionError,
81
+ InvalidUserDefinedVolumesError,
82
+ IncompleteWellDefinitionError,
83
+ OperationLocationNotInWellError,
84
+ InvalidDispenseVolumeError,
85
+ StorageLimitReachedError,
86
+ InvalidLiquidError,
87
+ LiquidClassDoesNotExistError,
88
+ LiquidClassRedefinitionError,
89
+ OffsetLocationInvalidError,
90
+ FlexStackerLabwarePoolNotYetDefinedError,
91
+ FlexStackerNotLogicallyEmptyError,
92
+ InvalidLabwarePositionError,
93
+ )
94
+
95
+ from .error_occurrence import ErrorOccurrence, ProtocolCommandFailedError
96
+
97
+ __all__ = [
98
+ # exceptions
99
+ "ProtocolEngineError",
100
+ "UnexpectedProtocolError",
101
+ "FailedToLoadPipetteError",
102
+ "PipetteNotAttachedError",
103
+ "InvalidSpecificationForRobotTypeError",
104
+ "InvalidLoadPipetteSpecsError",
105
+ "TipNotAttachedError",
106
+ "PickUpTipTipNotAttachedError",
107
+ "TipAttachedError",
108
+ "CommandDoesNotExistError",
109
+ "LabwareNotLoadedError",
110
+ "LabwareNotLoadedOnModuleError",
111
+ "LabwareNotLoadedOnLabwareError",
112
+ "LabwareNotOnDeckError",
113
+ "LiquidDoesNotExistError",
114
+ "UnsupportedLabwareForActionError",
115
+ "LabwareDefinitionDoesNotExistError",
116
+ "LabwareCannotBeStackedError",
117
+ "LabwareCannotSitOnDeckError",
118
+ "LabwareIsInStackError",
119
+ "LabwareOffsetDoesNotExistError",
120
+ "LabwareIsNotTipRackError",
121
+ "LabwareIsTipRackError",
122
+ "LabwareIsAdapterError",
123
+ "TouchTipDisabledError",
124
+ "TouchTipIncompatibleArgumentsError",
125
+ "WellDoesNotExistError",
126
+ "PipetteNotLoadedError",
127
+ "ModuleNotLoadedError",
128
+ "ModuleNotOnDeckError",
129
+ "ModuleNotConnectedError",
130
+ "SlotDoesNotExistError",
131
+ "CutoutDoesNotExistError",
132
+ "FixtureDoesNotExistError",
133
+ "AddressableAreaDoesNotExistError",
134
+ "FixtureDoesNotProvideAreasError",
135
+ "AreaNotInDeckConfigurationError",
136
+ "IncompatibleAddressableAreaError",
137
+ "FailedToPlanMoveError",
138
+ "MustHomeError",
139
+ "RunStoppedError",
140
+ "SetupCommandNotAllowedError",
141
+ "FixitCommandNotAllowedError",
142
+ "ModuleNotAttachedError",
143
+ "ModuleAlreadyPresentError",
144
+ "WrongModuleTypeError",
145
+ "ThermocyclerNotOpenError",
146
+ "RobotDoorOpenError",
147
+ "PipetteMovementRestrictedByHeaterShakerError",
148
+ "HeaterShakerLabwareLatchNotOpenError",
149
+ "HeaterShakerLabwareLatchStatusUnknown",
150
+ "EngageHeightOutOfRangeError",
151
+ "NoTargetTemperatureSetError",
152
+ "InvalidTargetTemperatureError",
153
+ "InvalidTargetSpeedError",
154
+ "InvalidBlockVolumeError",
155
+ "InvalidHoldTimeError",
156
+ "InvalidLiquidError",
157
+ "InvalidWavelengthError",
158
+ "CannotPerformModuleAction",
159
+ "ResumeFromRecoveryNotAllowedError",
160
+ "PauseNotAllowedError",
161
+ "ProtocolCommandFailedError",
162
+ "GripperNotAttachedError",
163
+ "CannotPerformGripperAction",
164
+ "HardwareNotSupportedError",
165
+ "LabwareMovementNotAllowedError",
166
+ "LabwareIsNotAllowedInLocationError",
167
+ "LocationIsOccupiedError",
168
+ "LocationNotAccessibleByPipetteError",
169
+ "LocationIsStagingSlotError",
170
+ "LocationIsLidDockSlotError",
171
+ "InvalidAxisForRobotType",
172
+ "NotSupportedOnRobotType",
173
+ "OffsetLocationInvalidError",
174
+ "FlexStackerLabwarePoolNotYetDefinedError",
175
+ "FlexStackerNotLogicallyEmptyError",
176
+ "InvalidLabwarePositionError",
177
+ # error occurrence models
178
+ "ErrorOccurrence",
179
+ "CommandNotAllowedError",
180
+ "InvalidLiquidHeightFound",
181
+ "LiquidHeightUnknownError",
182
+ "LiquidVolumeUnknownError",
183
+ "IncompleteLabwareDefinitionError",
184
+ "InvalidUserDefinedVolumesError",
185
+ "IncompleteWellDefinitionError",
186
+ "OperationLocationNotInWellError",
187
+ "InvalidDispenseVolumeError",
188
+ "StorageLimitReachedError",
189
+ "LiquidClassDoesNotExistError",
190
+ "LiquidClassRedefinitionError",
191
+ ]