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,49 @@
1
+ from typing import Optional
2
+
3
+
4
+ class SmoothieError(Exception):
5
+ def __init__(
6
+ self, ret_code: Optional[str] = None, command: Optional[str] = None
7
+ ) -> None:
8
+ self.ret_code = ret_code or ""
9
+ self.command = command
10
+ super().__init__()
11
+
12
+ def __repr__(self) -> str:
13
+ return f"<SmoothieError: {self.ret_code} from {self.command}>"
14
+
15
+ def __str__(self) -> str:
16
+ return f"SmoothieError: {self.command} returned {self.ret_code}"
17
+
18
+
19
+ class SmoothieAlarm(Exception):
20
+ def __init__(
21
+ self, ret_code: Optional[str] = None, command: Optional[str] = None
22
+ ) -> None:
23
+ self.ret_code = ret_code
24
+ self.command = command
25
+ super().__init__()
26
+
27
+ def __repr__(self) -> str:
28
+ return f"<SmoothieAlarm: {self.ret_code} from {self.command}>"
29
+
30
+ def __str__(self) -> str:
31
+ return f"SmoothieAlarm: {self.command} returned {self.ret_code}"
32
+
33
+
34
+ class TipProbeError(SmoothieAlarm):
35
+ def __init__(
36
+ self, ret_code: Optional[str] = None, command: Optional[str] = None
37
+ ) -> None:
38
+ self.ret_code = ret_code
39
+ self.command = command
40
+ super().__init__(ret_code, command)
41
+
42
+ def __repr__(self) -> str:
43
+ return f"<TipProbeError: {self.ret_code} from {self.command}"
44
+
45
+ def __str__(self) -> str:
46
+ return (
47
+ "Tip probe could not complete: the switch was never touched. "
48
+ "This may be because there is no tip on the pipette."
49
+ )
@@ -0,0 +1,143 @@
1
+ import logging
2
+ from typing import Dict
3
+
4
+ from opentrons.drivers.smoothie_drivers.constants import AXES, GCODE_ROUNDING_PRECISION
5
+ from opentrons.drivers.utils import (
6
+ parse_key_values,
7
+ parse_number,
8
+ parse_optional_number,
9
+ ParseError,
10
+ )
11
+
12
+
13
+ log = logging.getLogger(__name__)
14
+
15
+
16
+ def parse_position_response(raw_axis_values: str) -> Dict[str, float]:
17
+ """
18
+ Parse position response.
19
+
20
+ Args:
21
+ raw_axis_values: a string containing axis:value
22
+
23
+ Returns:
24
+ dictionary of axis to position.
25
+ """
26
+ parsed_values = parse_key_values(raw_axis_values)
27
+ if len(parsed_values) < 6:
28
+ raise ParseError(
29
+ error_message="Unexpected response in _parse_position_response",
30
+ parse_source=raw_axis_values,
31
+ )
32
+
33
+ data = {
34
+ k.title(): parse_number(v, GCODE_ROUNDING_PRECISION)
35
+ for k, v in parsed_values.items()
36
+ }
37
+ return data
38
+
39
+
40
+ def parse_instrument_data(smoothie_response: str) -> Dict[str, bytearray]:
41
+ """
42
+ Parse instrument data.
43
+
44
+ Args:
45
+ smoothie_response: A string containing a mount prefix (L or R) followed by :
46
+ and a hex string.
47
+
48
+ Returns:
49
+ mapping of the mount prefix to the hex string.
50
+ """
51
+ try:
52
+ items = smoothie_response.split("\n")[0].strip().split(":")
53
+ mount = items[0]
54
+ if mount not in {"L", "R"}:
55
+ raise ParseError(
56
+ error_message=f"Invalid mount '{mount}'", parse_source=smoothie_response
57
+ )
58
+ # data received from Smoothieware is stringified HEX values
59
+ # because of how Smoothieware handles GCODE messages
60
+ data = bytearray.fromhex(items[1])
61
+ except (ValueError, IndexError, TypeError, AttributeError):
62
+ raise ParseError(
63
+ error_message="Unexpected argument to parse_instrument_data",
64
+ parse_source=smoothie_response,
65
+ )
66
+ return {mount: data}
67
+
68
+
69
+ def byte_array_to_ascii_string(byte_array: bytearray) -> str:
70
+ """
71
+ Convert byte array to ascii string.
72
+
73
+ Args:
74
+ byte_array: a byte array
75
+
76
+ Returns:
77
+ String
78
+
79
+ """
80
+ # remove trailing null characters
81
+ try:
82
+ for c in [b"\x00", b"\xFF"]:
83
+ if c in byte_array:
84
+ byte_array = byte_array[: byte_array.index(c)]
85
+ res = byte_array.decode()
86
+ except (ValueError, TypeError, AttributeError):
87
+ log.exception("Unexpected argument to _byte_array_to_ascii_string:")
88
+ raise ParseError(
89
+ error_message="Unexpected argument to byte_array_to_ascii_string",
90
+ parse_source=byte_array.decode(),
91
+ )
92
+ return res
93
+
94
+
95
+ def parse_switch_values(raw_switch_values: str) -> Dict[str, bool]:
96
+ if not raw_switch_values or not isinstance(raw_switch_values, str):
97
+ raise ParseError(
98
+ error_message="Unexpected argument to parse_switch_values",
99
+ parse_source=raw_switch_values,
100
+ )
101
+
102
+ # probe has a space after it's ":" for some reason
103
+ if "Probe: " in raw_switch_values:
104
+ raw_switch_values = raw_switch_values.replace("Probe: ", "Probe:")
105
+
106
+ parsed_values = parse_key_values(raw_switch_values)
107
+ res = {
108
+ k.title(): bool(parse_optional_number(v, rounding_val=GCODE_ROUNDING_PRECISION))
109
+ for (k, v) in parsed_values.items()
110
+ if any(n in k for n in ["max", "Probe"])
111
+ }
112
+ # remove the extra "_max" character from each axis key in the dict
113
+ res = {key.split("_")[0]: val for key, val in res.items()}
114
+ if len((list(AXES) + ["Probe"]) & res.keys()) != 7:
115
+ raise ParseError(
116
+ error_message="Unexpected argument to parse_switch_values",
117
+ parse_source=raw_switch_values,
118
+ )
119
+ return res
120
+
121
+
122
+ def parse_homing_status_values(raw_homing_status_values: str) -> Dict[str, bool]:
123
+ """
124
+ Parse the Smoothieware response to a G28.6 command (homing-status)
125
+ A "1" means it has been homed, and "0" means it has not been homed
126
+
127
+ Example response after homing just X axis:
128
+ "X:1 Y:0 Z:0 A:0 B:0 C:0"
129
+
130
+ returns: dict
131
+ Key is axis, value is True if the axis needs to be homed
132
+ """
133
+ parsed_values = parse_key_values(raw_homing_status_values)
134
+ res = {
135
+ k.title(): bool(parse_number(v, GCODE_ROUNDING_PRECISION))
136
+ for k, v in parsed_values.items()
137
+ }
138
+ if len(list(AXES) & res.keys()) != 6:
139
+ raise ParseError(
140
+ error_message="Unexpected argument to parse_homing_status_values",
141
+ parse_source=raw_homing_status_values,
142
+ )
143
+ return res
@@ -0,0 +1,99 @@
1
+ from typing import Optional, Dict, Union
2
+
3
+ from opentrons.drivers.smoothie_drivers.constants import (
4
+ HOMED_POSITION,
5
+ Y_BOUND_OVERRIDE,
6
+ DISABLE_AXES,
7
+ AXES,
8
+ )
9
+ from opentrons.drivers.types import MoveSplits
10
+
11
+
12
+ class SimulatingDriver:
13
+ def __init__(self) -> None:
14
+ self._steps_per_mm: Dict[str, float] = {}
15
+ self._homed_flags: Dict[str, bool] = {}
16
+
17
+ @property
18
+ def homed_flags(self) -> Dict[str, bool]:
19
+ return self._homed_flags
20
+
21
+ async def home(self, axis: str = AXES, disabled: str = DISABLE_AXES) -> None:
22
+ for ax in axis:
23
+ self._homed_flags[ax] = True
24
+
25
+ async def _smoothie_reset(self) -> None:
26
+ self._homed_flags.clear()
27
+
28
+ async def read_pipette_id(self, mount: str) -> Optional[str]:
29
+ pass
30
+
31
+ async def read_pipette_model(self, mount: str) -> Optional[str]:
32
+ pass
33
+
34
+ async def write_pipette_id(self, mount: str, data_string: str) -> None:
35
+ pass
36
+
37
+ async def write_pipette_model(self, mount: str, data_string: str) -> None:
38
+ pass
39
+
40
+ # def _send_command(self, command, timeout=None):
41
+ # pass
42
+
43
+ def turn_on_blue_button_light(self) -> None:
44
+ pass
45
+
46
+ def turn_on_red_button_light(self) -> None:
47
+ pass
48
+
49
+ async def update_pipette_config(
50
+ self, axis: str, data: Dict[str, float]
51
+ ) -> Dict[str, Dict[str, float]]:
52
+ """
53
+ Updates the following configs for a given pipette mount based on
54
+ the detected pipette type:
55
+ - homing positions M365.0
56
+ - Max Travel M365.1
57
+ - endstop debounce M365.2 (NOT for zprobe debounce)
58
+ - retract from endstop distance M365.3
59
+ """
60
+ return {}
61
+
62
+ @property
63
+ def current(self) -> Dict[str, float]:
64
+ return {}
65
+
66
+ @property
67
+ def speed(self) -> None:
68
+ pass
69
+
70
+ @property
71
+ def steps_per_mm(self) -> Dict[str, float]:
72
+ return self._steps_per_mm
73
+
74
+ # @steps_per_mm.setter
75
+ # def steps_per_mm(self, axis, mm):
76
+ # # Keep track of any updates to the steps per mm per axis
77
+ # self._steps_per_mm[axis] = mm
78
+
79
+ async def update_steps_per_mm(self, data: Union[Dict[str, float], str]) -> None:
80
+ pass
81
+
82
+ def configure_splits_for(self, config: MoveSplits) -> None:
83
+ pass
84
+
85
+ def set_dwelling_current(self, settings: Dict[str, float]) -> None:
86
+ pass
87
+
88
+ def set_acceleration(self, settings: Dict[str, float]) -> None:
89
+ pass
90
+
91
+ @property
92
+ def homed_position(self) -> Dict[str, float]:
93
+ return HOMED_POSITION.copy()
94
+
95
+ @property
96
+ def axis_bounds(self) -> Dict[str, float]:
97
+ position = HOMED_POSITION.copy()
98
+ position["Y"] = Y_BOUND_OVERRIDE
99
+ return position
@@ -0,0 +1,16 @@
1
+ from dataclasses import dataclass
2
+ from typing import Dict, cast
3
+
4
+ from opentrons.config.types import AxisDict
5
+
6
+ AxisSettingType = Dict[str, float]
7
+
8
+
9
+ @dataclass
10
+ class AxisCurrentSettings:
11
+ now: AxisSettingType
12
+ saved: AxisSettingType
13
+
14
+ def __init__(self, val: AxisDict) -> None:
15
+ self.now = cast(AxisSettingType, val.copy())
16
+ self.saved = cast(AxisSettingType, val.copy())
@@ -0,0 +1,10 @@
1
+ from .driver import TempDeckDriver
2
+ from .abstract import AbstractTempDeckDriver
3
+ from .simulator import SimulatingDriver
4
+
5
+
6
+ __all__ = [
7
+ "TempDeckDriver",
8
+ "AbstractTempDeckDriver",
9
+ "SimulatingDriver",
10
+ ]
@@ -0,0 +1,54 @@
1
+ from abc import ABC, abstractmethod
2
+ from typing import Dict
3
+
4
+ from opentrons.drivers.types import Temperature
5
+
6
+
7
+ class AbstractTempDeckDriver(ABC):
8
+ @abstractmethod
9
+ async def connect(self) -> None:
10
+ ...
11
+
12
+ @abstractmethod
13
+ async def disconnect(self) -> None:
14
+ ...
15
+
16
+ @abstractmethod
17
+ async def is_connected(self) -> bool:
18
+ ...
19
+
20
+ @abstractmethod
21
+ async def deactivate(self) -> None:
22
+ ...
23
+
24
+ @abstractmethod
25
+ async def set_temperature(self, celsius: float) -> None:
26
+ ...
27
+
28
+ @abstractmethod
29
+ async def get_temperature(self) -> Temperature:
30
+ ...
31
+
32
+ @abstractmethod
33
+ async def get_device_info(self) -> Dict[str, str]:
34
+ """
35
+ Queries Temp-Deck for its build version, model, and serial number
36
+
37
+ returns: dict
38
+ Where keys are the strings 'version', 'model', and 'serial',
39
+ and each value is a string identifier
40
+
41
+ {
42
+ 'serial': '1aa11bb22',
43
+ 'model': '1aa11bb22',
44
+ 'version': '1aa11bb22'
45
+ }
46
+
47
+ Example input from Temp-Deck's serial response:
48
+ "serial:aa11bb22 model:aa11bb22 version:aa11bb22"
49
+ """
50
+ ...
51
+
52
+ @abstractmethod
53
+ async def enter_programming_mode(self) -> None:
54
+ ...
@@ -0,0 +1,197 @@
1
+ """
2
+ - Driver is responsible for providing an interface for the temp-deck
3
+ - Driver is the only system component that knows about the temp-deck's GCODES
4
+ or how the temp-deck communications
5
+
6
+ - Driver is NOT responsible interpreting the temperatures or states in any way
7
+ or knowing anything about what the device is being used for
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import asyncio
13
+ import logging
14
+ from typing import Dict, Optional
15
+ from enum import Enum
16
+
17
+ from opentrons.drivers import utils
18
+ from opentrons.drivers.types import Temperature
19
+ from opentrons.drivers.command_builder import CommandBuilder
20
+ from opentrons.drivers.asyncio.communication import SerialConnection, UnhandledGcode
21
+ from opentrons.drivers.temp_deck.abstract import AbstractTempDeckDriver
22
+
23
+ log = logging.getLogger(__name__)
24
+
25
+ DEFAULT_TEMP_DECK_TIMEOUT = 1
26
+
27
+ DEFAULT_COMMAND_RETRIES = 3
28
+
29
+
30
+ class GCODE(str, Enum):
31
+ GET_TEMP = "M105"
32
+ SET_TEMP = "M104"
33
+ DEVICE_INFO = "M115"
34
+ GET_RESET_REASON = "M114"
35
+ DISENGAGE = "M18"
36
+ PROGRAMMING_MODE = "dfu"
37
+
38
+
39
+ TEMP_DECK_BAUDRATE = 115200
40
+
41
+ TEMP_DECK_COMMAND_TERMINATOR = "\r\n\r\n"
42
+ TEMP_DECK_ACK = "ok\r\nok\r\n"
43
+
44
+
45
+ class TempDeckError(Exception):
46
+ pass
47
+
48
+
49
+ class TempDeckDriver(AbstractTempDeckDriver):
50
+ @classmethod
51
+ async def create(
52
+ cls, port: str, loop: Optional[asyncio.AbstractEventLoop] = None
53
+ ) -> TempDeckDriver:
54
+ """
55
+ Create a temp deck driver.
56
+
57
+ Args:
58
+ port: port or url of temp deck
59
+ loop: optional event loop
60
+
61
+ Returns: driver
62
+ """
63
+ connection = await SerialConnection.create(
64
+ port=port,
65
+ baud_rate=TEMP_DECK_BAUDRATE,
66
+ timeout=DEFAULT_TEMP_DECK_TIMEOUT,
67
+ ack=TEMP_DECK_ACK,
68
+ loop=loop,
69
+ reset_buffer_before_write=False,
70
+ )
71
+ return cls(connection=connection)
72
+
73
+ def __init__(self, connection: SerialConnection) -> None:
74
+ """
75
+ Construct a temp deck driver
76
+
77
+ Args:
78
+ connection: Connection to the temp deck
79
+ """
80
+ self._connection = connection
81
+
82
+ async def connect(self) -> None:
83
+ """Connect to the temp deck."""
84
+ await self._connection.open()
85
+
86
+ async def disconnect(self) -> None:
87
+ """Disconnect from temp deck"""
88
+ await self._connection.close()
89
+
90
+ async def is_connected(self) -> bool:
91
+ """Check connected state"""
92
+ return await self._connection.is_open()
93
+
94
+ async def deactivate(self) -> None:
95
+ """
96
+ Send disengage command to temp deck
97
+
98
+ Returns: None
99
+ """
100
+ c = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
101
+ gcode=GCODE.DISENGAGE
102
+ )
103
+ await self._send_command(command=c)
104
+
105
+ async def set_temperature(self, celsius: float) -> None:
106
+ """
107
+ Send a set temperate command to temp deck
108
+
109
+ Args:
110
+ celsius: the target temperature
111
+
112
+ Returns: None
113
+ """
114
+ c = (
115
+ CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR)
116
+ .add_gcode(gcode=GCODE.SET_TEMP)
117
+ .add_float(
118
+ prefix="S",
119
+ value=celsius,
120
+ precision=utils.TEMPDECK_GCODE_ROUNDING_PRECISION,
121
+ )
122
+ )
123
+ await self._send_command(command=c)
124
+
125
+ async def get_temperature(self) -> Temperature:
126
+ """
127
+ Send a get temperature command to the temp deck.
128
+
129
+ Returns: Temperature object
130
+
131
+ """
132
+ c = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
133
+ gcode=GCODE.GET_TEMP
134
+ )
135
+ response = await self._send_command(command=c)
136
+ return utils.parse_temperature_response(
137
+ temperature_string=response,
138
+ rounding_val=utils.TEMPDECK_GCODE_ROUNDING_PRECISION,
139
+ )
140
+
141
+ async def get_device_info(self) -> Dict[str, str]:
142
+ """
143
+ Queries Temp-Deck for its build version, model, and serial number
144
+
145
+ returns: dict
146
+ Where keys are the strings 'version', 'model', and 'serial',
147
+ and each value is a string identifier
148
+
149
+ {
150
+ 'serial': '1aa11bb22',
151
+ 'model': '1aa11bb22',
152
+ 'version': '1aa11bb22'
153
+ }
154
+
155
+ Example input from Temp-Deck's serial response:
156
+ "serial:aa11bb22 model:aa11bb22 version:aa11bb22"
157
+ """
158
+ device_info = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
159
+ gcode=GCODE.DEVICE_INFO
160
+ )
161
+ response = await self._send_command(command=device_info)
162
+
163
+ reset_reason = CommandBuilder(
164
+ terminator=TEMP_DECK_COMMAND_TERMINATOR
165
+ ).add_gcode(gcode=GCODE.GET_RESET_REASON)
166
+ try:
167
+ await self._send_command(command=reset_reason)
168
+ except UnhandledGcode:
169
+ pass
170
+
171
+ return utils.parse_device_information(device_info_string=response)
172
+
173
+ async def enter_programming_mode(self) -> None:
174
+ """
175
+ Send command to enter programming mode.
176
+
177
+ Returns: None
178
+ """
179
+ c = CommandBuilder(terminator=TEMP_DECK_COMMAND_TERMINATOR).add_gcode(
180
+ gcode=GCODE.PROGRAMMING_MODE
181
+ )
182
+ await self._send_command(command=c)
183
+
184
+ async def _send_command(self, command: CommandBuilder) -> str:
185
+ """
186
+ Send the command
187
+
188
+ Args:
189
+ command: command to send
190
+
191
+ Returns:
192
+ command response
193
+ """
194
+ response = await self._connection.send_command(
195
+ command=command, retries=DEFAULT_COMMAND_RETRIES
196
+ )
197
+ return response
@@ -0,0 +1,57 @@
1
+ from typing import Optional, Dict
2
+
3
+ from opentrons.util.async_helpers import ensure_yield
4
+ from opentrons.drivers.types import Temperature
5
+ from opentrons.drivers.temp_deck.abstract import AbstractTempDeckDriver
6
+
7
+ TEMP_DECK_MODELS = {
8
+ "temperatureModuleV1": "temp_deck_v1.1",
9
+ "temperatureModuleV2": "temp_deck_v20",
10
+ }
11
+
12
+
13
+ class SimulatingDriver(AbstractTempDeckDriver):
14
+ def __init__(
15
+ self, sim_model: Optional[str] = None, serial_number: Optional[str] = None
16
+ ):
17
+ self._temp = Temperature(target=None, current=0)
18
+ self._port: Optional[str] = None
19
+ self._model = TEMP_DECK_MODELS[sim_model] if sim_model else "temp_deck_v1.1"
20
+ self._serial_number = serial_number
21
+
22
+ @ensure_yield
23
+ async def set_temperature(self, celsius: float) -> None:
24
+ self._temp.target = celsius
25
+ self._temp.current = self._temp.target
26
+
27
+ @ensure_yield
28
+ async def get_temperature(self) -> Temperature:
29
+ return self._temp
30
+
31
+ @ensure_yield
32
+ async def deactivate(self) -> None:
33
+ self._temp = Temperature(target=None, current=23)
34
+
35
+ @ensure_yield
36
+ async def connect(self) -> None:
37
+ pass
38
+
39
+ @ensure_yield
40
+ async def is_connected(self) -> bool:
41
+ return True
42
+
43
+ @ensure_yield
44
+ async def disconnect(self) -> None:
45
+ pass
46
+
47
+ @ensure_yield
48
+ async def enter_programming_mode(self) -> None:
49
+ pass
50
+
51
+ @ensure_yield
52
+ async def get_device_info(self) -> Dict[str, str]:
53
+ return {
54
+ "serial": self._serial_number if self._serial_number else "dummySerialTD",
55
+ "model": self._model,
56
+ "version": "dummyVersionTD",
57
+ }
@@ -0,0 +1,12 @@
1
+ from .driver import ThermocyclerDriver, ThermocyclerDriverV2, ThermocyclerDriverFactory
2
+ from .simulator import SimulatingDriver
3
+ from .abstract import AbstractThermocyclerDriver
4
+
5
+
6
+ __all__ = [
7
+ "ThermocyclerDriver",
8
+ "ThermocyclerDriverV2",
9
+ "ThermocyclerDriverFactory",
10
+ "SimulatingDriver",
11
+ "AbstractThermocyclerDriver",
12
+ ]