opentrons 8.6.0__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 (601) 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 +557 -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 +187 -0
  45. opentrons/drivers/asyncio/communication/errors.py +88 -0
  46. opentrons/drivers/asyncio/communication/serial_connection.py +557 -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/scripts/update_module_fw.py +274 -0
  200. opentrons/hardware_control/simulator_setup.py +260 -0
  201. opentrons/hardware_control/thread_manager.py +431 -0
  202. opentrons/hardware_control/threaded_async_lock.py +97 -0
  203. opentrons/hardware_control/types.py +792 -0
  204. opentrons/hardware_control/util.py +234 -0
  205. opentrons/legacy_broker.py +53 -0
  206. opentrons/legacy_commands/__init__.py +1 -0
  207. opentrons/legacy_commands/commands.py +483 -0
  208. opentrons/legacy_commands/helpers.py +153 -0
  209. opentrons/legacy_commands/module_commands.py +276 -0
  210. opentrons/legacy_commands/protocol_commands.py +54 -0
  211. opentrons/legacy_commands/publisher.py +155 -0
  212. opentrons/legacy_commands/robot_commands.py +51 -0
  213. opentrons/legacy_commands/types.py +1186 -0
  214. opentrons/motion_planning/__init__.py +32 -0
  215. opentrons/motion_planning/adjacent_slots_getters.py +168 -0
  216. opentrons/motion_planning/deck_conflict.py +501 -0
  217. opentrons/motion_planning/errors.py +35 -0
  218. opentrons/motion_planning/types.py +42 -0
  219. opentrons/motion_planning/waypoints.py +218 -0
  220. opentrons/ordered_set.py +138 -0
  221. opentrons/protocol_api/__init__.py +105 -0
  222. opentrons/protocol_api/_liquid.py +157 -0
  223. opentrons/protocol_api/_liquid_properties.py +814 -0
  224. opentrons/protocol_api/_nozzle_layout.py +31 -0
  225. opentrons/protocol_api/_parameter_context.py +300 -0
  226. opentrons/protocol_api/_parameters.py +31 -0
  227. opentrons/protocol_api/_transfer_liquid_validation.py +108 -0
  228. opentrons/protocol_api/_types.py +43 -0
  229. opentrons/protocol_api/config.py +23 -0
  230. opentrons/protocol_api/core/__init__.py +23 -0
  231. opentrons/protocol_api/core/common.py +33 -0
  232. opentrons/protocol_api/core/core_map.py +74 -0
  233. opentrons/protocol_api/core/engine/__init__.py +22 -0
  234. opentrons/protocol_api/core/engine/_default_labware_versions.py +179 -0
  235. opentrons/protocol_api/core/engine/deck_conflict.py +400 -0
  236. opentrons/protocol_api/core/engine/exceptions.py +19 -0
  237. opentrons/protocol_api/core/engine/instrument.py +2391 -0
  238. opentrons/protocol_api/core/engine/labware.py +238 -0
  239. opentrons/protocol_api/core/engine/load_labware_params.py +73 -0
  240. opentrons/protocol_api/core/engine/module_core.py +1027 -0
  241. opentrons/protocol_api/core/engine/overlap_versions.py +20 -0
  242. opentrons/protocol_api/core/engine/pipette_movement_conflict.py +358 -0
  243. opentrons/protocol_api/core/engine/point_calculations.py +64 -0
  244. opentrons/protocol_api/core/engine/protocol.py +1153 -0
  245. opentrons/protocol_api/core/engine/robot.py +139 -0
  246. opentrons/protocol_api/core/engine/stringify.py +74 -0
  247. opentrons/protocol_api/core/engine/transfer_components_executor.py +1006 -0
  248. opentrons/protocol_api/core/engine/well.py +241 -0
  249. opentrons/protocol_api/core/instrument.py +459 -0
  250. opentrons/protocol_api/core/labware.py +151 -0
  251. opentrons/protocol_api/core/legacy/__init__.py +11 -0
  252. opentrons/protocol_api/core/legacy/_labware_geometry.py +37 -0
  253. opentrons/protocol_api/core/legacy/deck.py +369 -0
  254. opentrons/protocol_api/core/legacy/labware_offset_provider.py +108 -0
  255. opentrons/protocol_api/core/legacy/legacy_instrument_core.py +709 -0
  256. opentrons/protocol_api/core/legacy/legacy_labware_core.py +235 -0
  257. opentrons/protocol_api/core/legacy/legacy_module_core.py +592 -0
  258. opentrons/protocol_api/core/legacy/legacy_protocol_core.py +612 -0
  259. opentrons/protocol_api/core/legacy/legacy_well_core.py +162 -0
  260. opentrons/protocol_api/core/legacy/load_info.py +67 -0
  261. opentrons/protocol_api/core/legacy/module_geometry.py +547 -0
  262. opentrons/protocol_api/core/legacy/well_geometry.py +148 -0
  263. opentrons/protocol_api/core/legacy_simulator/__init__.py +16 -0
  264. opentrons/protocol_api/core/legacy_simulator/legacy_instrument_core.py +624 -0
  265. opentrons/protocol_api/core/legacy_simulator/legacy_protocol_core.py +85 -0
  266. opentrons/protocol_api/core/module.py +484 -0
  267. opentrons/protocol_api/core/protocol.py +311 -0
  268. opentrons/protocol_api/core/robot.py +51 -0
  269. opentrons/protocol_api/core/well.py +116 -0
  270. opentrons/protocol_api/core/well_grid.py +45 -0
  271. opentrons/protocol_api/create_protocol_context.py +177 -0
  272. opentrons/protocol_api/deck.py +223 -0
  273. opentrons/protocol_api/disposal_locations.py +244 -0
  274. opentrons/protocol_api/instrument_context.py +3272 -0
  275. opentrons/protocol_api/labware.py +1579 -0
  276. opentrons/protocol_api/module_contexts.py +1447 -0
  277. opentrons/protocol_api/module_validation_and_errors.py +61 -0
  278. opentrons/protocol_api/protocol_context.py +1688 -0
  279. opentrons/protocol_api/robot_context.py +303 -0
  280. opentrons/protocol_api/validation.py +761 -0
  281. opentrons/protocol_engine/__init__.py +155 -0
  282. opentrons/protocol_engine/actions/__init__.py +65 -0
  283. opentrons/protocol_engine/actions/action_dispatcher.py +30 -0
  284. opentrons/protocol_engine/actions/action_handler.py +13 -0
  285. opentrons/protocol_engine/actions/actions.py +302 -0
  286. opentrons/protocol_engine/actions/get_state_update.py +38 -0
  287. opentrons/protocol_engine/clients/__init__.py +5 -0
  288. opentrons/protocol_engine/clients/sync_client.py +174 -0
  289. opentrons/protocol_engine/clients/transports.py +197 -0
  290. opentrons/protocol_engine/commands/__init__.py +757 -0
  291. opentrons/protocol_engine/commands/absorbance_reader/__init__.py +61 -0
  292. opentrons/protocol_engine/commands/absorbance_reader/close_lid.py +154 -0
  293. opentrons/protocol_engine/commands/absorbance_reader/common.py +6 -0
  294. opentrons/protocol_engine/commands/absorbance_reader/initialize.py +151 -0
  295. opentrons/protocol_engine/commands/absorbance_reader/open_lid.py +154 -0
  296. opentrons/protocol_engine/commands/absorbance_reader/read.py +226 -0
  297. opentrons/protocol_engine/commands/air_gap_in_place.py +162 -0
  298. opentrons/protocol_engine/commands/aspirate.py +244 -0
  299. opentrons/protocol_engine/commands/aspirate_in_place.py +184 -0
  300. opentrons/protocol_engine/commands/aspirate_while_tracking.py +211 -0
  301. opentrons/protocol_engine/commands/blow_out.py +146 -0
  302. opentrons/protocol_engine/commands/blow_out_in_place.py +119 -0
  303. opentrons/protocol_engine/commands/calibration/__init__.py +60 -0
  304. opentrons/protocol_engine/commands/calibration/calibrate_gripper.py +166 -0
  305. opentrons/protocol_engine/commands/calibration/calibrate_module.py +117 -0
  306. opentrons/protocol_engine/commands/calibration/calibrate_pipette.py +96 -0
  307. opentrons/protocol_engine/commands/calibration/move_to_maintenance_position.py +156 -0
  308. opentrons/protocol_engine/commands/command.py +308 -0
  309. opentrons/protocol_engine/commands/command_unions.py +974 -0
  310. opentrons/protocol_engine/commands/comment.py +57 -0
  311. opentrons/protocol_engine/commands/configure_for_volume.py +108 -0
  312. opentrons/protocol_engine/commands/configure_nozzle_layout.py +115 -0
  313. opentrons/protocol_engine/commands/custom.py +67 -0
  314. opentrons/protocol_engine/commands/dispense.py +194 -0
  315. opentrons/protocol_engine/commands/dispense_in_place.py +179 -0
  316. opentrons/protocol_engine/commands/dispense_while_tracking.py +204 -0
  317. opentrons/protocol_engine/commands/drop_tip.py +232 -0
  318. opentrons/protocol_engine/commands/drop_tip_in_place.py +205 -0
  319. opentrons/protocol_engine/commands/flex_stacker/__init__.py +64 -0
  320. opentrons/protocol_engine/commands/flex_stacker/common.py +900 -0
  321. opentrons/protocol_engine/commands/flex_stacker/empty.py +293 -0
  322. opentrons/protocol_engine/commands/flex_stacker/fill.py +281 -0
  323. opentrons/protocol_engine/commands/flex_stacker/retrieve.py +339 -0
  324. opentrons/protocol_engine/commands/flex_stacker/set_stored_labware.py +328 -0
  325. opentrons/protocol_engine/commands/flex_stacker/store.py +339 -0
  326. opentrons/protocol_engine/commands/generate_command_schema.py +61 -0
  327. opentrons/protocol_engine/commands/get_next_tip.py +134 -0
  328. opentrons/protocol_engine/commands/get_tip_presence.py +87 -0
  329. opentrons/protocol_engine/commands/hash_command_params.py +38 -0
  330. opentrons/protocol_engine/commands/heater_shaker/__init__.py +102 -0
  331. opentrons/protocol_engine/commands/heater_shaker/close_labware_latch.py +83 -0
  332. opentrons/protocol_engine/commands/heater_shaker/deactivate_heater.py +82 -0
  333. opentrons/protocol_engine/commands/heater_shaker/deactivate_shaker.py +84 -0
  334. opentrons/protocol_engine/commands/heater_shaker/open_labware_latch.py +110 -0
  335. opentrons/protocol_engine/commands/heater_shaker/set_and_wait_for_shake_speed.py +125 -0
  336. opentrons/protocol_engine/commands/heater_shaker/set_target_temperature.py +90 -0
  337. opentrons/protocol_engine/commands/heater_shaker/wait_for_temperature.py +102 -0
  338. opentrons/protocol_engine/commands/home.py +100 -0
  339. opentrons/protocol_engine/commands/identify_module.py +86 -0
  340. opentrons/protocol_engine/commands/labware_handling_common.py +29 -0
  341. opentrons/protocol_engine/commands/liquid_probe.py +464 -0
  342. opentrons/protocol_engine/commands/load_labware.py +210 -0
  343. opentrons/protocol_engine/commands/load_lid.py +154 -0
  344. opentrons/protocol_engine/commands/load_lid_stack.py +272 -0
  345. opentrons/protocol_engine/commands/load_liquid.py +95 -0
  346. opentrons/protocol_engine/commands/load_liquid_class.py +144 -0
  347. opentrons/protocol_engine/commands/load_module.py +223 -0
  348. opentrons/protocol_engine/commands/load_pipette.py +167 -0
  349. opentrons/protocol_engine/commands/magnetic_module/__init__.py +32 -0
  350. opentrons/protocol_engine/commands/magnetic_module/disengage.py +97 -0
  351. opentrons/protocol_engine/commands/magnetic_module/engage.py +119 -0
  352. opentrons/protocol_engine/commands/move_labware.py +546 -0
  353. opentrons/protocol_engine/commands/move_relative.py +102 -0
  354. opentrons/protocol_engine/commands/move_to_addressable_area.py +176 -0
  355. opentrons/protocol_engine/commands/move_to_addressable_area_for_drop_tip.py +198 -0
  356. opentrons/protocol_engine/commands/move_to_coordinates.py +107 -0
  357. opentrons/protocol_engine/commands/move_to_well.py +119 -0
  358. opentrons/protocol_engine/commands/movement_common.py +338 -0
  359. opentrons/protocol_engine/commands/pick_up_tip.py +241 -0
  360. opentrons/protocol_engine/commands/pipetting_common.py +443 -0
  361. opentrons/protocol_engine/commands/prepare_to_aspirate.py +121 -0
  362. opentrons/protocol_engine/commands/pressure_dispense.py +155 -0
  363. opentrons/protocol_engine/commands/reload_labware.py +90 -0
  364. opentrons/protocol_engine/commands/retract_axis.py +75 -0
  365. opentrons/protocol_engine/commands/robot/__init__.py +70 -0
  366. opentrons/protocol_engine/commands/robot/close_gripper_jaw.py +96 -0
  367. opentrons/protocol_engine/commands/robot/common.py +18 -0
  368. opentrons/protocol_engine/commands/robot/move_axes_relative.py +101 -0
  369. opentrons/protocol_engine/commands/robot/move_axes_to.py +100 -0
  370. opentrons/protocol_engine/commands/robot/move_to.py +94 -0
  371. opentrons/protocol_engine/commands/robot/open_gripper_jaw.py +86 -0
  372. opentrons/protocol_engine/commands/save_position.py +109 -0
  373. opentrons/protocol_engine/commands/seal_pipette_to_tip.py +353 -0
  374. opentrons/protocol_engine/commands/set_rail_lights.py +67 -0
  375. opentrons/protocol_engine/commands/set_status_bar.py +89 -0
  376. opentrons/protocol_engine/commands/temperature_module/__init__.py +46 -0
  377. opentrons/protocol_engine/commands/temperature_module/deactivate.py +86 -0
  378. opentrons/protocol_engine/commands/temperature_module/set_target_temperature.py +97 -0
  379. opentrons/protocol_engine/commands/temperature_module/wait_for_temperature.py +104 -0
  380. opentrons/protocol_engine/commands/thermocycler/__init__.py +152 -0
  381. opentrons/protocol_engine/commands/thermocycler/close_lid.py +87 -0
  382. opentrons/protocol_engine/commands/thermocycler/deactivate_block.py +80 -0
  383. opentrons/protocol_engine/commands/thermocycler/deactivate_lid.py +80 -0
  384. opentrons/protocol_engine/commands/thermocycler/open_lid.py +87 -0
  385. opentrons/protocol_engine/commands/thermocycler/run_extended_profile.py +171 -0
  386. opentrons/protocol_engine/commands/thermocycler/run_profile.py +124 -0
  387. opentrons/protocol_engine/commands/thermocycler/set_target_block_temperature.py +140 -0
  388. opentrons/protocol_engine/commands/thermocycler/set_target_lid_temperature.py +100 -0
  389. opentrons/protocol_engine/commands/thermocycler/wait_for_block_temperature.py +93 -0
  390. opentrons/protocol_engine/commands/thermocycler/wait_for_lid_temperature.py +89 -0
  391. opentrons/protocol_engine/commands/touch_tip.py +189 -0
  392. opentrons/protocol_engine/commands/unsafe/__init__.py +161 -0
  393. opentrons/protocol_engine/commands/unsafe/unsafe_blow_out_in_place.py +100 -0
  394. opentrons/protocol_engine/commands/unsafe/unsafe_drop_tip_in_place.py +121 -0
  395. opentrons/protocol_engine/commands/unsafe/unsafe_engage_axes.py +82 -0
  396. opentrons/protocol_engine/commands/unsafe/unsafe_place_labware.py +208 -0
  397. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_close_latch.py +94 -0
  398. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_manual_retrieve.py +295 -0
  399. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_open_latch.py +91 -0
  400. opentrons/protocol_engine/commands/unsafe/unsafe_stacker_prepare_shuttle.py +136 -0
  401. opentrons/protocol_engine/commands/unsafe/unsafe_ungrip_labware.py +77 -0
  402. opentrons/protocol_engine/commands/unsafe/update_position_estimators.py +90 -0
  403. opentrons/protocol_engine/commands/unseal_pipette_from_tip.py +153 -0
  404. opentrons/protocol_engine/commands/verify_tip_presence.py +100 -0
  405. opentrons/protocol_engine/commands/wait_for_duration.py +76 -0
  406. opentrons/protocol_engine/commands/wait_for_resume.py +75 -0
  407. opentrons/protocol_engine/create_protocol_engine.py +193 -0
  408. opentrons/protocol_engine/engine_support.py +28 -0
  409. opentrons/protocol_engine/error_recovery_policy.py +81 -0
  410. opentrons/protocol_engine/errors/__init__.py +191 -0
  411. opentrons/protocol_engine/errors/error_occurrence.py +182 -0
  412. opentrons/protocol_engine/errors/exceptions.py +1308 -0
  413. opentrons/protocol_engine/execution/__init__.py +50 -0
  414. opentrons/protocol_engine/execution/command_executor.py +216 -0
  415. opentrons/protocol_engine/execution/create_queue_worker.py +102 -0
  416. opentrons/protocol_engine/execution/door_watcher.py +119 -0
  417. opentrons/protocol_engine/execution/equipment.py +819 -0
  418. opentrons/protocol_engine/execution/error_recovery_hardware_state_synchronizer.py +101 -0
  419. opentrons/protocol_engine/execution/gantry_mover.py +686 -0
  420. opentrons/protocol_engine/execution/hardware_stopper.py +147 -0
  421. opentrons/protocol_engine/execution/heater_shaker_movement_flagger.py +207 -0
  422. opentrons/protocol_engine/execution/labware_movement.py +297 -0
  423. opentrons/protocol_engine/execution/movement.py +350 -0
  424. opentrons/protocol_engine/execution/pipetting.py +607 -0
  425. opentrons/protocol_engine/execution/queue_worker.py +86 -0
  426. opentrons/protocol_engine/execution/rail_lights.py +25 -0
  427. opentrons/protocol_engine/execution/run_control.py +33 -0
  428. opentrons/protocol_engine/execution/status_bar.py +34 -0
  429. opentrons/protocol_engine/execution/thermocycler_movement_flagger.py +188 -0
  430. opentrons/protocol_engine/execution/thermocycler_plate_lifter.py +81 -0
  431. opentrons/protocol_engine/execution/tip_handler.py +550 -0
  432. opentrons/protocol_engine/labware_offset_standardization.py +194 -0
  433. opentrons/protocol_engine/notes/__init__.py +17 -0
  434. opentrons/protocol_engine/notes/notes.py +59 -0
  435. opentrons/protocol_engine/plugins.py +104 -0
  436. opentrons/protocol_engine/protocol_engine.py +683 -0
  437. opentrons/protocol_engine/resources/__init__.py +26 -0
  438. opentrons/protocol_engine/resources/deck_configuration_provider.py +232 -0
  439. opentrons/protocol_engine/resources/deck_data_provider.py +94 -0
  440. opentrons/protocol_engine/resources/file_provider.py +161 -0
  441. opentrons/protocol_engine/resources/fixture_validation.py +68 -0
  442. opentrons/protocol_engine/resources/labware_data_provider.py +106 -0
  443. opentrons/protocol_engine/resources/labware_validation.py +73 -0
  444. opentrons/protocol_engine/resources/model_utils.py +32 -0
  445. opentrons/protocol_engine/resources/module_data_provider.py +44 -0
  446. opentrons/protocol_engine/resources/ot3_validation.py +21 -0
  447. opentrons/protocol_engine/resources/pipette_data_provider.py +379 -0
  448. opentrons/protocol_engine/slot_standardization.py +128 -0
  449. opentrons/protocol_engine/state/__init__.py +1 -0
  450. opentrons/protocol_engine/state/_abstract_store.py +27 -0
  451. opentrons/protocol_engine/state/_axis_aligned_bounding_box.py +50 -0
  452. opentrons/protocol_engine/state/_labware_origin_math.py +636 -0
  453. opentrons/protocol_engine/state/_move_types.py +83 -0
  454. opentrons/protocol_engine/state/_well_math.py +193 -0
  455. opentrons/protocol_engine/state/addressable_areas.py +699 -0
  456. opentrons/protocol_engine/state/command_history.py +309 -0
  457. opentrons/protocol_engine/state/commands.py +1164 -0
  458. opentrons/protocol_engine/state/config.py +39 -0
  459. opentrons/protocol_engine/state/files.py +57 -0
  460. opentrons/protocol_engine/state/fluid_stack.py +138 -0
  461. opentrons/protocol_engine/state/geometry.py +2408 -0
  462. opentrons/protocol_engine/state/inner_well_math_utils.py +548 -0
  463. opentrons/protocol_engine/state/labware.py +1432 -0
  464. opentrons/protocol_engine/state/liquid_classes.py +82 -0
  465. opentrons/protocol_engine/state/liquids.py +73 -0
  466. opentrons/protocol_engine/state/module_substates/__init__.py +45 -0
  467. opentrons/protocol_engine/state/module_substates/absorbance_reader_substate.py +35 -0
  468. opentrons/protocol_engine/state/module_substates/flex_stacker_substate.py +112 -0
  469. opentrons/protocol_engine/state/module_substates/heater_shaker_module_substate.py +115 -0
  470. opentrons/protocol_engine/state/module_substates/magnetic_block_substate.py +17 -0
  471. opentrons/protocol_engine/state/module_substates/magnetic_module_substate.py +65 -0
  472. opentrons/protocol_engine/state/module_substates/temperature_module_substate.py +67 -0
  473. opentrons/protocol_engine/state/module_substates/thermocycler_module_substate.py +163 -0
  474. opentrons/protocol_engine/state/modules.py +1515 -0
  475. opentrons/protocol_engine/state/motion.py +373 -0
  476. opentrons/protocol_engine/state/pipettes.py +905 -0
  477. opentrons/protocol_engine/state/state.py +421 -0
  478. opentrons/protocol_engine/state/state_summary.py +36 -0
  479. opentrons/protocol_engine/state/tips.py +420 -0
  480. opentrons/protocol_engine/state/update_types.py +904 -0
  481. opentrons/protocol_engine/state/wells.py +290 -0
  482. opentrons/protocol_engine/types/__init__.py +310 -0
  483. opentrons/protocol_engine/types/automatic_tip_selection.py +39 -0
  484. opentrons/protocol_engine/types/command_annotations.py +53 -0
  485. opentrons/protocol_engine/types/deck_configuration.py +81 -0
  486. opentrons/protocol_engine/types/execution.py +96 -0
  487. opentrons/protocol_engine/types/hardware_passthrough.py +25 -0
  488. opentrons/protocol_engine/types/instrument.py +47 -0
  489. opentrons/protocol_engine/types/instrument_sensors.py +47 -0
  490. opentrons/protocol_engine/types/labware.py +131 -0
  491. opentrons/protocol_engine/types/labware_movement.py +22 -0
  492. opentrons/protocol_engine/types/labware_offset_location.py +111 -0
  493. opentrons/protocol_engine/types/labware_offset_vector.py +16 -0
  494. opentrons/protocol_engine/types/liquid.py +40 -0
  495. opentrons/protocol_engine/types/liquid_class.py +59 -0
  496. opentrons/protocol_engine/types/liquid_handling.py +13 -0
  497. opentrons/protocol_engine/types/liquid_level_detection.py +191 -0
  498. opentrons/protocol_engine/types/location.py +194 -0
  499. opentrons/protocol_engine/types/module.py +310 -0
  500. opentrons/protocol_engine/types/partial_tip_configuration.py +76 -0
  501. opentrons/protocol_engine/types/run_time_parameters.py +133 -0
  502. opentrons/protocol_engine/types/tip.py +18 -0
  503. opentrons/protocol_engine/types/util.py +21 -0
  504. opentrons/protocol_engine/types/well_position.py +124 -0
  505. opentrons/protocol_reader/__init__.py +37 -0
  506. opentrons/protocol_reader/extract_labware_definitions.py +66 -0
  507. opentrons/protocol_reader/file_format_validator.py +152 -0
  508. opentrons/protocol_reader/file_hasher.py +27 -0
  509. opentrons/protocol_reader/file_identifier.py +284 -0
  510. opentrons/protocol_reader/file_reader_writer.py +90 -0
  511. opentrons/protocol_reader/input_file.py +16 -0
  512. opentrons/protocol_reader/protocol_files_invalid_error.py +6 -0
  513. opentrons/protocol_reader/protocol_reader.py +188 -0
  514. opentrons/protocol_reader/protocol_source.py +124 -0
  515. opentrons/protocol_reader/role_analyzer.py +86 -0
  516. opentrons/protocol_runner/__init__.py +26 -0
  517. opentrons/protocol_runner/create_simulating_orchestrator.py +118 -0
  518. opentrons/protocol_runner/json_file_reader.py +55 -0
  519. opentrons/protocol_runner/json_translator.py +314 -0
  520. opentrons/protocol_runner/legacy_command_mapper.py +852 -0
  521. opentrons/protocol_runner/legacy_context_plugin.py +116 -0
  522. opentrons/protocol_runner/protocol_runner.py +530 -0
  523. opentrons/protocol_runner/python_protocol_wrappers.py +179 -0
  524. opentrons/protocol_runner/run_orchestrator.py +496 -0
  525. opentrons/protocol_runner/task_queue.py +95 -0
  526. opentrons/protocols/__init__.py +6 -0
  527. opentrons/protocols/advanced_control/__init__.py +0 -0
  528. opentrons/protocols/advanced_control/common.py +38 -0
  529. opentrons/protocols/advanced_control/mix.py +60 -0
  530. opentrons/protocols/advanced_control/transfers/__init__.py +0 -0
  531. opentrons/protocols/advanced_control/transfers/common.py +180 -0
  532. opentrons/protocols/advanced_control/transfers/transfer.py +972 -0
  533. opentrons/protocols/advanced_control/transfers/transfer_liquid_utils.py +231 -0
  534. opentrons/protocols/api_support/__init__.py +0 -0
  535. opentrons/protocols/api_support/constants.py +8 -0
  536. opentrons/protocols/api_support/deck_type.py +110 -0
  537. opentrons/protocols/api_support/definitions.py +18 -0
  538. opentrons/protocols/api_support/instrument.py +151 -0
  539. opentrons/protocols/api_support/labware_like.py +233 -0
  540. opentrons/protocols/api_support/tip_tracker.py +175 -0
  541. opentrons/protocols/api_support/types.py +32 -0
  542. opentrons/protocols/api_support/util.py +403 -0
  543. opentrons/protocols/bundle.py +89 -0
  544. opentrons/protocols/duration/__init__.py +4 -0
  545. opentrons/protocols/duration/errors.py +5 -0
  546. opentrons/protocols/duration/estimator.py +628 -0
  547. opentrons/protocols/execution/__init__.py +0 -0
  548. opentrons/protocols/execution/dev_types.py +181 -0
  549. opentrons/protocols/execution/errors.py +40 -0
  550. opentrons/protocols/execution/execute.py +84 -0
  551. opentrons/protocols/execution/execute_json_v3.py +275 -0
  552. opentrons/protocols/execution/execute_json_v4.py +359 -0
  553. opentrons/protocols/execution/execute_json_v5.py +28 -0
  554. opentrons/protocols/execution/execute_python.py +169 -0
  555. opentrons/protocols/execution/json_dispatchers.py +87 -0
  556. opentrons/protocols/execution/types.py +7 -0
  557. opentrons/protocols/geometry/__init__.py +0 -0
  558. opentrons/protocols/geometry/planning.py +297 -0
  559. opentrons/protocols/labware.py +312 -0
  560. opentrons/protocols/models/__init__.py +0 -0
  561. opentrons/protocols/models/json_protocol.py +679 -0
  562. opentrons/protocols/parameters/__init__.py +0 -0
  563. opentrons/protocols/parameters/csv_parameter_definition.py +77 -0
  564. opentrons/protocols/parameters/csv_parameter_interface.py +96 -0
  565. opentrons/protocols/parameters/exceptions.py +34 -0
  566. opentrons/protocols/parameters/parameter_definition.py +272 -0
  567. opentrons/protocols/parameters/types.py +17 -0
  568. opentrons/protocols/parameters/validation.py +267 -0
  569. opentrons/protocols/parse.py +671 -0
  570. opentrons/protocols/types.py +159 -0
  571. opentrons/py.typed +0 -0
  572. opentrons/resources/scripts/lpc21isp +0 -0
  573. opentrons/resources/smoothie-edge-8414642.hex +23010 -0
  574. opentrons/simulate.py +1065 -0
  575. opentrons/system/__init__.py +6 -0
  576. opentrons/system/camera.py +51 -0
  577. opentrons/system/log_control.py +59 -0
  578. opentrons/system/nmcli.py +856 -0
  579. opentrons/system/resin.py +24 -0
  580. opentrons/system/smoothie_update.py +15 -0
  581. opentrons/system/wifi.py +204 -0
  582. opentrons/tools/__init__.py +0 -0
  583. opentrons/tools/args_handler.py +22 -0
  584. opentrons/tools/write_pipette_memory.py +157 -0
  585. opentrons/types.py +618 -0
  586. opentrons/util/__init__.py +1 -0
  587. opentrons/util/async_helpers.py +166 -0
  588. opentrons/util/broker.py +84 -0
  589. opentrons/util/change_notifier.py +47 -0
  590. opentrons/util/entrypoint_util.py +278 -0
  591. opentrons/util/get_union_elements.py +26 -0
  592. opentrons/util/helpers.py +6 -0
  593. opentrons/util/linal.py +178 -0
  594. opentrons/util/logging_config.py +265 -0
  595. opentrons/util/logging_queue_handler.py +61 -0
  596. opentrons/util/performance_helpers.py +157 -0
  597. opentrons-8.6.0.dist-info/METADATA +37 -0
  598. opentrons-8.6.0.dist-info/RECORD +601 -0
  599. opentrons-8.6.0.dist-info/WHEEL +4 -0
  600. opentrons-8.6.0.dist-info/entry_points.txt +3 -0
  601. opentrons-8.6.0.dist-info/licenses/LICENSE +202 -0
