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,99 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Optional, Dict
3
+
4
+ from opentrons.drivers.types import Temperature, ThermocyclerLidStatus, PlateTemperature
5
+
6
+
7
+ class AbstractThermocyclerDriver(ABC):
8
+ @abstractmethod
9
+ async def connect(self) -> None:
10
+ """Connect to thermocycler"""
11
+ ...
12
+
13
+ @abstractmethod
14
+ async def disconnect(self) -> None:
15
+ """Disconnect from thermocycler"""
16
+ ...
17
+
18
+ @abstractmethod
19
+ async def is_connected(self) -> bool:
20
+ """Check connection"""
21
+ ...
22
+
23
+ @abstractmethod
24
+ async def open_lid(self) -> None:
25
+ """Send open lid command"""
26
+ ...
27
+
28
+ @abstractmethod
29
+ async def close_lid(self) -> None:
30
+ """Send close lid command"""
31
+ ...
32
+
33
+ @abstractmethod
34
+ async def lift_plate(self) -> None:
35
+ """Send the Plate Lift command."""
36
+
37
+ @abstractmethod
38
+ async def get_lid_status(self) -> ThermocyclerLidStatus:
39
+ """Send get lid status command"""
40
+ ...
41
+
42
+ @abstractmethod
43
+ async def set_lid_temperature(self, temp: float) -> None:
44
+ """Set the lid temperature"""
45
+ ...
46
+
47
+ @abstractmethod
48
+ async def get_lid_temperature(self) -> Temperature:
49
+ """Send a get lid temperature command."""
50
+ ...
51
+
52
+ @abstractmethod
53
+ async def set_plate_temperature(
54
+ self,
55
+ temp: float,
56
+ hold_time: Optional[float] = None,
57
+ volume: Optional[float] = None,
58
+ ) -> None:
59
+ """Send set plate temperature command"""
60
+ ...
61
+
62
+ @abstractmethod
63
+ async def get_plate_temperature(self) -> PlateTemperature:
64
+ """Send a get plate temperature command."""
65
+ ...
66
+
67
+ @abstractmethod
68
+ async def set_ramp_rate(self, ramp_rate: float) -> None:
69
+ """Send a set ramp rate command"""
70
+ ...
71
+
72
+ @abstractmethod
73
+ async def deactivate_all(self) -> None:
74
+ """Send deactivate all command."""
75
+ ...
76
+
77
+ @abstractmethod
78
+ async def deactivate_lid(self) -> None:
79
+ """Send deactivate lid command"""
80
+ ...
81
+
82
+ @abstractmethod
83
+ async def deactivate_block(self) -> None:
84
+ """Send deactivate block command"""
85
+ ...
86
+
87
+ @abstractmethod
88
+ async def get_device_info(self) -> Dict[str, str]:
89
+ """Send get device info command"""
90
+ ...
91
+
92
+ @abstractmethod
93
+ async def enter_programming_mode(self) -> None:
94
+ ...
95
+
96
+ @abstractmethod
97
+ async def jog_lid(self, angle: float) -> None:
98
+ """Send the Jog Lid command."""
99
+ ...
@@ -0,0 +1,395 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import logging
5
+ from enum import Enum
6
+ from typing import Optional, Dict, Union
7
+
8
+ from opentrons.drivers import utils
9
+ from opentrons.drivers.command_builder import CommandBuilder
10
+ from opentrons.drivers.asyncio.communication import (
11
+ SerialConnection,
12
+ AsyncResponseSerialConnection,
13
+ AsyncSerial,
14
+ UnhandledGcode,
15
+ )
16
+ from opentrons.drivers.thermocycler.abstract import AbstractThermocyclerDriver
17
+ from opentrons.drivers.types import Temperature, PlateTemperature, ThermocyclerLidStatus
18
+
19
+ log = logging.getLogger(__name__)
20
+
21
+
22
+ class GCODE(str, Enum):
23
+ OPEN_LID = "M126"
24
+ CLOSE_LID = "M127"
25
+ PLATE_LIFT = "M128"
26
+ GET_LID_STATUS = "M119"
27
+ SET_LID_TEMP = "M140"
28
+ GET_LID_TEMP = "M141"
29
+ EDIT_PID_PARAMS = "M301"
30
+ SET_PLATE_TEMP = "M104"
31
+ GET_PLATE_TEMP = "M105"
32
+ SET_RAMP_RATE = "M566"
33
+ DEACTIVATE_ALL = "M18"
34
+ DEACTIVATE_LID = "M108"
35
+ DEACTIVATE_BLOCK = "M14"
36
+ DEVICE_INFO = "M115"
37
+ GET_RESET_REASON = "M114"
38
+ ENTER_PROGRAMMING = "dfu"
39
+
40
+
41
+ LID_TARGET_DEFAULT = 105 # Degree celsius (floats)
42
+ LID_TARGET_MIN = 37
43
+ LID_TARGET_MAX = 110
44
+ BLOCK_TARGET_MIN = 0
45
+ BLOCK_TARGET_MAX = 99
46
+ BLOCK_VOL_MIN = 0
47
+ BLOCK_VOL_MAX = 100
48
+ TEMP_UPDATE_RETRIES = 50
49
+ TEMP_BUFFER_MAX_LEN = 10
50
+
51
+
52
+ TC_BAUDRATE = 115200
53
+ TC_BOOTLOADER_BAUDRATE = 1200
54
+ # TODO (Laura 20190327) increased the thermocycler command timeout
55
+ # temporarily until we can change the firmware to asynchronously handle
56
+ # the lid being open and closed
57
+ SERIAL_ACK = "\r\n"
58
+ TC_COMMAND_TERMINATOR = SERIAL_ACK
59
+ TC_ACK = "ok" + SERIAL_ACK + "ok" + SERIAL_ACK
60
+ DEFAULT_TC_TIMEOUT = 40
61
+ DEFAULT_COMMAND_RETRIES = 3
62
+
63
+ # The ACK for Gen2 will never contain a carriage return.
64
+ TC_GEN2_SERIAL_ACK = "\n"
65
+ TC_GEN2_ACK = " OK" + TC_GEN2_SERIAL_ACK
66
+ TC_GEN2_ERROR_WORD = "ERR"
67
+ TC_GEN2_ASYNC_ERROR_ACK = "async"
68
+
69
+ SerialKind = Union[AsyncResponseSerialConnection, SerialConnection]
70
+
71
+
72
+ class ThermocyclerDriverFactory:
73
+ @staticmethod
74
+ async def create(
75
+ port: str, loop: Optional[asyncio.AbstractEventLoop]
76
+ ) -> ThermocyclerDriver:
77
+ """
78
+ Create a thermocycler driver.
79
+
80
+ Args:
81
+ port: port or url of thermocycler
82
+ loop: optional event loop
83
+
84
+ Returns: driver
85
+ """
86
+ serial_port = await AsyncSerial.create(
87
+ port=port,
88
+ baud_rate=TC_BAUDRATE,
89
+ timeout=DEFAULT_TC_TIMEOUT,
90
+ loop=loop,
91
+ reset_buffer_before_write=False,
92
+ )
93
+ connection_temp = SerialConnection(
94
+ serial=serial_port,
95
+ port=port,
96
+ name=port,
97
+ ack=TC_GEN2_SERIAL_ACK,
98
+ retry_wait_time_seconds=0.1,
99
+ error_keyword="err",
100
+ alarm_keyword="alarm",
101
+ )
102
+
103
+ is_gen2 = await ThermocyclerDriverFactory.is_gen2_thermocycler(connection_temp)
104
+ # Must reset input data because the old setting of the ACK did
105
+ # not necessarily capture the entire response.
106
+ serial_port.reset_input_buffer()
107
+
108
+ if is_gen2:
109
+ async_connection = AsyncResponseSerialConnection(
110
+ serial=serial_port,
111
+ port=port,
112
+ name=port,
113
+ ack=TC_GEN2_ACK,
114
+ retry_wait_time_seconds=0.1,
115
+ error_keyword=TC_GEN2_ERROR_WORD,
116
+ alarm_keyword="alarm",
117
+ async_error_ack=TC_GEN2_ASYNC_ERROR_ACK,
118
+ )
119
+ return ThermocyclerDriverV2(async_connection)
120
+ else:
121
+ connection = SerialConnection(
122
+ serial=serial_port,
123
+ port=port,
124
+ name=port,
125
+ ack=TC_ACK,
126
+ retry_wait_time_seconds=0.1,
127
+ error_keyword="error",
128
+ alarm_keyword="alarm",
129
+ )
130
+ return ThermocyclerDriver(connection)
131
+
132
+ @staticmethod
133
+ async def is_gen2_thermocycler(connection: SerialConnection) -> bool:
134
+ """
135
+ Send a message through a connection to check if the connected
136
+ thermocycler is a Gen1 or Gen2 model
137
+ """
138
+
139
+ # The DEVICE_INFO response will disambiguate which version of
140
+ # TC is connected. Gen1 TC responses do not include the command code
141
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
142
+ gcode=GCODE.DEVICE_INFO
143
+ )
144
+ response = await connection.send_command(
145
+ command=c, retries=DEFAULT_COMMAND_RETRIES
146
+ )
147
+
148
+ return response.startswith(GCODE.DEVICE_INFO)
149
+
150
+
151
+ class ThermocyclerDriver(AbstractThermocyclerDriver):
152
+ def __init__(
153
+ self,
154
+ connection: SerialKind,
155
+ ) -> None:
156
+ """
157
+ Constructor
158
+
159
+ Args:
160
+ connection: SerialConnection to the thermocycler
161
+ """
162
+ self._connection = connection
163
+
164
+ async def connect(self) -> None:
165
+ """Connect to thermocycler"""
166
+ await self._connection.open()
167
+
168
+ async def disconnect(self) -> None:
169
+ """Disconnect from thermocycler"""
170
+ await self._connection.close()
171
+
172
+ async def is_connected(self) -> bool:
173
+ """Check connection"""
174
+ return await self._connection.is_open()
175
+
176
+ async def open_lid(self) -> None:
177
+ """Send open lid command"""
178
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
179
+ gcode=GCODE.OPEN_LID
180
+ )
181
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
182
+
183
+ async def close_lid(self) -> None:
184
+ """Send close lid command"""
185
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
186
+ gcode=GCODE.CLOSE_LID
187
+ )
188
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
189
+
190
+ async def get_lid_status(self) -> ThermocyclerLidStatus:
191
+ """Send get lid status command"""
192
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
193
+ gcode=GCODE.GET_LID_STATUS
194
+ )
195
+ response = await self._connection.send_command(
196
+ command=c, retries=DEFAULT_COMMAND_RETRIES
197
+ )
198
+ return ThermocyclerLidStatus(utils.parse_key_values(value=response)["Lid"])
199
+
200
+ async def set_lid_temperature(self, temp: float) -> None:
201
+ """Set the lid temperature"""
202
+ temp = min(LID_TARGET_MAX, max(LID_TARGET_MIN, temp))
203
+ c = (
204
+ CommandBuilder(terminator=TC_COMMAND_TERMINATOR)
205
+ .add_gcode(gcode=GCODE.SET_LID_TEMP)
206
+ .add_float(
207
+ prefix="S", value=temp, precision=utils.TC_GCODE_ROUNDING_PRECISION
208
+ )
209
+ )
210
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
211
+
212
+ async def get_lid_temperature(self) -> Temperature:
213
+ """Send a get lid temperature command."""
214
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
215
+ gcode=GCODE.GET_LID_TEMP
216
+ )
217
+ response = await self._connection.send_command(
218
+ command=c, retries=DEFAULT_COMMAND_RETRIES
219
+ )
220
+ return utils.parse_temperature_response(
221
+ temperature_string=response, rounding_val=utils.TC_GCODE_ROUNDING_PRECISION
222
+ )
223
+
224
+ async def set_plate_temperature(
225
+ self,
226
+ temp: float,
227
+ hold_time: Optional[float] = None,
228
+ volume: Optional[float] = None,
229
+ ) -> None:
230
+ """Send set plate temperature command"""
231
+ temp = min(BLOCK_TARGET_MAX, max(BLOCK_TARGET_MIN, temp))
232
+
233
+ c = (
234
+ CommandBuilder(terminator=TC_COMMAND_TERMINATOR)
235
+ .add_gcode(gcode=GCODE.SET_PLATE_TEMP)
236
+ .add_float(
237
+ prefix="S", value=temp, precision=utils.TC_GCODE_ROUNDING_PRECISION
238
+ )
239
+ )
240
+ if hold_time is not None:
241
+ c = c.add_float(
242
+ prefix="H", value=hold_time, precision=utils.TC_GCODE_ROUNDING_PRECISION
243
+ )
244
+ if volume is not None:
245
+ c = c.add_float(
246
+ prefix="V", value=volume, precision=utils.TC_GCODE_ROUNDING_PRECISION
247
+ )
248
+
249
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
250
+
251
+ async def get_plate_temperature(self) -> PlateTemperature:
252
+ """Send a get plate temperature command."""
253
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
254
+ gcode=GCODE.GET_PLATE_TEMP
255
+ )
256
+ response = await self._connection.send_command(
257
+ command=c, retries=DEFAULT_COMMAND_RETRIES
258
+ )
259
+ return utils.parse_plate_temperature_response(
260
+ temperature_string=response, rounding_val=utils.TC_GCODE_ROUNDING_PRECISION
261
+ )
262
+
263
+ async def set_ramp_rate(self, ramp_rate: float) -> None:
264
+ """Send a set ramp rate command"""
265
+ c = (
266
+ CommandBuilder(terminator=TC_COMMAND_TERMINATOR)
267
+ .add_gcode(gcode=GCODE.SET_RAMP_RATE)
268
+ .add_float(
269
+ prefix="S", value=ramp_rate, precision=utils.TC_GCODE_ROUNDING_PRECISION
270
+ )
271
+ )
272
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
273
+
274
+ async def deactivate_all(self) -> None:
275
+ """Send deactivate all command."""
276
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
277
+ gcode=GCODE.DEACTIVATE_ALL
278
+ )
279
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
280
+
281
+ async def deactivate_lid(self) -> None:
282
+ """Send deactivate lid command"""
283
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
284
+ gcode=GCODE.DEACTIVATE_LID
285
+ )
286
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
287
+
288
+ async def deactivate_block(self) -> None:
289
+ """Send deactivate block command"""
290
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
291
+ gcode=GCODE.DEACTIVATE_BLOCK
292
+ )
293
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
294
+
295
+ async def get_device_info(self) -> Dict[str, str]:
296
+ """Send get device info command"""
297
+ device_info = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
298
+ gcode=GCODE.DEVICE_INFO
299
+ )
300
+ response = await self._connection.send_command(
301
+ command=device_info, retries=DEFAULT_COMMAND_RETRIES
302
+ )
303
+
304
+ return utils.parse_device_information(device_info_string=response)
305
+
306
+ async def enter_programming_mode(self) -> None:
307
+ """Enter programming mode."""
308
+ trigger_connection = await AsyncSerial.create(
309
+ self._connection.port, TC_BOOTLOADER_BAUDRATE, timeout=1
310
+ )
311
+ await asyncio.sleep(0.05)
312
+ await trigger_connection.close()
313
+ await self._connection.close()
314
+
315
+ async def lift_plate(self) -> None:
316
+ """Send the Plate Lift command.
317
+
318
+ NOT SUPPORTED on TC Gen1."""
319
+ raise NotImplementedError(
320
+ "Gen1 Thermocyclers do not support the Plate Lift command."
321
+ )
322
+
323
+ async def jog_lid(self, angle: float) -> None:
324
+ """Send the Jog Lid command.
325
+
326
+ NOT SUPPORTED on TC Gen1."""
327
+ raise NotImplementedError(
328
+ "Gen1 Thermocyclers do not support the Jog Lid command."
329
+ )
330
+
331
+
332
+ class ThermocyclerDriverV2(ThermocyclerDriver):
333
+ """
334
+ This driver is for Thermocycler model Gen2.
335
+ """
336
+
337
+ def __init__(self, connection: AsyncResponseSerialConnection) -> None:
338
+ """
339
+ Constructor
340
+
341
+ Args:
342
+ connection: SerialConnection to the thermocycler
343
+ """
344
+ super().__init__(connection)
345
+
346
+ async def set_ramp_rate(self, ramp_rate: float) -> None:
347
+ """Send a set ramp rate command"""
348
+ # This command is fully unsupported on TC Gen2
349
+ return None
350
+
351
+ async def get_device_info(self) -> Dict[str, str]:
352
+ """Send get device info command"""
353
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
354
+ gcode=GCODE.DEVICE_INFO
355
+ )
356
+ response = await self._connection.send_command(
357
+ command=c, retries=DEFAULT_COMMAND_RETRIES
358
+ )
359
+
360
+ reset_reason = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
361
+ gcode=GCODE.GET_RESET_REASON
362
+ )
363
+ try:
364
+ await self._connection.send_command(
365
+ command=reset_reason, retries=DEFAULT_COMMAND_RETRIES
366
+ )
367
+ except UnhandledGcode:
368
+ pass
369
+
370
+ return utils.parse_hs_device_information(device_info_string=response)
371
+
372
+ async def enter_programming_mode(self) -> None:
373
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
374
+ gcode=GCODE.ENTER_PROGRAMMING
375
+ )
376
+ # No response expected, USB connection should terminate after this
377
+ await self._connection.send_dfu_command(command=c)
378
+ await self._connection.close()
379
+
380
+ async def lift_plate(self) -> None:
381
+ """Send the Plate Lift command."""
382
+ c = CommandBuilder(terminator=TC_COMMAND_TERMINATOR).add_gcode(
383
+ gcode=GCODE.PLATE_LIFT
384
+ )
385
+ await self._connection.send_command(command=c, retries=DEFAULT_COMMAND_RETRIES)
386
+
387
+ async def jog_lid(self, angle: float) -> None:
388
+ """Send the Jog Lid command."""
389
+ c = (
390
+ CommandBuilder(terminator=TC_COMMAND_TERMINATOR)
391
+ .add_gcode(gcode="M240.D")
392
+ .add_float(prefix="", value=angle, precision=2)
393
+ .add_element("O")
394
+ )
395
+ await self._connection.send_command(command=c, retries=1)
@@ -0,0 +1,126 @@
1
+ from typing import Optional, Dict
2
+
3
+ from opentrons.util.async_helpers import ensure_yield
4
+ from opentrons.drivers.thermocycler.abstract import AbstractThermocyclerDriver
5
+ from opentrons.drivers.types import Temperature, PlateTemperature, ThermocyclerLidStatus
6
+ from opentrons.hardware_control.modules.types import ThermocyclerModuleModel
7
+ from opentrons.drivers.asyncio.communication.errors import ErrorResponse
8
+
9
+
10
+ class SimulatingDriver(AbstractThermocyclerDriver):
11
+ DEFAULT_TEMP = 23
12
+
13
+ def __init__(
14
+ self, model: Optional[str] = None, serial_number: Optional[str] = None
15
+ ) -> None:
16
+ self._ramp_rate: Optional[float] = None
17
+ self._lid_status = ThermocyclerLidStatus.OPEN
18
+ self._lid_temperature = Temperature(current=self.DEFAULT_TEMP, target=None)
19
+ self._plate_temperature = PlateTemperature(
20
+ current=self.DEFAULT_TEMP, target=None, hold=None
21
+ )
22
+ self._model = model if model else "thermocyclerModuleV1"
23
+ self._serial_number = serial_number
24
+
25
+ def model(self) -> str:
26
+ return self._model
27
+
28
+ @ensure_yield
29
+ async def connect(self) -> None:
30
+ pass
31
+
32
+ @ensure_yield
33
+ async def disconnect(self) -> None:
34
+ pass
35
+
36
+ @ensure_yield
37
+ async def is_connected(self) -> bool:
38
+ return True
39
+
40
+ @ensure_yield
41
+ async def open_lid(self) -> None:
42
+ self._lid_status = ThermocyclerLidStatus.OPEN
43
+
44
+ @ensure_yield
45
+ async def close_lid(self) -> None:
46
+ self._lid_status = ThermocyclerLidStatus.CLOSED
47
+
48
+ @ensure_yield
49
+ async def lift_plate(self) -> None:
50
+ if self._model == ThermocyclerModuleModel.THERMOCYCLER_V1.value:
51
+ raise NotImplementedError()
52
+ if self._lid_status != ThermocyclerLidStatus.OPEN:
53
+ raise ErrorResponse(port="sim_port", response="Lid is not open")
54
+ self._lid_status = ThermocyclerLidStatus.OPEN
55
+
56
+ @ensure_yield
57
+ async def get_lid_status(self) -> ThermocyclerLidStatus:
58
+ return self._lid_status
59
+
60
+ @ensure_yield
61
+ async def get_lid_temperature(self) -> Temperature:
62
+ return self._lid_temperature
63
+
64
+ @ensure_yield
65
+ async def set_plate_temperature(
66
+ self,
67
+ temp: float,
68
+ hold_time: Optional[float] = None,
69
+ volume: Optional[float] = None,
70
+ ) -> None:
71
+ self._plate_temperature.target = temp
72
+ self._plate_temperature.current = temp
73
+ self._plate_temperature.hold = 0
74
+
75
+ @ensure_yield
76
+ async def get_plate_temperature(self) -> PlateTemperature:
77
+ return self._plate_temperature
78
+
79
+ @ensure_yield
80
+ async def set_ramp_rate(self, ramp_rate: float) -> None:
81
+ self._ramp_rate = ramp_rate
82
+
83
+ @ensure_yield
84
+ async def set_lid_temperature(self, temp: float) -> None:
85
+ """Set the lid temperature in deg Celsius"""
86
+ self._lid_temperature.target = temp
87
+ self._lid_temperature.current = temp
88
+
89
+ @ensure_yield
90
+ async def deactivate_lid(self) -> None:
91
+ self._lid_temperature.target = None
92
+ self._lid_temperature.current = self.DEFAULT_TEMP
93
+
94
+ @ensure_yield
95
+ async def deactivate_block(self) -> None:
96
+ self._plate_temperature.target = None
97
+ self._plate_temperature.current = self.DEFAULT_TEMP
98
+ self._plate_temperature.hold = None
99
+ self._ramp_rate = None
100
+
101
+ @ensure_yield
102
+ async def deactivate_all(self) -> None:
103
+ await self.deactivate_lid()
104
+ await self.deactivate_block()
105
+
106
+ @ensure_yield
107
+ async def get_device_info(self) -> Dict[str, str]:
108
+ return {
109
+ "serial": self._serial_number if self._serial_number else "dummySerialTC",
110
+ "model": "dummyModelTC",
111
+ "version": "dummyVersionTC",
112
+ }
113
+
114
+ @ensure_yield
115
+ async def enter_programming_mode(self) -> None:
116
+ pass
117
+
118
+ @ensure_yield
119
+ async def jog_lid(self, angle: float) -> None:
120
+ if self._model == ThermocyclerModuleModel.THERMOCYCLER_V1.value:
121
+ raise NotImplementedError()
122
+ self._lid_status = (
123
+ ThermocyclerLidStatus.IN_BETWEEN
124
+ if angle < 0
125
+ else ThermocyclerLidStatus.OPEN
126
+ )