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,592 @@
1
+ """Legacy Protocol API module implementation logic."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from typing import TYPE_CHECKING, List, Optional, cast
7
+
8
+ from opentrons.drivers.types import (
9
+ HeaterShakerLabwareLatchStatus,
10
+ ThermocyclerLidStatus,
11
+ )
12
+ from opentrons.hardware_control import SynchronousAdapter, modules as hw_modules
13
+ from opentrons.hardware_control.types import Axis
14
+ from opentrons.hardware_control.modules.types import (
15
+ ModuleModel,
16
+ TemperatureStatus,
17
+ MagneticStatus,
18
+ SpeedStatus,
19
+ MagneticModuleModel,
20
+ ThermocyclerStep,
21
+ )
22
+ from opentrons.types import DeckSlotName, Location
23
+
24
+
25
+ from ..module import (
26
+ AbstractModuleCore,
27
+ AbstractTemperatureModuleCore,
28
+ AbstractMagneticModuleCore,
29
+ AbstractThermocyclerCore,
30
+ AbstractHeaterShakerCore,
31
+ )
32
+
33
+ from .legacy_labware_core import LegacyLabwareCore
34
+ from .module_geometry import ModuleGeometry, ThermocyclerGeometry, HeaterShakerGeometry
35
+ from ...labware import Labware
36
+
37
+ if TYPE_CHECKING:
38
+ from .legacy_protocol_core import LegacyProtocolCore
39
+
40
+
41
+ _log = logging.getLogger(__name__)
42
+
43
+
44
+ class NoTargetTemperatureSetError(RuntimeError):
45
+ """An error raised when awaiting temperature when no target was set."""
46
+
47
+
48
+ class CannotPerformModuleAction(RuntimeError):
49
+ """An error raised when attempting to execute an invalid module action."""
50
+
51
+
52
+ class LegacyModuleCore(AbstractModuleCore[LegacyLabwareCore]):
53
+ """Legacy ModuleCore implementation for pre-ProtocolEngine protocols."""
54
+
55
+ def __init__(
56
+ self,
57
+ sync_module_hardware: SynchronousAdapter[hw_modules.AbstractModule],
58
+ requested_model: ModuleModel,
59
+ geometry: ModuleGeometry,
60
+ protocol_core: LegacyProtocolCore,
61
+ ) -> None:
62
+ self._sync_module_hardware = sync_module_hardware
63
+ self._requested_model = requested_model
64
+ self._geometry = geometry
65
+ self._protocol_core = protocol_core
66
+
67
+ @property
68
+ def geometry(self) -> ModuleGeometry:
69
+ return self._geometry
70
+
71
+ def get_model(self) -> ModuleModel:
72
+ """Get the module's model identifier."""
73
+ return self._geometry.model
74
+
75
+ def get_requested_model(self) -> ModuleModel:
76
+ """Get the model identifier the module was requested as.
77
+
78
+ This may differ from the actual model returned by `get_model`.
79
+ """
80
+ return self._requested_model
81
+
82
+ def get_serial_number(self) -> str:
83
+ """Get the module's unique hardware serial number."""
84
+ device_info = self._sync_module_hardware.device_info
85
+ return cast(str, device_info["serial"])
86
+
87
+ def get_deck_slot(self) -> DeckSlotName:
88
+ """Get the module's deck slot."""
89
+ return DeckSlotName.from_primitive(self._geometry.parent) # type: ignore[arg-type]
90
+
91
+ def get_deck_slot_id(self) -> str:
92
+ return self.get_deck_slot().id
93
+
94
+ def get_display_name(self) -> str:
95
+ """Get the module's display name."""
96
+ return self._geometry.display_name
97
+
98
+ def add_labware_core(self, labware_core: LegacyLabwareCore) -> Labware:
99
+ """Add a labware to the module."""
100
+ labware = self.geometry.add_labware(
101
+ Labware(
102
+ core=labware_core,
103
+ api_version=self._protocol_core.api_version,
104
+ protocol_core=None, # type: ignore[arg-type]
105
+ core_map=None, # type: ignore[arg-type]
106
+ )
107
+ )
108
+ self._protocol_core.get_deck().recalculate_high_z()
109
+ return labware
110
+
111
+
112
+ class LegacyTemperatureModuleCore(
113
+ LegacyModuleCore, AbstractTemperatureModuleCore[LegacyLabwareCore]
114
+ ):
115
+ """Legacy core control implementation for an attached Temperature Module."""
116
+
117
+ _sync_module_hardware: SynchronousAdapter[hw_modules.TempDeck]
118
+
119
+ def set_target_temperature(self, celsius: float) -> None:
120
+ """Set the Temperature Module's target temperature in °C."""
121
+ self._sync_module_hardware.start_set_temperature(celsius)
122
+
123
+ def wait_for_target_temperature(self, celsius: Optional[float] = None) -> None:
124
+ """Wait until the module's target temperature is reached.
125
+
126
+ Specifying a value for ``celsius`` that is different than
127
+ the module's current target temperature may behave unpredictably.
128
+ """
129
+ self._sync_module_hardware.await_temperature(celsius)
130
+
131
+ def deactivate(self) -> None:
132
+ """Deactivate the Temperature Module."""
133
+ self._sync_module_hardware.deactivate()
134
+
135
+ def get_current_temperature(self) -> float:
136
+ """Get the module's current temperature in °C."""
137
+ return self._sync_module_hardware.temperature # type: ignore[no-any-return]
138
+
139
+ def get_target_temperature(self) -> Optional[float]:
140
+ """Get the module's target temperature in °C, if set."""
141
+ return self._sync_module_hardware.target # type: ignore[no-any-return]
142
+
143
+ def get_status(self) -> TemperatureStatus:
144
+ """Get the module's current temperature status."""
145
+ return self._sync_module_hardware.status # type: ignore[no-any-return]
146
+
147
+
148
+ class LegacyMagneticModuleCore(
149
+ LegacyModuleCore, AbstractMagneticModuleCore[LegacyLabwareCore]
150
+ ):
151
+ """Core control interface for an attached Magnetic Module."""
152
+
153
+ _sync_module_hardware: SynchronousAdapter[hw_modules.MagDeck]
154
+
155
+ def engage(
156
+ self,
157
+ height_from_base: Optional[float] = None,
158
+ height_from_home: Optional[float] = None,
159
+ ) -> None:
160
+ """Raise the module's magnets.
161
+
162
+ Only one of `height_from_base` or `height_from_home` may be specified.
163
+
164
+ Args:
165
+ height_from_base: Distance from labware base to raise the magnets.
166
+ height_from_home: Distance from motor home position to raise the magnets.
167
+ """
168
+ # TODO(mc, 2022-09-23): update when HW API uses real millimeters
169
+ # https://opentrons.atlassian.net/browse/RET-1242
170
+ if height_from_base is not None:
171
+ self._sync_module_hardware.engage(height_from_base=height_from_base)
172
+ else:
173
+ assert height_from_home is not None, "Engage height must be specified"
174
+ self._sync_module_hardware.engage(height=height_from_home)
175
+
176
+ def engage_to_labware(
177
+ self,
178
+ offset: float = 0,
179
+ preserve_half_mm: bool = False,
180
+ ) -> None:
181
+ """Raise the module's magnets up to its loaded labware.
182
+
183
+ Args:
184
+ offset: Offset from the labware's default engage height.
185
+ preserve_half_mm: Preserve any values that may accidentally be in half-mm,
186
+ passing them directly onwards to the hardware control API.
187
+
188
+ Raises:
189
+ ValueError: Labware is not loaded or has no default engage height.
190
+ """
191
+ labware = self._geometry.labware
192
+
193
+ if labware is None:
194
+ raise ValueError(
195
+ "No labware loaded in Magnetic Module;"
196
+ " you must specify an engage height explicitly"
197
+ " using `height_from_base` or `height`"
198
+ )
199
+
200
+ labware_core = cast(LegacyLabwareCore, labware._core)
201
+ engage_height = labware_core.get_default_magnet_engage_height(preserve_half_mm)
202
+
203
+ if engage_height is None:
204
+ raise ValueError(
205
+ f"Currently loaded labware {labware} does not have"
206
+ " a default engage height; specify engage height explicitly"
207
+ " using `height_from_base` or `height`"
208
+ )
209
+
210
+ if (
211
+ self._geometry.model == MagneticModuleModel.MAGNETIC_V1
212
+ and not preserve_half_mm
213
+ ):
214
+ engage_height *= 2
215
+
216
+ # TODO(mc, 2022-09-23): use real millimeters instead of model-dependent mm
217
+ # https://opentrons.atlassian.net/browse/RET-1242
218
+ # TODO(mc, 2022-09-23): use `height_from_base` to match JSONv5
219
+ # https://opentrons.atlassian.net/browse/RSS-110
220
+ self._sync_module_hardware.engage(height=engage_height + offset)
221
+
222
+ def disengage(self) -> None:
223
+ """Lower the magnets back into the module."""
224
+ self._sync_module_hardware.deactivate()
225
+
226
+ def get_status(self) -> MagneticStatus:
227
+ """Get the module's current magnet status."""
228
+ return self._sync_module_hardware.status # type: ignore[no-any-return]
229
+
230
+ def add_labware_core(self, labware_core: LegacyLabwareCore) -> Labware:
231
+ """Add a labware to the module."""
232
+ labware = super().add_labware_core(labware_core)
233
+ if labware_core.get_default_magnet_engage_height() is None:
234
+ name = labware_core.get_name()
235
+ _log.warning(
236
+ f"The labware definition for {name} does not define a"
237
+ " default engagement height for use with the Magnetic Module;"
238
+ " you must specify a height explicitly when calling engage()."
239
+ )
240
+ return labware
241
+
242
+
243
+ class LegacyThermocyclerCore(
244
+ LegacyModuleCore, AbstractThermocyclerCore[LegacyLabwareCore]
245
+ ):
246
+ """Core control interface for an attached Thermocycler Module."""
247
+
248
+ _sync_module_hardware: SynchronousAdapter[hw_modules.Thermocycler]
249
+ _geometry: ThermocyclerGeometry
250
+
251
+ def open_lid(self) -> ThermocyclerLidStatus:
252
+ """Open the thermocycler's lid."""
253
+ self._prepare_for_lid_move()
254
+ self._geometry.lid_status = self._sync_module_hardware.open()
255
+ return self._geometry.lid_status
256
+
257
+ def close_lid(self) -> ThermocyclerLidStatus:
258
+ """Close the thermocycler's lid."""
259
+ self._prepare_for_lid_move()
260
+ self._geometry.lid_status = self._sync_module_hardware.close()
261
+ return self._geometry.lid_status
262
+
263
+ def set_target_block_temperature(
264
+ self,
265
+ celsius: float,
266
+ hold_time_seconds: Optional[float] = None,
267
+ block_max_volume: Optional[float] = None,
268
+ ) -> None:
269
+ """Set the target temperature for the well block, in °C."""
270
+ self._sync_module_hardware.set_target_block_temperature(
271
+ celsius=celsius,
272
+ hold_time_seconds=hold_time_seconds,
273
+ volume=block_max_volume,
274
+ )
275
+
276
+ def wait_for_block_temperature(self) -> None:
277
+ """Wait for target block temperature to be reached."""
278
+ self._sync_module_hardware.wait_for_block_target()
279
+
280
+ def set_target_lid_temperature(self, celsius: float) -> None:
281
+ """Set the target temperature for the heated lid, in °C."""
282
+ self._sync_module_hardware.set_target_lid_temperature(celsius=celsius)
283
+
284
+ def wait_for_lid_temperature(self) -> None:
285
+ """Wait for target lid temperature to be reached."""
286
+ self._sync_module_hardware.wait_for_lid_target()
287
+
288
+ def execute_profile(
289
+ self,
290
+ steps: List[ThermocyclerStep],
291
+ repetitions: int,
292
+ block_max_volume: Optional[float] = None,
293
+ ) -> None:
294
+ """Execute a Thermocycler Profile."""
295
+ self._sync_module_hardware.cycle_temperatures(
296
+ steps=steps, repetitions=repetitions, volume=block_max_volume
297
+ )
298
+
299
+ def deactivate_lid(self) -> None:
300
+ """Turn off the heated lid."""
301
+ self._sync_module_hardware.deactivate_lid()
302
+
303
+ def deactivate_block(self) -> None:
304
+ """Turn off the well block temperature controller"""
305
+ self._sync_module_hardware.deactivate_block()
306
+
307
+ def deactivate(self) -> None:
308
+ """Turn off the well block temperature controller, and heated lid"""
309
+ self._sync_module_hardware.deactivate()
310
+
311
+ def get_lid_position(self) -> Optional[ThermocyclerLidStatus]:
312
+ """Get the thermocycler's lid position."""
313
+ return self._sync_module_hardware.lid_status # type: ignore[no-any-return]
314
+
315
+ def get_block_temperature_status(self) -> TemperatureStatus:
316
+ """Get the thermocycler's block temperature status."""
317
+ return self._sync_module_hardware.status # type: ignore[no-any-return]
318
+
319
+ def get_lid_temperature_status(self) -> Optional[TemperatureStatus]:
320
+ """Get the thermocycler's lid temperature status."""
321
+ return self._sync_module_hardware.lid_temp_status # type: ignore[no-any-return]
322
+
323
+ def get_block_temperature(self) -> Optional[float]:
324
+ """Get the thermocycler's current block temperature in °C."""
325
+ return self._sync_module_hardware.temperature # type: ignore[no-any-return]
326
+
327
+ def get_block_target_temperature(self) -> Optional[float]:
328
+ """Get the thermocycler's target block temperature in °C."""
329
+ return self._sync_module_hardware.target # type: ignore[no-any-return]
330
+
331
+ def get_lid_temperature(self) -> Optional[float]:
332
+ """Get the thermocycler's current lid temperature in °C."""
333
+ return self._sync_module_hardware.lid_temp # type: ignore[no-any-return]
334
+
335
+ def get_lid_target_temperature(self) -> Optional[float]:
336
+ """Get the thermocycler's target lid temperature in °C."""
337
+ return self._sync_module_hardware.lid_target # type: ignore[no-any-return]
338
+
339
+ def get_ramp_rate(self) -> Optional[float]:
340
+ """Get the thermocycler's current ramp rate in °C/sec."""
341
+ return self._sync_module_hardware.ramp_rate # type: ignore[no-any-return]
342
+
343
+ def get_hold_time(self) -> Optional[float]:
344
+ """Get the remaining hold time in seconds."""
345
+ return self._sync_module_hardware.hold_time # type: ignore[no-any-return]
346
+
347
+ def get_total_cycle_count(self) -> Optional[int]:
348
+ """Get number of repetitions for current set cycle."""
349
+ return self._sync_module_hardware.total_cycle_count # type: ignore[no-any-return]
350
+
351
+ def get_current_cycle_index(self) -> Optional[int]:
352
+ """Get index of the current set cycle repetition."""
353
+ return self._sync_module_hardware.current_cycle_index # type: ignore[no-any-return]
354
+
355
+ def get_total_step_count(self) -> Optional[int]:
356
+ """Get number of steps within the current cycle."""
357
+ return self._sync_module_hardware.total_step_count # type: ignore[no-any-return]
358
+
359
+ def get_current_step_index(self) -> Optional[int]:
360
+ """Get the index of the current step within the current cycle."""
361
+ return self._sync_module_hardware.current_step_index # type: ignore[no-any-return]
362
+
363
+ def flag_unsafe_move(self, to_loc: Location, from_loc: Location) -> None:
364
+ """Check if a movement may interfere with this Thermocycler.
365
+
366
+ Args:
367
+ to_loc: Movement destination.
368
+ from_loc: Movement origin.
369
+
370
+ Raises:
371
+ RuntimeError: The movement is unsafe.
372
+ """
373
+ self._geometry.flag_unsafe_move(to_loc, from_loc, self.get_lid_position())
374
+
375
+ def _prepare_for_lid_move(self) -> None:
376
+ loaded_instruments = [
377
+ instr
378
+ for mount, instr in self._protocol_core.get_loaded_instruments().items()
379
+ if instr is not None
380
+ ]
381
+ try:
382
+ instr_core = loaded_instruments[0]
383
+ except IndexError:
384
+ _log.warning(
385
+ "Cannot assure a safe gantry position to avoid colliding"
386
+ " with the lid of the Thermocycler Module."
387
+ )
388
+ else:
389
+ protocol_core = self._protocol_core
390
+ hardware = protocol_core.get_hardware()
391
+ hardware.retract(instr_core.get_mount())
392
+ high_point = hardware.current_position(instr_core.get_mount())
393
+ trash_top = protocol_core.fixed_trash.get_well_core("A1").get_top(
394
+ z_offset=0
395
+ )
396
+ safe_point = trash_top._replace(
397
+ z=high_point[Axis.by_mount(instr_core.get_mount())]
398
+ )
399
+ instr_core.move_to(
400
+ location=Location(safe_point, None),
401
+ well_core=None,
402
+ force_direct=True,
403
+ minimum_z_height=None,
404
+ speed=None,
405
+ )
406
+
407
+
408
+ class LegacyHeaterShakerCore(
409
+ LegacyModuleCore, AbstractHeaterShakerCore[LegacyLabwareCore]
410
+ ):
411
+ """Core control interface for an attached Heater-Shaker Module."""
412
+
413
+ _sync_module_hardware: SynchronousAdapter[hw_modules.HeaterShaker]
414
+ _geometry: HeaterShakerGeometry
415
+
416
+ def set_target_temperature(self, celsius: float) -> None:
417
+ """Set the labware plate's target temperature in °C."""
418
+ self._sync_module_hardware.start_set_temperature(celsius)
419
+
420
+ def wait_for_target_temperature(self) -> None:
421
+ """Wait for the labware plate's target temperature to be reached."""
422
+ target_temperature = self.get_target_temperature()
423
+
424
+ if target_temperature is None:
425
+ raise NoTargetTemperatureSetError(
426
+ "Heater-Shaker Module does not have a target temperature set."
427
+ )
428
+
429
+ self._sync_module_hardware.await_temperature(target_temperature)
430
+
431
+ def set_and_wait_for_shake_speed(self, rpm: int) -> None:
432
+ """Set the shaker's target shake speed and wait for it to spin up."""
433
+ if (
434
+ self.get_labware_latch_status()
435
+ == HeaterShakerLabwareLatchStatus.IDLE_CLOSED
436
+ ):
437
+ self._prepare_for_shake()
438
+ self._sync_module_hardware.set_speed(rpm=rpm)
439
+ else:
440
+ # TODO: Figure out whether to issue close latch behind the scenes instead
441
+ raise CannotPerformModuleAction(
442
+ "Cannot start shaking unless labware latch is closed."
443
+ )
444
+
445
+ def open_labware_latch(self) -> None:
446
+ """Open the labware latch."""
447
+ if self.get_speed_status() != SpeedStatus.IDLE:
448
+ # TODO: What to do when speed status is ERROR?
449
+ raise CannotPerformModuleAction(
450
+ """Cannot open labware latch while module is shaking."""
451
+ )
452
+ self._prepare_for_latch_open()
453
+ self._sync_module_hardware.open_labware_latch()
454
+
455
+ def close_labware_latch(self) -> None:
456
+ """Close the labware latch."""
457
+ self._sync_module_hardware.close_labware_latch()
458
+
459
+ def deactivate_shaker(self) -> None:
460
+ """Stop shaking."""
461
+ self._sync_module_hardware.deactivate_shaker()
462
+
463
+ def deactivate_heater(self) -> None:
464
+ """Stop heating."""
465
+ self._sync_module_hardware.deactivate_heater()
466
+
467
+ def get_current_temperature(self) -> float:
468
+ """Get the labware plate's current temperature in °C."""
469
+ return self._sync_module_hardware.temperature # type: ignore[no-any-return]
470
+
471
+ def get_target_temperature(self) -> Optional[float]:
472
+ """Get the labware plate's target temperature in °C, if set."""
473
+ return self._sync_module_hardware.target_temperature # type: ignore[no-any-return]
474
+
475
+ def get_current_speed(self) -> int:
476
+ """Get the shaker's current speed in RPM."""
477
+ return self._sync_module_hardware.speed # type: ignore[no-any-return]
478
+
479
+ def get_target_speed(self) -> Optional[int]:
480
+ """Get the shaker's target speed in RPM, if set."""
481
+ return self._sync_module_hardware.target_speed # type: ignore[no-any-return]
482
+
483
+ def get_temperature_status(self) -> TemperatureStatus:
484
+ """Get the module's heater status."""
485
+ return self._sync_module_hardware.temperature_status # type: ignore[no-any-return]
486
+
487
+ def get_speed_status(self) -> SpeedStatus:
488
+ """Get the module's heater status."""
489
+ return self._sync_module_hardware.speed_status # type: ignore[no-any-return]
490
+
491
+ def get_labware_latch_status(self) -> HeaterShakerLabwareLatchStatus:
492
+ """Get the module's labware latch status."""
493
+ return self._sync_module_hardware.labware_latch_status # type: ignore[no-any-return]
494
+
495
+ def flag_unsafe_move(self, to_loc: Location, is_multichannel: bool) -> None:
496
+ """Check if a movement may interfere with this Heater-Shaker.
497
+
498
+ Args:
499
+ to_loc: Movement destination.
500
+ is_multichannel: If the pipette is a multi-channel pipette,
501
+ which has more movement restrictions than a single-channel.
502
+
503
+ Raises:
504
+ TypeError: `to_loc` is an invalid destination.
505
+ RuntimeError: The movement is unsafe.
506
+ """
507
+ destination_slot = to_loc.labware.first_parent()
508
+ if destination_slot is None:
509
+ _log.warning(
510
+ "Pipette movement destination has no slot associated with it. Cannot"
511
+ " determine whether movement will safely avoid colliding with the Heater-Shaker."
512
+ )
513
+ return
514
+
515
+ is_labware_latch_closed = (
516
+ self.get_labware_latch_status()
517
+ == HeaterShakerLabwareLatchStatus.IDLE_CLOSED
518
+ )
519
+ is_plate_shaking = self.get_speed_status() != SpeedStatus.IDLE
520
+
521
+ to_labware_like = to_loc.labware
522
+ is_tiprack: bool
523
+ if (
524
+ to_labware_like.is_labware
525
+ ): # Do we consider this a valid location for move_to?
526
+ is_tiprack = to_labware_like.as_labware().is_tiprack
527
+ elif to_labware_like.parent.is_labware:
528
+ is_tiprack = to_labware_like.parent.as_labware().is_tiprack
529
+ else:
530
+ raise TypeError(
531
+ "Invalid destination location type. "
532
+ "Cannot determine pipette movement safety."
533
+ )
534
+
535
+ self._geometry.flag_unsafe_move(
536
+ to_slot=int(destination_slot),
537
+ is_tiprack=is_tiprack,
538
+ is_using_multichannel=is_multichannel,
539
+ is_plate_shaking=is_plate_shaking,
540
+ is_labware_latch_closed=is_labware_latch_closed,
541
+ )
542
+
543
+ def _prepare_for_shake(self) -> None:
544
+ """
545
+ Before shaking, retracts pipettes if they're parked over a slot
546
+ adjacent to the heater-shaker.
547
+ """
548
+ protocol_core = self._protocol_core
549
+ if self._geometry.is_pipette_blocking_shake_movement(
550
+ pipette_location=protocol_core.get_last_location()
551
+ ):
552
+ hardware = protocol_core.get_hardware()
553
+ hardware.home(axes=[axis for axis in Axis.ot2_mount_axes()])
554
+ protocol_core.set_last_location(None)
555
+
556
+ def _prepare_for_latch_open(self) -> None:
557
+ """
558
+ Before opening latch, retracts pipettes if they're parked over a slot
559
+ east/ west of the heater-shaker.
560
+ """
561
+ protocol_core = self._protocol_core
562
+ if self._geometry.is_pipette_blocking_latch_movement(
563
+ pipette_location=protocol_core.get_last_location()
564
+ ):
565
+ hardware = protocol_core.get_hardware()
566
+ hardware.home(axes=[axis for axis in Axis.ot2_mount_axes()])
567
+ protocol_core.set_last_location(None)
568
+
569
+
570
+ def create_module_core(
571
+ module_hardware_api: hw_modules.AbstractModule,
572
+ requested_model: ModuleModel,
573
+ geometry: ModuleGeometry,
574
+ protocol_core: LegacyProtocolCore,
575
+ ) -> LegacyModuleCore:
576
+ core_cls = LegacyModuleCore
577
+
578
+ if isinstance(module_hardware_api, hw_modules.TempDeck):
579
+ core_cls = LegacyTemperatureModuleCore
580
+ elif isinstance(module_hardware_api, hw_modules.MagDeck):
581
+ core_cls = LegacyMagneticModuleCore
582
+ elif isinstance(module_hardware_api, hw_modules.Thermocycler):
583
+ core_cls = LegacyThermocyclerCore
584
+ elif isinstance(module_hardware_api, hw_modules.HeaterShaker):
585
+ core_cls = LegacyHeaterShakerCore
586
+
587
+ return core_cls(
588
+ sync_module_hardware=SynchronousAdapter(module_hardware_api),
589
+ requested_model=requested_model,
590
+ geometry=geometry,
591
+ protocol_core=protocol_core,
592
+ )