@@ -0,0 +1,612 @@
1
+ import logging
2
+ from typing import Dict, List, Optional, Set, Union, cast, Tuple
3
+
4
+ from opentrons_shared_data.deck.types import DeckDefinitionV5, SlotDefV3
5
+ from opentrons_shared_data.labware.types import LabwareDefinition
6
+ from opentrons_shared_data.pipette.types import PipetteNameType
7
+ from opentrons_shared_data.robot.types import RobotType
8
+
9
+ from opentrons.types import (
10
+ DeckSlotName,
11
+ StagingSlotName,
12
+ Location,
13
+ Mount,
14
+ Point,
15
+ )
16
+ from opentrons.util.broker import Broker
17
+ from opentrons.hardware_control import SyncHardwareAPI
18
+ from opentrons.hardware_control.modules import AbstractModule, ModuleModel, ModuleType
19
+ from opentrons.hardware_control.types import DoorState, PauseType
20
+ from opentrons.protocols.api_support.types import APIVersion
21
+ from opentrons.protocols.api_support.util import AxisMaxSpeeds, APIVersionError
22
+ from opentrons.protocols import labware as labware_definition
23
+
24
+ from ...labware import Labware
25
+ from ...disposal_locations import TrashBin, WasteChute
26
+ from ..._liquid import Liquid, LiquidClass
27
+ from ..._types import OffDeckType
28
+ from ..protocol import AbstractProtocol
29
+ from ..labware import LabwareLoadParams
30
+
31
+ from . import legacy_module_core, module_geometry
32
+ from .deck import Deck
33
+ from .legacy_instrument_core import LegacyInstrumentCore
34
+ from .labware_offset_provider import AbstractLabwareOffsetProvider
35
+ from .legacy_labware_core import LegacyLabwareCore
36
+ from .load_info import LoadInfo, InstrumentLoadInfo, LabwareLoadInfo, ModuleLoadInfo
37
+
38
+ logger = logging.getLogger(__name__)
39
+
40
+
41
+ class LegacyProtocolCore(
42
+ AbstractProtocol[
43
+ LegacyInstrumentCore,
44
+ LegacyLabwareCore,
45
+ legacy_module_core.LegacyModuleCore,
46
+ ]
47
+ ):
48
+ def __init__(
49
+ self,
50
+ sync_hardware: SyncHardwareAPI,
51
+ api_version: APIVersion,
52
+ labware_offset_provider: AbstractLabwareOffsetProvider,
53
+ deck_layout: Deck,
54
+ equipment_broker: Optional[Broker[LoadInfo]] = None,
55
+ bundled_labware: Optional[Dict[str, LabwareDefinition]] = None,
56
+ extra_labware: Optional[Dict[str, LabwareDefinition]] = None,
57
+ ) -> None:
58
+ """Build a :py:class:`.LegacyProtocolCore`.
59
+
60
+ :param api_version: The API version to use. If this is ``None``, uses
61
+ the max supported version.
62
+ :param hardware: The hardware control API to use.
63
+ :param bundled_labware: A dict mapping labware URIs to definitions.
64
+ This is used when executing bundled protocols,
65
+ and if specified will be the only allowed
66
+ source for labware definitions, excluding the
67
+ built in definitions and anything in
68
+ ``extra_labware``.
69
+ :param bundled_data: A dict mapping filenames to the contents of data
70
+ files. Can be used by the protocol, since it is
71
+ exposed as
72
+ :py:attr:`.ProtocolContext.bundled_data`
73
+ :param extra_labware: A dict mapping labware URIs to definitions. These
74
+ URIs are searched during :py:meth:`.load_labware`
75
+ in addition to the system definitions (if
76
+ ``bundled_labware`` was not specified). Used to
77
+ provide custom labware definitions.
78
+ """
79
+ self._sync_hardware = sync_hardware
80
+ self._api_version = api_version
81
+ self._labware_offset_provider = labware_offset_provider
82
+ self._deck_layout = deck_layout
83
+ self._equipment_broker = equipment_broker or Broker()
84
+
85
+ self._instruments: Dict[Mount, Optional[LegacyInstrumentCore]] = {
86
+ mount: None for mount in Mount.ot2_mounts() # Legacy core works only on OT2
87
+ }
88
+ self._bundled_labware = bundled_labware
89
+ self._extra_labware = extra_labware or {}
90
+ self._default_max_speeds = AxisMaxSpeeds(robot_type=self.robot_type)
91
+ self._last_location: Optional[Location] = None
92
+ self._last_mount: Optional[Mount] = None
93
+ self._loaded_modules: Set["AbstractModule"] = set()
94
+ self._module_cores: List[legacy_module_core.LegacyModuleCore] = []
95
+ self._labware_cores: List[LegacyLabwareCore] = [self.fixed_trash]
96
+ self._disposal_locations: List[Union[Labware, TrashBin, WasteChute]] = []
97
+ self._liquid_presence_detection = False
98
+
99
+ @property
100
+ def api_version(self) -> APIVersion:
101
+ """Get the API version the protocol is adhering to."""
102
+ return self._api_version
103
+
104
+ @property
105
+ def robot_type(self) -> RobotType:
106
+ return "OT-2 Standard"
107
+
108
+ @property
109
+ def equipment_broker(self) -> Broker[LoadInfo]:
110
+ """A message broker to to publish equipment load events.
111
+
112
+ Subscribers to this broker will be notified with information about every
113
+ successful labware load, instrument load, or module load.
114
+
115
+ Only this interface is allowed to publish to this broker.
116
+ Calling code may only subscribe or unsubscribe.
117
+ """
118
+ return self._equipment_broker
119
+
120
+ def get_bundled_labware(self) -> Optional[Dict[str, LabwareDefinition]]:
121
+ """Bundled labware definition."""
122
+ # TODO AL 20201110 - This should be removed along with the bundling
123
+ # feature as we move to HTTP based protocol execution.
124
+ return self._bundled_labware
125
+
126
+ def get_extra_labware(self) -> Optional[Dict[str, LabwareDefinition]]:
127
+ """Extra labware definitions."""
128
+ return self._extra_labware
129
+
130
+ def get_max_speeds(self) -> AxisMaxSpeeds:
131
+ """Get the maximum axis speeds."""
132
+ return self._default_max_speeds
133
+
134
+ def get_hardware(self) -> SyncHardwareAPI:
135
+ """Access to the synchronous hardware API."""
136
+ return self._sync_hardware
137
+
138
+ def is_simulating(self) -> bool:
139
+ """Returns true if hardware is being simulated."""
140
+ return self._sync_hardware.is_simulator # type: ignore[no-any-return]
141
+
142
+ def append_disposal_location(
143
+ self,
144
+ disposal_location: Union[Labware, TrashBin, WasteChute],
145
+ ) -> None:
146
+ if isinstance(disposal_location, (TrashBin, WasteChute)):
147
+ raise APIVersionError(
148
+ api_element="Trash Bin and Waste Chute Disposal locations"
149
+ )
150
+ self._disposal_locations.append(disposal_location)
151
+
152
+ def add_labware_definition(
153
+ self,
154
+ definition: LabwareDefinition,
155
+ ) -> LabwareLoadParams:
156
+ """Add a labware definition to the set of loadable definitions."""
157
+ load_params = LabwareLoadParams(
158
+ namespace=definition["namespace"],
159
+ load_name=definition["parameters"]["loadName"],
160
+ version=definition["version"],
161
+ )
162
+ self._extra_labware = self._extra_labware.copy()
163
+ self._extra_labware[load_params.as_uri()] = definition
164
+ return load_params
165
+
166
+ def load_labware(
167
+ self,
168
+ load_name: str,
169
+ location: Union[
170
+ DeckSlotName,
171
+ LegacyLabwareCore,
172
+ legacy_module_core.LegacyModuleCore,
173
+ StagingSlotName,
174
+ OffDeckType,
175
+ ],
176
+ label: Optional[str],
177
+ namespace: Optional[str],
178
+ version: Optional[int],
179
+ ) -> LegacyLabwareCore:
180
+ """Load a labware using its identifying parameters."""
181
+ if isinstance(location, OffDeckType):
182
+ raise APIVersionError(
183
+ api_element="Loading a labware off deck", until_version="2.15"
184
+ )
185
+ elif isinstance(location, LegacyLabwareCore):
186
+ raise APIVersionError(
187
+ api_element="Loading a labware onto another labware or adapter",
188
+ until_version="2.15",
189
+ )
190
+ elif isinstance(location, StagingSlotName):
191
+ raise APIVersionError(
192
+ api_element="Using a staging deck slot", until_version="2.16"
193
+ )
194
+
195
+ deck_slot = (
196
+ location if isinstance(location, DeckSlotName) else location.get_deck_slot()
197
+ )
198
+
199
+ parent = (
200
+ self.get_deck().position_for(location.value)
201
+ if isinstance(location, DeckSlotName)
202
+ else location.geometry.location
203
+ )
204
+
205
+ labware_def = labware_definition.get_labware_definition(
206
+ load_name,
207
+ namespace,
208
+ version,
209
+ bundled_defs=self._bundled_labware,
210
+ extra_defs=self._extra_labware,
211
+ )
212
+ # For type checking. This should always pass because
213
+ # opentrons.protocol_api.core.legacy should only load labware with schema 2.
214
+ assert labware_def["schemaVersion"] == 2
215
+
216
+ labware_core = LegacyLabwareCore(
217
+ definition=labware_def,
218
+ parent=parent,
219
+ label=label,
220
+ )
221
+ labware_load_params = labware_core.get_load_params()
222
+ labware_offset = self._labware_offset_provider.find(
223
+ load_params=labware_load_params,
224
+ deck_slot=deck_slot,
225
+ requested_module_model=(
226
+ location.get_requested_model()
227
+ if isinstance(location, legacy_module_core.LegacyModuleCore)
228
+ else None
229
+ ),
230
+ )
231
+ labware_core.set_calibration(labware_offset.delta)
232
+
233
+ self._labware_cores.append(labware_core)
234
+ if isinstance(location, DeckSlotName):
235
+ # This assignment will raise if the new item conflicts with something else
236
+ # on the deck--for example, if something tall is placed next to a
237
+ # Heater-Shaker.
238
+ #
239
+ # It's a latent bug that we only do this conflict checking when loading
240
+ # directly into a deck slot. We should also do conflict checking when
241
+ # labware is loaded atop a module, because that affects the module's
242
+ # maximum height.
243
+ #
244
+ # In practice, I don't think this matters now (2023-02-22) because of the
245
+ # exact conflict checks that we perform. Wherever we have a constraint on
246
+ # maximum height, we also happen to have a constraint disallowing modules
247
+ # in the first place.
248
+ self._deck_layout[location.value] = labware_core
249
+
250
+ self._equipment_broker.publish(
251
+ LabwareLoadInfo(
252
+ labware_definition=labware_core.get_definition(),
253
+ labware_namespace=labware_load_params.namespace,
254
+ labware_load_name=labware_load_params.load_name,
255
+ labware_version=labware_load_params.version,
256
+ deck_slot=deck_slot,
257
+ on_module=isinstance(location, legacy_module_core.LegacyModuleCore),
258
+ offset_id=labware_offset.offset_id,
259
+ labware_display_name=labware_core.get_user_display_name(),
260
+ )
261
+ )
262
+
263
+ return labware_core
264
+
265
+ def load_adapter(
266
+ self,
267
+ load_name: str,
268
+ location: Union[
269
+ DeckSlotName,
270
+ StagingSlotName,
271
+ legacy_module_core.LegacyModuleCore,
272
+ OffDeckType,
273
+ ],
274
+ namespace: Optional[str],
275
+ version: Optional[int],
276
+ ) -> LegacyLabwareCore:
277
+ """Load an adapter using its identifying parameters"""
278
+ raise APIVersionError(api_element="Loading adapter")
279
+
280
+ def load_lid(
281
+ self,
282
+ load_name: str,
283
+ location: LegacyLabwareCore,
284
+ namespace: Optional[str],
285
+ version: Optional[int],
286
+ ) -> LegacyLabwareCore:
287
+ """Load an individual lid labware using its identifying parameters. Must be loaded on a labware."""
288
+ raise APIVersionError(api_element="Loading lid")
289
+
290
+ def load_robot(self) -> None: # type: ignore
291
+ """Load an adapter using its identifying parameters"""
292
+ raise APIVersionError(api_element="Loading robot")
293
+
294
+ def move_labware(
295
+ self,
296
+ labware_core: LegacyLabwareCore,
297
+ new_location: Union[
298
+ DeckSlotName,
299
+ StagingSlotName,
300
+ LegacyLabwareCore,
301
+ legacy_module_core.LegacyModuleCore,
302
+ OffDeckType,
303
+ WasteChute,
304
+ TrashBin,
305
+ ],
306
+ use_gripper: bool,
307
+ pause_for_manual_move: bool,
308
+ pick_up_offset: Optional[Tuple[float, float, float]],
309
+ drop_offset: Optional[Tuple[float, float, float]],
310
+ ) -> None:
311
+ """Move labware to new location."""
312
+ raise APIVersionError(api_element="Labware movement")
313
+
314
+ def move_lid(
315
+ self,
316
+ source_location: Union[DeckSlotName, StagingSlotName, LegacyLabwareCore],
317
+ new_location: Union[
318
+ DeckSlotName,
319
+ StagingSlotName,
320
+ LegacyLabwareCore,
321
+ OffDeckType,
322
+ WasteChute,
323
+ TrashBin,
324
+ ],
325
+ use_gripper: bool,
326
+ pause_for_manual_move: bool,
327
+ pick_up_offset: Optional[Tuple[float, float, float]],
328
+ drop_offset: Optional[Tuple[float, float, float]],
329
+ ) -> LegacyLabwareCore | None:
330
+ """Move lid to new location."""
331
+ raise APIVersionError(api_element="Lid movement")
332
+
333
+ def load_module(
334
+ self,
335
+ model: ModuleModel,
336
+ deck_slot: Optional[DeckSlotName],
337
+ configuration: Optional[str],
338
+ ) -> legacy_module_core.LegacyModuleCore:
339
+ """Load a module."""
340
+ resolved_type = ModuleType.from_model(model)
341
+ resolved_location = self._deck_layout.resolve_module_location(
342
+ resolved_type, (None if deck_slot is None else deck_slot.id)
343
+ )
344
+
345
+ selected_hardware = None
346
+ selected_definition = None
347
+
348
+ for module_hardware in self._sync_hardware.attached_modules:
349
+ if module_hardware not in self._loaded_modules:
350
+ definition = module_geometry.load_definition(module_hardware.model())
351
+ compatible = module_geometry.models_compatible(model, definition)
352
+
353
+ if compatible:
354
+ self._loaded_modules.add(module_hardware)
355
+ selected_hardware = module_hardware
356
+ selected_definition = definition
357
+ break
358
+
359
+ if selected_hardware is None and self.is_simulating():
360
+ selected_hardware = self._sync_hardware.create_simulating_module(model)
361
+ selected_definition = module_geometry.load_definition(model)
362
+
363
+ if selected_hardware is None or selected_definition is None:
364
+ raise RuntimeError(f"Could not find specified module: {model.value}")
365
+
366
+ # Load geometry to match the hardware module that we found connected.
367
+ geometry = module_geometry.create_geometry(
368
+ definition=selected_definition,
369
+ parent=self._deck_layout.position_for(resolved_location),
370
+ configuration=configuration,
371
+ )
372
+
373
+ module_core = legacy_module_core.create_module_core(
374
+ module_hardware_api=selected_hardware,
375
+ requested_model=model,
376
+ geometry=geometry,
377
+ protocol_core=self,
378
+ )
379
+
380
+ self._deck_layout[resolved_location] = geometry
381
+ self._module_cores.append(module_core)
382
+
383
+ self.equipment_broker.publish(
384
+ ModuleLoadInfo(
385
+ requested_model=model,
386
+ loaded_model=module_core.get_model(),
387
+ module_serial=module_core.get_serial_number(),
388
+ deck_slot=module_core.get_deck_slot(),
389
+ configuration=configuration,
390
+ )
391
+ )
392
+
393
+ return module_core
394
+
395
+ def load_instrument(
396
+ self,
397
+ instrument_name: PipetteNameType,
398
+ mount: Mount,
399
+ liquid_presence_detection: bool = False,
400
+ ) -> LegacyInstrumentCore:
401
+ """Load an instrument."""
402
+ attached = {
403
+ att_mount: instr.get("name", None)
404
+ for att_mount, instr in self._sync_hardware.attached_instruments.items()
405
+ if instr
406
+ }
407
+ attached[mount] = instrument_name.value
408
+ self._sync_hardware.cache_instruments(attached)
409
+ # If the cache call didn’t raise, the instrument is attached
410
+ new_instr = LegacyInstrumentCore(
411
+ api_version=self._api_version,
412
+ protocol_interface=self,
413
+ mount=mount,
414
+ instrument_name=instrument_name.value,
415
+ default_speed=400.0, # TODO(mm, 2022-11-10): Deduplicate with engine core.
416
+ )
417
+ self._instruments[mount] = new_instr
418
+ logger.info("Instrument {} loaded".format(new_instr))
419
+
420
+ pipette_dict = self._sync_hardware.get_attached_instrument(mount)
421
+ self._equipment_broker.publish(
422
+ InstrumentLoadInfo(
423
+ instrument_load_name=instrument_name.value,
424
+ mount=mount,
425
+ pipette_dict=pipette_dict,
426
+ )
427
+ )
428
+
429
+ return new_instr
430
+
431
+ def load_trash_bin(self, slot_name: DeckSlotName, area_name: str) -> TrashBin:
432
+ raise APIVersionError(api_element="Loading deck configured trash bin")
433
+
434
+ def load_ot2_fixed_trash_bin(self) -> None:
435
+ raise APIVersionError(
436
+ api_element="Loading deck configured OT-2 fixed trash bin"
437
+ )
438
+
439
+ def load_waste_chute(self) -> WasteChute:
440
+ raise APIVersionError(api_element="Loading waste chute")
441
+
442
+ def get_loaded_instruments(
443
+ self,
444
+ ) -> Dict[Mount, Optional[LegacyInstrumentCore]]:
445
+ """Get a mapping of mount to instrument."""
446
+ return self._instruments
447
+
448
+ def get_disposal_locations(self) -> List[Union[Labware, TrashBin, WasteChute]]:
449
+ """Get valid disposal locations."""
450
+ return self._disposal_locations
451
+
452
+ def pause(self, msg: Optional[str]) -> None:
453
+ """Pause the protocol."""
454
+ self._sync_hardware.pause(PauseType.PAUSE)
455
+
456
+ def resume(self) -> None:
457
+ """Result the protocol."""
458
+ self._sync_hardware.resume(PauseType.PAUSE)
459
+
460
+ def comment(self, msg: str) -> None:
461
+ """Add comment to run log."""
462
+ pass
463
+
464
+ def delay(self, seconds: float, msg: Optional[str]) -> None:
465
+ """Delay execution for x seconds."""
466
+ self._sync_hardware.delay(seconds)
467
+
468
+ def home(self) -> None:
469
+ """Home the robot."""
470
+ self.set_last_location(None)
471
+ self._sync_hardware.home()
472
+
473
+ def get_deck(self) -> Deck:
474
+ """Get the deck layout."""
475
+ return self._deck_layout
476
+
477
+ @property
478
+ def fixed_trash(self) -> LegacyLabwareCore:
479
+ """The trash fixed to slot 12 of the robot deck."""
480
+ trash = self._deck_layout["12"]
481
+
482
+ if isinstance(trash, LegacyLabwareCore):
483
+ return trash
484
+ if isinstance(trash, Labware):
485
+ return cast(LegacyLabwareCore, trash._core)
486
+
487
+ raise RuntimeError("Robot must have a trash container in 12")
488
+
489
+ def set_rail_lights(self, on: bool) -> None:
490
+ """Set the rail light state."""
491
+ self._sync_hardware.set_lights(rails=on)
492
+
493
+ def get_rail_lights_on(self) -> bool:
494
+ """Get the rail light state."""
495
+ return self._sync_hardware.get_lights()["rails"] # type: ignore[no-any-return]
496
+
497
+ def door_closed(self) -> bool:
498
+ """Check if door is closed."""
499
+ return DoorState.CLOSED == self._sync_hardware.door_state # type: ignore[no-any-return]
500
+
501
+ def get_last_location(
502
+ self,
503
+ mount: Optional[Mount] = None,
504
+ ) -> Optional[Location]:
505
+ """Get the most recent moved to location."""
506
+ if mount is None or mount == self._last_mount:
507
+ return self._last_location
508
+
509
+ return None
510
+
511
+ def set_last_location(
512
+ self,
513
+ location: Optional[Location],
514
+ mount: Optional[Mount] = None,
515
+ ) -> None:
516
+ """Set the most recent moved to location."""
517
+ self._last_location = location
518
+ self._last_mount = mount
519
+
520
+ def load_lid_stack(
521
+ self,
522
+ load_name: str,
523
+ location: Union[DeckSlotName, StagingSlotName, LegacyLabwareCore],
524
+ quantity: int,
525
+ namespace: Optional[str],
526
+ version: Optional[int],
527
+ ) -> LegacyLabwareCore:
528
+ """Load a Stack of Lids to a given location, creating a Lid Stack."""
529
+ raise APIVersionError(api_element="Lid stack")
530
+
531
+ def load_labware_to_flex_stacker_hopper(
532
+ self,
533
+ module_core: legacy_module_core.LegacyModuleCore,
534
+ load_name: str,
535
+ quantity: int,
536
+ label: Optional[str],
537
+ namespace: Optional[str],
538
+ version: Optional[int],
539
+ lid: Optional[str],
540
+ ) -> None:
541
+ """Load labware to a Flex stacker hopper."""
542
+ raise APIVersionError(api_element="Flex stacker")
543
+
544
+ def get_module_cores(self) -> List[legacy_module_core.LegacyModuleCore]:
545
+ """Get loaded module cores."""
546
+ return self._module_cores
547
+
548
+ def get_labware_cores(self) -> List[LegacyLabwareCore]:
549
+ """Get all loaded labware cores."""
550
+ return self._labware_cores
551
+
552
+ def get_labware_on_module(
553
+ self, module_core: legacy_module_core.LegacyModuleCore
554
+ ) -> Optional[LegacyLabwareCore]:
555
+ """Get the item on top of a given module, if any."""
556
+ labware = module_core.geometry.labware
557
+ return cast(LegacyLabwareCore, labware._core) if labware is not None else None
558
+
559
+ def get_labware_on_labware(
560
+ self, labware_core: LegacyLabwareCore
561
+ ) -> Optional[LegacyLabwareCore]:
562
+ assert False, "get_labware_on_labware only supported on engine core"
563
+
564
+ def get_deck_definition(self) -> DeckDefinitionV5:
565
+ """Get the geometry definition of the robot's deck."""
566
+ assert False, "get_deck_definition only supported on engine core"
567
+
568
+ def get_slot_definition(
569
+ self, slot: Union[DeckSlotName, StagingSlotName]
570
+ ) -> SlotDefV3:
571
+ """Get the slot definition from the robot's deck."""
572
+ assert False, "get_slot_definition only supported on engine core"
573
+
574
+ def get_slot_definitions(self) -> Dict[str, SlotDefV3]:
575
+ """Get all standard slot definitions available in the deck definition."""
576
+ assert False, "get_slot_definitions only supported on engine core"
577
+
578
+ def get_staging_slot_definitions(self) -> Dict[str, SlotDefV3]:
579
+ """Get all staging slot definitions available in the deck definition."""
580
+ assert False, "get_staging_slot_definitions only supported on engine core"
581
+
582
+ def get_slot_item(
583
+ self, slot_name: Union[DeckSlotName, StagingSlotName]
584
+ ) -> Union[LegacyLabwareCore, legacy_module_core.LegacyModuleCore, None]:
585
+ """Get the contents of a given slot, if any."""
586
+ assert False, "get_slot_item only supported on engine core"
587
+
588
+ def get_slot_center(self, slot_name: Union[DeckSlotName, StagingSlotName]) -> Point:
589
+ """Get the absolute coordinate of a slot's center."""
590
+ assert False, "get_slot_center only supported on engine core."
591
+
592
+ def get_highest_z(self) -> float:
593
+ """Get the highest Z point of all deck items."""
594
+ assert False, "get_highest_z only supported on engine core"
595
+
596
+ def define_liquid(
597
+ self, name: str, description: Optional[str], display_color: Optional[str]
598
+ ) -> Liquid:
599
+ """Define a liquid to load into a well."""
600
+ assert False, "define_liquid only supported on engine core"
601
+
602
+ def get_liquid_class(self, name: str, version: int) -> LiquidClass:
603
+ """Get an instance of a built-in liquid class."""
604
+ assert False, "define_liquid_class is only supported on engine core"
605
+
606
+ def get_labware_location(
607
+ self, labware_core: LegacyLabwareCore
608
+ ) -> Union[
609
+ str, LegacyLabwareCore, legacy_module_core.LegacyModuleCore, OffDeckType
610
+ ]:
611
+ """Get labware parent location."""
612
+ assert False, "get_labware_location only supported on engine core"