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,359 @@
1
+ import logging
2
+ from typing import Dict, List, TYPE_CHECKING, Union
3
+ from opentrons.hardware_control.modules.types import ThermocyclerStep
4
+ from opentrons.protocol_api import (
5
+ ProtocolContext,
6
+ MagneticModuleContext,
7
+ TemperatureModuleContext,
8
+ ModuleContext,
9
+ ThermocyclerContext,
10
+ )
11
+ from opentrons_shared_data.protocol.types import (
12
+ MagneticModuleCommand,
13
+ TemperatureModuleCommand,
14
+ ThermocyclerCommand,
15
+ )
16
+ from .execute_json_v3 import _delay, _move_to_slot
17
+ from opentrons.protocols.execution.types import LoadedLabware, Instruments
18
+ from opentrons_shared_data.protocol.constants import (
19
+ JsonRobotCommand,
20
+ JsonPipetteCommand,
21
+ )
22
+
23
+
24
+ if TYPE_CHECKING:
25
+ from opentrons_shared_data.protocol.types import (
26
+ JsonProtocolV4,
27
+ JsonProtocolV5,
28
+ MagneticModuleEngageParams,
29
+ ModuleIDParams,
30
+ TemperatureParams,
31
+ ThermocyclerSetTargetBlockParams,
32
+ ThermocyclerRunProfileParams,
33
+ Command,
34
+ TemperatureModuleCommandId,
35
+ MagneticModuleCommandId,
36
+ ThermocyclerCommandId,
37
+ )
38
+ from opentrons.protocols.execution.dev_types import (
39
+ PipetteDispatch,
40
+ JsonV4MagneticModuleDispatch,
41
+ JsonV4TemperatureModuleDispatch,
42
+ JsonV4ThermocyclerDispatch,
43
+ )
44
+
45
+ MODULE_LOG = logging.getLogger(__name__)
46
+
47
+ # Special string for slot used by thermocycler in JSON protocols.
48
+ TC_SPANNING_SLOT = "span7_8_10_11"
49
+
50
+
51
+ def load_labware_from_json_defs(
52
+ ctx: ProtocolContext, protocol: "JsonProtocolV4", modules: Dict[str, ModuleContext]
53
+ ) -> LoadedLabware:
54
+ protocol_labware = protocol["labware"]
55
+ definitions = protocol["labwareDefinitions"]
56
+ loaded_labware = {}
57
+
58
+ for labware_id, props in protocol_labware.items():
59
+ slot = props["slot"]
60
+ definition = definitions[props["definitionId"]]
61
+ label = props.get("displayName", None)
62
+ if slot in modules:
63
+ loaded_labware[labware_id] = modules[slot].load_labware_from_definition(
64
+ definition, label
65
+ )
66
+ else:
67
+ loaded_labware[labware_id] = ctx.load_labware_from_definition(
68
+ definition, slot, label
69
+ )
70
+
71
+ return loaded_labware
72
+
73
+
74
+ def load_modules_from_json(
75
+ ctx: ProtocolContext, protocol: "JsonProtocolV4"
76
+ ) -> Dict[str, ModuleContext]:
77
+ module_data = protocol["modules"]
78
+ modules_by_id: Dict[str, ModuleContext] = {}
79
+
80
+ # the sort order doesn't matter, we just need it to be stable
81
+ # to ensure `load_module` side-effects are deterministic
82
+ # (eg, multiple module support)
83
+ sorted_modules = sorted(
84
+ module_data.items(), key=lambda v: v[1]["slot"] + v[1]["model"]
85
+ )
86
+
87
+ for module_id, module_props in sorted_modules:
88
+ model = module_props["model"]
89
+ slot = module_props["slot"]
90
+ if slot == TC_SPANNING_SLOT:
91
+ instr = ctx.load_module(model)
92
+ else:
93
+ instr = ctx.load_module(model, slot)
94
+ modules_by_id[module_id] = instr
95
+
96
+ return modules_by_id
97
+
98
+
99
+ def _engage_magnet(
100
+ module: MagneticModuleContext, params: "MagneticModuleEngageParams"
101
+ ) -> None:
102
+ engage_height = params["engageHeight"]
103
+ module.engage(height_from_base=engage_height)
104
+
105
+
106
+ def _disengage_magnet(module: MagneticModuleContext, params: "ModuleIDParams") -> None:
107
+ module.disengage()
108
+
109
+
110
+ def _temperature_module_set_temp(
111
+ module: TemperatureModuleContext, params: "TemperatureParams"
112
+ ) -> None:
113
+ temperature = params["temperature"]
114
+ module.start_set_temperature(temperature)
115
+
116
+
117
+ def _temperature_module_deactivate(
118
+ module: TemperatureModuleContext, params: "ModuleIDParams"
119
+ ) -> None:
120
+ module.deactivate()
121
+
122
+
123
+ def _temperature_module_await_temp(
124
+ module: TemperatureModuleContext, params: "TemperatureParams"
125
+ ) -> None:
126
+ temperature = params["temperature"]
127
+ module.await_temperature(temperature)
128
+
129
+
130
+ def _thermocycler_close_lid(
131
+ module: ThermocyclerContext, params: "ModuleIDParams"
132
+ ) -> None:
133
+ module.close_lid()
134
+
135
+
136
+ def _thermocycler_open_lid(
137
+ module: ThermocyclerContext, params: "ModuleIDParams"
138
+ ) -> None:
139
+ module.open_lid()
140
+
141
+
142
+ def _thermocycler_deactivate_block(
143
+ module: ThermocyclerContext, params: "ModuleIDParams"
144
+ ) -> None:
145
+ module.deactivate_block()
146
+
147
+
148
+ def _thermocycler_deactivate_lid(
149
+ module: ThermocyclerContext, params: "ModuleIDParams"
150
+ ) -> None:
151
+ module.deactivate_lid()
152
+
153
+
154
+ def _thermocycler_set_block_temperature(
155
+ module: ThermocyclerContext, params: "ThermocyclerSetTargetBlockParams"
156
+ ) -> None:
157
+ temperature = params["temperature"]
158
+ module.set_block_temperature(temperature)
159
+
160
+
161
+ def _thermocycler_set_lid_temperature(
162
+ module: ThermocyclerContext, params: "TemperatureParams"
163
+ ) -> None:
164
+ temperature = params["temperature"]
165
+ module.set_lid_temperature(temperature)
166
+
167
+
168
+ def _thermocycler_run_profile(
169
+ module: ThermocyclerContext, params: "ThermocyclerRunProfileParams"
170
+ ) -> None:
171
+ volume = params["volume"]
172
+ profile = [
173
+ ThermocyclerStep(temperature=p["temperature"], hold_time_seconds=p["holdTime"])
174
+ for p in params["profile"]
175
+ ]
176
+ module.execute_profile(steps=profile, block_max_volume=volume, repetitions=1)
177
+
178
+
179
+ def assert_no_async_tc_behavior(commands: List["Command"]) -> None:
180
+ # awaiters[i] corresponds to setters[i]
181
+ setters = [
182
+ "thermocycler/setTargetBlockTemperature",
183
+ "thermocycler/setTargetLidTemperature",
184
+ "thermocycler/runProfile",
185
+ ]
186
+ awaiters = [
187
+ "thermocycler/awaitBlockTemperature",
188
+ "thermocycler/awaitLidTemperature",
189
+ "thermocycler/awaitProfileComplete",
190
+ ]
191
+
192
+ command_types = [c["command"] for c in commands]
193
+
194
+ first_command = command_types[0]
195
+ if first_command in awaiters:
196
+ raise RuntimeError(
197
+ (
198
+ "Unsupported behavior. Cannot {} as the "
199
+ + "first command of a protocol"
200
+ ).format(first_command)
201
+ )
202
+
203
+ last_command = command_types[-1]
204
+ if last_command in setters:
205
+ raise RuntimeError(
206
+ (
207
+ "Unsupported behavior. Cannot {} as the " + "last command of a protocol"
208
+ ).format(last_command)
209
+ )
210
+
211
+ # [a, b, c, d] -> [a, b], [b, c], [c, d]
212
+ for a, b in zip(command_types, command_types[1:]):
213
+ # a setter must be immediately followed
214
+ # by its corresponding awaiter
215
+ if a in setters:
216
+ expected_awaiter = awaiters[setters.index(a)]
217
+ if b != expected_awaiter:
218
+ raise RuntimeError(
219
+ (
220
+ "Unsupported behavior. {} must be immediately"
221
+ + "followed by {}"
222
+ ).format(a, expected_awaiter)
223
+ )
224
+ # an awaiter must be preceded by a setter
225
+ elif b in awaiters:
226
+ expected_setter = setters[awaiters.index(b)]
227
+ raise RuntimeError(
228
+ (
229
+ "Unsupported behavior. {} must be immediately " + "preceded by {}"
230
+ ).format(b, expected_setter)
231
+ )
232
+
233
+
234
+ def assert_tc_commands_do_not_use_unimplemented_params(
235
+ commands: List["Command"],
236
+ ) -> None:
237
+ # raise errors if commands include optional param keys that
238
+ # the executor/api does not currently support
239
+ unsupported_keys_by_command = {"thermocycler/setTargetBlockTemperature": ["volume"]}
240
+ for c in commands:
241
+ command_type = c["command"]
242
+ params = c["params"]
243
+ unsupported_keys = unsupported_keys_by_command.get(command_type, [])
244
+ for k in unsupported_keys:
245
+ if k in params:
246
+ raise RuntimeError(
247
+ (
248
+ "{} does not support {} param. "
249
+ + "This may be implemented in a later version of "
250
+ + "the robot server"
251
+ ).format(command_type, k)
252
+ )
253
+
254
+
255
+ def dispatch_json(
256
+ context: ProtocolContext,
257
+ protocol_data: Union["JsonProtocolV4", "JsonProtocolV5"],
258
+ instruments: Instruments,
259
+ loaded_labware: LoadedLabware,
260
+ modules: Dict[str, ModuleContext],
261
+ pipette_command_map: "PipetteDispatch",
262
+ magnetic_module_command_map: "JsonV4MagneticModuleDispatch",
263
+ temperature_module_command_map: "JsonV4TemperatureModuleDispatch",
264
+ thermocycler_module_command_map: "JsonV4ThermocyclerDispatch",
265
+ ) -> None:
266
+ commands = protocol_data["commands"]
267
+
268
+ assert_no_async_tc_behavior(commands)
269
+ assert_tc_commands_do_not_use_unimplemented_params(commands)
270
+
271
+ for command_item in commands:
272
+ command_type = command_item["command"]
273
+ params = command_item["params"]
274
+ # because of https://github.com/python/mypy/issues/8940
275
+ # we can't narrow down types using in sadly
276
+ if command_type in pipette_command_map:
277
+ pipette_command_map[command_type]( # type: ignore
278
+ instruments, loaded_labware, params
279
+ )
280
+ elif command_type in magnetic_module_command_map:
281
+ handleMagnetCommand(
282
+ params, # type: ignore
283
+ modules,
284
+ command_type, # type: ignore
285
+ magnetic_module_command_map, # type: ignore[arg-type]
286
+ )
287
+ elif command_type in temperature_module_command_map:
288
+ handleTemperatureCommand(
289
+ params, # type: ignore[arg-type]
290
+ modules,
291
+ command_type, # type: ignore
292
+ temperature_module_command_map, # type: ignore[arg-type]
293
+ )
294
+ elif command_type in thermocycler_module_command_map:
295
+ handleThermocyclerCommand(
296
+ params, # type: ignore
297
+ modules, # type: ignore
298
+ command_type, # type: ignore
299
+ thermocycler_module_command_map, # type: ignore[arg-type]
300
+ )
301
+ elif command_item["command"] == JsonRobotCommand.delay.value:
302
+ _delay(context, params) # type: ignore
303
+ elif command_type == JsonPipetteCommand.moveToSlot.value:
304
+ _move_to_slot(context, instruments, params) # type: ignore
305
+ else:
306
+ raise RuntimeError("Unsupported command type {}".format(command_type))
307
+
308
+
309
+ def handleTemperatureCommand(
310
+ params: Union["TemperatureParams", "ModuleIDParams"],
311
+ modules: Dict[str, ModuleContext],
312
+ command_type: "TemperatureModuleCommandId",
313
+ temperature_module_command_map: TemperatureModuleCommand,
314
+ ) -> None:
315
+ module_id = params["module"]
316
+ module = modules[module_id]
317
+ if isinstance(module, TemperatureModuleContext):
318
+ temperature_module_command_map[command_type](module, params) # type: ignore[typeddict-item]
319
+ else:
320
+ raise RuntimeError(
321
+ "Temperature Module does not match " + "TemperatureModuleContext interface"
322
+ )
323
+
324
+
325
+ def handleThermocyclerCommand(
326
+ params: Union[
327
+ "ModuleIDParams",
328
+ "TemperatureParams",
329
+ "ThermocyclerRunProfileParams",
330
+ "ThermocyclerSetTargetBlockParams",
331
+ ],
332
+ modules: Dict[str, ThermocyclerContext],
333
+ command_type: "ThermocyclerCommandId",
334
+ thermocycler_module_command_map: ThermocyclerCommand,
335
+ ) -> None:
336
+ module_id = params["module"]
337
+ module = modules[module_id]
338
+ if isinstance(module, ThermocyclerContext):
339
+ thermocycler_module_command_map[command_type](module, params) # type: ignore[typeddict-item]
340
+ else:
341
+ raise RuntimeError(
342
+ "Thermocycler Module does not match ThermocyclerContext interface"
343
+ )
344
+
345
+
346
+ def handleMagnetCommand(
347
+ params: Union["ModuleIDParams", "MagneticModuleEngageParams"],
348
+ modules: Dict[str, ModuleContext],
349
+ command_type: "MagneticModuleCommandId",
350
+ magnetic_module_command_map: MagneticModuleCommand,
351
+ ) -> None:
352
+ module_id = params["module"]
353
+ module = modules[module_id]
354
+ if isinstance(module, MagneticModuleContext):
355
+ magnetic_module_command_map[command_type](module, params) # type: ignore[typeddict-item]
356
+ else:
357
+ raise RuntimeError(
358
+ "Magnetic Module does not match MagneticModuleContext interface"
359
+ )
@@ -0,0 +1,28 @@
1
+ import logging
2
+ from typing import TYPE_CHECKING
3
+ from opentrons.types import Point
4
+ from opentrons.protocols.execution.types import LoadedLabware, Instruments
5
+ from .execute_json_v3 import _get_well
6
+
7
+ if TYPE_CHECKING:
8
+ from opentrons_shared_data.protocol.types import MoveToWellParams
9
+
10
+ MODULE_LOG = logging.getLogger(__name__)
11
+
12
+
13
+ def _move_to_well(
14
+ instruments: Instruments, loaded_labware: LoadedLabware, params: "MoveToWellParams"
15
+ ) -> None:
16
+ pipette_id = params["pipette"]
17
+ pipette = instruments[pipette_id]
18
+
19
+ well = _get_well(loaded_labware, params)
20
+
21
+ offset = params.get("offset", {})
22
+ offsetPoint = Point(offset.get("x", 0), offset.get("y", 0), offset.get("z", 0))
23
+
24
+ pipette.move_to(
25
+ well.bottom().move(offsetPoint),
26
+ force_direct=params.get("forceDirect", False),
27
+ minimum_z_height=params.get("minimumZHeight"),
28
+ )
@@ -0,0 +1,169 @@
1
+ import asyncio
2
+ import inspect
3
+ import logging
4
+ import traceback
5
+ import sys
6
+ from types import TracebackType
7
+ from typing import Any, Dict, Optional
8
+
9
+ from opentrons.drivers.smoothie_drivers.errors import SmoothieAlarm
10
+ from opentrons.protocol_api import ProtocolContext, ParameterContext
11
+ from opentrons.protocol_api._parameters import Parameters
12
+ from opentrons.protocols.execution.errors import ExceptionInProtocolError
13
+ from opentrons.protocols.types import PythonProtocol, MalformedPythonProtocolError
14
+ from opentrons.protocol_engine.types import (
15
+ PrimitiveRunTimeParamValuesType,
16
+ CSVRuntimeParamPaths,
17
+ )
18
+
19
+
20
+ from opentrons_shared_data.errors.exceptions import ExecutionCancelledError
21
+
22
+ MODULE_LOG = logging.getLogger(__name__)
23
+
24
+
25
+ def _runfunc_ok(run_func: Any) -> None:
26
+ if not callable(run_func):
27
+ raise SyntaxError("No function 'run(ctx)' defined")
28
+ sig = inspect.Signature.from_callable(run_func)
29
+ if not sig.parameters:
30
+ raise SyntaxError("Function 'run()' does not take any parameters")
31
+ if len(sig.parameters) > 1:
32
+ for name, param in list(sig.parameters.items())[1:]:
33
+ if param.default == inspect.Parameter.empty:
34
+ raise SyntaxError(
35
+ "Function 'run{}' must be called with more than one "
36
+ "argument but would be called as 'run(ctx)'".format(str(sig))
37
+ )
38
+
39
+
40
+ def _add_parameters_func_ok(add_parameters_func: Any) -> None:
41
+ if not callable(add_parameters_func):
42
+ raise SyntaxError("'add_parameters' must be a function.")
43
+ sig = inspect.Signature.from_callable(add_parameters_func)
44
+ if len(sig.parameters) != 1:
45
+ raise SyntaxError("Function 'add_parameters' must take exactly one argument.")
46
+
47
+
48
+ def _find_protocol_error(
49
+ tb: TracebackType | None, proto_name: str
50
+ ) -> traceback.FrameSummary:
51
+ """Return the FrameInfo for the lowest frame in the traceback from the
52
+ protocol.
53
+ """
54
+ if tb is None:
55
+ raise KeyError
56
+ tb_info = traceback.extract_tb(tb)
57
+ for frame in reversed(tb_info):
58
+ if frame.filename == proto_name:
59
+ return frame
60
+ else:
61
+ raise KeyError
62
+
63
+
64
+ def _raise_pretty_protocol_error(exception: Exception, filename: str) -> None:
65
+ _, _, tb = sys.exc_info()
66
+ try:
67
+ frame = _find_protocol_error(tb, filename)
68
+ except KeyError:
69
+ # No pretty names, just raise it
70
+ raise exception
71
+ raise ExceptionInProtocolError(
72
+ exception, tb, str(exception), frame.lineno
73
+ ) from exception
74
+
75
+
76
+ def _parse_and_set_parameters(
77
+ parameter_context: ParameterContext,
78
+ run_time_param_overrides: Optional[PrimitiveRunTimeParamValuesType],
79
+ run_time_param_file_overrides: Optional[CSVRuntimeParamPaths],
80
+ new_globs: Dict[Any, Any],
81
+ filename: str,
82
+ ) -> Parameters:
83
+ try:
84
+ _add_parameters_func_ok(new_globs.get("add_parameters"))
85
+ except SyntaxError as se:
86
+ raise MalformedPythonProtocolError(str(se))
87
+ new_globs["__param_context"] = parameter_context
88
+ try:
89
+ exec("add_parameters(__param_context)", new_globs)
90
+ if run_time_param_overrides is not None:
91
+ parameter_context.set_parameters(run_time_param_overrides)
92
+ if run_time_param_file_overrides is not None:
93
+ parameter_context.initialize_csv_files(run_time_param_file_overrides)
94
+ except Exception as e:
95
+ _raise_pretty_protocol_error(exception=e, filename=filename)
96
+ return parameter_context.export_parameters_for_protocol()
97
+
98
+
99
+ def _get_filename(
100
+ protocol: PythonProtocol,
101
+ ) -> str:
102
+ # TODO(mm, 2023-10-11): This coupling to opentrons.protocols.parse is fragile.
103
+ # Can we get the correct filename directly from proto.contents?
104
+ if protocol.filename and protocol.filename.endswith("zip"):
105
+ # The ".zip" extension needs to match what opentrons.protocols.parse recognizes as a bundle,
106
+ # and the "protocol.ot2.py" fallback needs to match what opentrons.protocol.py sets as the
107
+ # AST filename.
108
+ return "protocol.ot2.py"
109
+ else:
110
+ # "<protocol>" needs to match what opentrons.protocols.parse sets as the fallback
111
+ # AST filename.
112
+ return protocol.filename or "<protocol>"
113
+
114
+
115
+ def exec_add_parameters(
116
+ protocol: PythonProtocol,
117
+ parameter_context: ParameterContext,
118
+ run_time_param_overrides: Optional[PrimitiveRunTimeParamValuesType],
119
+ run_time_param_file_overrides: Optional[CSVRuntimeParamPaths],
120
+ ) -> Optional[Parameters]:
121
+ """Exec the add_parameters function and get the final run time parameters with overrides."""
122
+ new_globs: Dict[Any, Any] = {}
123
+ exec(protocol.contents, new_globs)
124
+ filename = _get_filename(protocol)
125
+
126
+ return (
127
+ _parse_and_set_parameters(
128
+ parameter_context=parameter_context,
129
+ run_time_param_overrides=run_time_param_overrides,
130
+ run_time_param_file_overrides=run_time_param_file_overrides,
131
+ new_globs=new_globs,
132
+ filename=filename,
133
+ )
134
+ if new_globs.get("add_parameters")
135
+ else None
136
+ )
137
+
138
+
139
+ def exec_run(
140
+ proto: PythonProtocol,
141
+ context: ProtocolContext,
142
+ run_time_parameters_with_overrides: Optional[Parameters] = None,
143
+ ) -> None:
144
+ new_globs: Dict[Any, Any] = {}
145
+ exec(proto.contents, new_globs)
146
+ # If the protocol is written correctly, it will have defined a function
147
+ # like run(context: ProtocolContext). If so, that function is now in the
148
+ # current scope.
149
+ filename = _get_filename(proto)
150
+ if run_time_parameters_with_overrides:
151
+ context._params = run_time_parameters_with_overrides
152
+
153
+ try:
154
+ _runfunc_ok(new_globs.get("run"))
155
+ except SyntaxError as se:
156
+ raise MalformedPythonProtocolError(str(se))
157
+
158
+ new_globs["__context"] = context
159
+ try:
160
+ exec("run(__context)", new_globs)
161
+ except (
162
+ SmoothieAlarm,
163
+ asyncio.CancelledError,
164
+ ExecutionCancelledError,
165
+ ):
166
+ # this is a protocol cancel and shouldn't have special logging
167
+ raise
168
+ except Exception as e:
169
+ _raise_pretty_protocol_error(exception=e, filename=filename)
@@ -0,0 +1,87 @@
1
+ from typing import TYPE_CHECKING
2
+ from opentrons.protocols.execution.execute_json_v3 import (
3
+ _blowout,
4
+ _pick_up_tip,
5
+ _drop_tip,
6
+ _aspirate,
7
+ _dispense,
8
+ _touch_tip,
9
+ _air_gap,
10
+ )
11
+ from opentrons.protocols.execution.execute_json_v4 import (
12
+ _engage_magnet,
13
+ _disengage_magnet,
14
+ _temperature_module_set_temp,
15
+ _temperature_module_deactivate,
16
+ _temperature_module_await_temp,
17
+ _thermocycler_close_lid,
18
+ _thermocycler_open_lid,
19
+ _thermocycler_deactivate_block,
20
+ _thermocycler_deactivate_lid,
21
+ _thermocycler_set_block_temperature,
22
+ _thermocycler_set_lid_temperature,
23
+ _thermocycler_run_profile,
24
+ )
25
+ from opentrons.protocols.execution.execute_json_v5 import _move_to_well
26
+
27
+ from opentrons.protocol_api.module_contexts import ThermocyclerContext
28
+
29
+
30
+ from opentrons_shared_data.protocol.constants import (
31
+ JsonPipetteCommand,
32
+ JsonMagneticModuleCommand,
33
+ JsonTemperatureModuleCommand,
34
+ JsonThermocyclerCommand,
35
+ )
36
+
37
+ if TYPE_CHECKING:
38
+ from opentrons.protocols.execution.dev_types import (
39
+ PipetteDispatch,
40
+ JsonV4MagneticModuleDispatch,
41
+ JsonV4TemperatureModuleDispatch,
42
+ JsonV4ThermocyclerDispatch,
43
+ )
44
+
45
+
46
+ pipette_command_map: "PipetteDispatch" = {
47
+ JsonPipetteCommand.blowout.value: _blowout,
48
+ JsonPipetteCommand.pickUpTip.value: _pick_up_tip,
49
+ JsonPipetteCommand.dropTip.value: _drop_tip,
50
+ JsonPipetteCommand.aspirate.value: _aspirate,
51
+ JsonPipetteCommand.dispense.value: _dispense,
52
+ JsonPipetteCommand.touchTip.value: _touch_tip,
53
+ JsonPipetteCommand.airGap.value: _air_gap,
54
+ JsonPipetteCommand.moveToWell.value: _move_to_well,
55
+ }
56
+
57
+ magnetic_module_command_map: "JsonV4MagneticModuleDispatch" = {
58
+ JsonMagneticModuleCommand.magneticModuleEngageMagnet.value: _engage_magnet,
59
+ JsonMagneticModuleCommand.magneticModuleDisengageMagnet.value: _disengage_magnet,
60
+ }
61
+
62
+ temperature_module_command_map: "JsonV4TemperatureModuleDispatch" = {
63
+ JsonTemperatureModuleCommand.temperatureModuleSetTargetTemperature.value: _temperature_module_set_temp,
64
+ JsonTemperatureModuleCommand.temperatureModuleDeactivate.value: _temperature_module_deactivate,
65
+ JsonTemperatureModuleCommand.temperatureModuleAwaitTemperature.value: _temperature_module_await_temp,
66
+ }
67
+
68
+
69
+ def tc_do_nothing(module: ThermocyclerContext, params: object) -> None:
70
+ pass
71
+
72
+
73
+ thermocycler_module_command_map: "JsonV4ThermocyclerDispatch" = {
74
+ JsonThermocyclerCommand.thermocyclerCloseLid.value: _thermocycler_close_lid,
75
+ JsonThermocyclerCommand.thermocyclerOpenLid.value: _thermocycler_open_lid,
76
+ JsonThermocyclerCommand.thermocyclerDeactivateBlock.value: _thermocycler_deactivate_block,
77
+ JsonThermocyclerCommand.thermocyclerDeactivateLid.value: _thermocycler_deactivate_lid,
78
+ JsonThermocyclerCommand.thermocyclerSetTargetBlockTemperature.value: _thermocycler_set_block_temperature,
79
+ JsonThermocyclerCommand.thermocyclerSetTargetLidTemperature.value: _thermocycler_set_lid_temperature,
80
+ JsonThermocyclerCommand.thermocyclerRunProfile.value: _thermocycler_run_profile,
81
+ # NOTE: the thermocyclerAwaitX commands are expected to always
82
+ # follow a corresponding SetX command, which is implemented as
83
+ # blocking. Then nothing needs to be done for awaitX commands.
84
+ JsonThermocyclerCommand.thermocyclerAwaitBlockTemperature.value: tc_do_nothing,
85
+ JsonThermocyclerCommand.thermocyclerAwaitLidTemperature.value: tc_do_nothing,
86
+ JsonThermocyclerCommand.thermocyclerAwaitProfileComplete.value: tc_do_nothing,
87
+ }
@@ -0,0 +1,7 @@
1
+ from typing import Dict
2
+ from opentrons.protocol_api import InstrumentContext, Labware
3
+
4
+
5
+ Instruments = Dict[str, InstrumentContext]
6
+
7
+ LoadedLabware = Dict[str, Labware]
File without changes