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,156 @@
1
+ import json
2
+ from pydantic import ValidationError
3
+ from typing import Optional, Union
4
+
5
+ from opentrons import config, types
6
+ from dataclasses import asdict
7
+ from opentrons.util.helpers import utc_now
8
+
9
+
10
+ from .. import file_operators as io, types as local_types
11
+
12
+ from .models import v1
13
+
14
+
15
+ # Delete Gripper Offset Calibrations
16
+
17
+
18
+ def delete_gripper_calibration_file(gripper: str) -> None:
19
+ """
20
+ Delete gripper calibration offset file based on gripper serial number
21
+
22
+ :param gripper: gripper serial number
23
+ """
24
+ offset_path = (
25
+ config.get_opentrons_path("gripper_calibration_dir") / f"{gripper}.json"
26
+ )
27
+
28
+ io.delete_file(offset_path)
29
+
30
+
31
+ def clear_gripper_calibration_offsets() -> None:
32
+ """
33
+ Delete all gripper calibration data files.
34
+ """
35
+
36
+ offset_dir = config.get_opentrons_path("gripper_calibration_dir")
37
+ io._remove_json_files_in_directories(offset_dir)
38
+
39
+
40
+ # Delete Gripper Jaw Width Calibration
41
+
42
+
43
+ def delete_gripper_jaw_width_data_file(gripper: str) -> None:
44
+ """
45
+ Delete gripper jaw width data file based on gripper serial number
46
+
47
+ :param gripper: gripper serial number
48
+ """
49
+ offset_path = config.get_opentrons_path("gripper_jaw_width_dir") / f"{gripper}.json"
50
+ io.delete_file(offset_path)
51
+
52
+
53
+ def clear_gripper_jaw_width_data() -> None:
54
+ """
55
+ Delete all gripper jaw width data files.
56
+ """
57
+ offset_dir = config.get_opentrons_path("gripper_jaw_width_dir")
58
+ io._remove_json_files_in_directories(offset_dir)
59
+
60
+
61
+ # Save Gripper Offset Calibrations
62
+
63
+
64
+ def save_gripper_calibration(
65
+ offset: types.Point,
66
+ gripper_id: str,
67
+ cal_status: Optional[
68
+ Union[local_types.CalibrationStatus, v1.CalibrationStatus]
69
+ ] = None,
70
+ ) -> None:
71
+ gripper_dir = config.get_opentrons_path("gripper_calibration_dir")
72
+
73
+ if isinstance(cal_status, local_types.CalibrationStatus):
74
+ cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
75
+ elif isinstance(cal_status, v1.CalibrationStatus):
76
+ cal_status_model = cal_status
77
+ else:
78
+ cal_status_model = v1.CalibrationStatus()
79
+
80
+ gripper_calibration = v1.InstrumentOffsetModel(
81
+ offset=offset,
82
+ lastModified=utc_now(),
83
+ source=local_types.SourceType.user,
84
+ status=cal_status_model,
85
+ )
86
+ io.save_to_file(gripper_dir, gripper_id, gripper_calibration)
87
+
88
+
89
+ # Save Gripper Jaw Width Data
90
+
91
+
92
+ def save_gripper_jaw_width_data(
93
+ encoder_position_at_jaw_closed: float,
94
+ gripper_id: str,
95
+ cal_status: Optional[
96
+ Union[local_types.CalibrationStatus, v1.CalibrationStatus]
97
+ ] = None,
98
+ ) -> None:
99
+ gripper_jaw_width_dir = config.get_opentrons_path("gripper_jaw_width_dir")
100
+
101
+ if isinstance(cal_status, local_types.CalibrationStatus):
102
+ cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
103
+ elif isinstance(cal_status, v1.CalibrationStatus):
104
+ cal_status_model = cal_status
105
+ else:
106
+ cal_status_model = v1.CalibrationStatus()
107
+
108
+ gripper_jaw_width = v1.GripperJawWidthModel(
109
+ encoderPositionAtJawClosed=encoder_position_at_jaw_closed,
110
+ lastModified=utc_now(),
111
+ source=local_types.SourceType.user,
112
+ status=cal_status_model,
113
+ )
114
+ io.save_to_file(gripper_jaw_width_dir, gripper_id, gripper_jaw_width)
115
+
116
+
117
+ # Get Gripper Offset Calibrations
118
+
119
+
120
+ def get_gripper_calibration_offset(
121
+ gripper_id: str,
122
+ ) -> Optional[v1.InstrumentOffsetModel]:
123
+ """
124
+ Return the requested gripper offset data.
125
+ """
126
+ if not config.feature_flags.enable_ot3_hardware_controller():
127
+ raise NotImplementedError("Gripper calibrations are only valid on the OT-3")
128
+ try:
129
+ gripper_calibration_filepath = (
130
+ config.get_opentrons_path("gripper_calibration_dir") / f"{gripper_id}.json"
131
+ )
132
+ return v1.InstrumentOffsetModel(
133
+ **io.read_cal_file(gripper_calibration_filepath)
134
+ )
135
+ except FileNotFoundError:
136
+ return None
137
+ except (json.JSONDecodeError, ValidationError):
138
+ return None
139
+
140
+
141
+ # Get Gripper Jaw Width
142
+
143
+
144
+ def get_gripper_jaw_width_data(gripper_id: str) -> Optional[v1.GripperJawWidthModel]:
145
+ """Return the requested gripper jaw width data."""
146
+ if not config.feature_flags.enable_ot3_hardware_controller():
147
+ raise NotImplementedError("Gripper jaw width data only available on the OT-3.")
148
+ try:
149
+ gripper_jaw_width_filepath = (
150
+ config.get_opentrons_path("gripper_jaw_width_dir") / f"{gripper_id}.json"
151
+ )
152
+ return v1.GripperJawWidthModel(**io.read_cal_file(gripper_jaw_width_filepath))
153
+ except FileNotFoundError:
154
+ return None
155
+ except (json.JSONDecodeError, ValidationError):
156
+ return None
File without changes
@@ -0,0 +1,122 @@
1
+ import typing
2
+
3
+ from typing_extensions import Literal
4
+ from opentrons.hardware_control.modules.types import ModuleType
5
+ from opentrons.hardware_control.types import OT3Mount
6
+ from pydantic import field_validator, BaseModel, Field, PlainSerializer
7
+ from datetime import datetime
8
+
9
+ from opentrons_shared_data.pipette.types import LabwareUri
10
+
11
+ from opentrons.types import Point
12
+ from opentrons.calibration_storage import types
13
+
14
+
15
+ DatetimeType = typing.Annotated[
16
+ datetime,
17
+ PlainSerializer(lambda x: x.isoformat(), when_used="json"),
18
+ ]
19
+
20
+
21
+ class CalibrationStatus(BaseModel):
22
+ markedBad: bool = False
23
+ source: typing.Optional[types.SourceType] = None
24
+ markedAt: typing.Optional[DatetimeType] = None
25
+
26
+
27
+ class TipLengthModel(BaseModel):
28
+ tipLength: float = Field(..., description="Tip length data found from calibration.")
29
+ lastModified: DatetimeType = Field(
30
+ ..., description="The last time this tip length was calibrated."
31
+ )
32
+ uri: typing.Union[LabwareUri, Literal[""]] = Field(
33
+ ..., description="The tiprack URI associated with the tip length data."
34
+ )
35
+ source: types.SourceType = Field(
36
+ default=types.SourceType.factory, description="The source of calibration."
37
+ )
38
+ status: CalibrationStatus = Field(
39
+ default_factory=CalibrationStatus,
40
+ description="The status of the calibration data.",
41
+ )
42
+
43
+ @field_validator("tipLength")
44
+ @classmethod
45
+ def ensure_tip_length_positive(cls, tipLength: float) -> float:
46
+ if tipLength < 0.0:
47
+ raise ValueError("Tip Length must be a positive number")
48
+ return tipLength
49
+
50
+
51
+ class BeltCalibrationModel(BaseModel):
52
+ attitude: types.AttitudeMatrix = Field(
53
+ ..., description="Attitude matrix for belts found from calibration."
54
+ )
55
+ lastModified: DatetimeType = Field(
56
+ ..., description="The last time this deck was calibrated."
57
+ )
58
+ source: types.SourceType = Field(
59
+ default=types.SourceType.factory, description="The source of calibration."
60
+ )
61
+ pipetteCalibratedWith: typing.Optional[str] = Field(
62
+ default=None, description="The pipette id used to calibrate the deck."
63
+ )
64
+ status: CalibrationStatus = Field(
65
+ default_factory=CalibrationStatus,
66
+ description="The status of the calibration data.",
67
+ )
68
+
69
+
70
+ class InstrumentOffsetModel(BaseModel):
71
+ offset: Point = Field(..., description="Instrument offset found from calibration.")
72
+ lastModified: DatetimeType = Field(
73
+ ..., description="The last time this instrument was calibrated."
74
+ )
75
+ source: types.SourceType = Field(
76
+ default=types.SourceType.factory, description="The source of calibration."
77
+ )
78
+ status: CalibrationStatus = Field(
79
+ default_factory=CalibrationStatus,
80
+ description="The status of the calibration data.",
81
+ )
82
+
83
+
84
+ class GripperJawWidthModel(BaseModel):
85
+ encoderPositionAtJawClosed: float = Field(
86
+ ..., description="The encoder position when the gripper jaw is closed."
87
+ )
88
+ lastModified: DatetimeType = Field(
89
+ ..., description="The last time this instrument was calibrated."
90
+ )
91
+ source: types.SourceType = Field(
92
+ default=types.SourceType.factory, description="The source of calibration."
93
+ )
94
+ status: CalibrationStatus = Field(
95
+ default_factory=CalibrationStatus,
96
+ description="The status of the calibration data.",
97
+ )
98
+
99
+
100
+ class ModuleOffsetModel(BaseModel):
101
+ offset: Point = Field(..., description="Module offset found from calibration.")
102
+ mount: OT3Mount = Field(..., description="The mount used to calibrate this module.")
103
+ slot: str = Field(
104
+ ...,
105
+ description=("The slot this module was calibrated in."),
106
+ )
107
+ module: ModuleType = Field(..., description="The module type of this module.")
108
+ module_id: str = Field(..., description="The unique id of this module.")
109
+ instrument_id: str = Field(
110
+ ...,
111
+ description="The unique id of the instrument used to calibrate this module.",
112
+ )
113
+ lastModified: DatetimeType = Field(
114
+ ..., description="The last time this module was calibrated."
115
+ )
116
+ source: types.SourceType = Field(
117
+ default=types.SourceType.factory, description="The source of calibration."
118
+ )
119
+ status: CalibrationStatus = Field(
120
+ default_factory=CalibrationStatus,
121
+ description="The status of the calibration data.",
122
+ )
@@ -0,0 +1,138 @@
1
+ import json
2
+ import logging
3
+ import os
4
+ from functools import lru_cache
5
+ from pathlib import Path
6
+ from opentrons.hardware_control.modules.types import ModuleType
7
+ from opentrons.hardware_control.types import OT3Mount
8
+ from pydantic import ValidationError
9
+ from typing import List, Optional, Union, no_type_check
10
+ from dataclasses import asdict
11
+
12
+ from opentrons import config, types
13
+
14
+
15
+ from .. import file_operators as io, types as local_types
16
+ from opentrons.util.helpers import utc_now
17
+
18
+ from .models import v1
19
+
20
+ log = logging.getLogger(__name__)
21
+ # Delete Module Offset Calibrations
22
+
23
+
24
+ @no_type_check
25
+ def delete_module_offset_file(module_id: str) -> None:
26
+ """
27
+ Delete module offset file for the given module id.
28
+
29
+ :param module: module id serial number
30
+ """
31
+ offset_dir = config.get_opentrons_path("module_calibration_dir")
32
+ offset_path = offset_dir / f"{module_id}.json"
33
+ io.delete_file(offset_path)
34
+ # something changed, clear lru cache
35
+ get_module_offset.cache_clear()
36
+ load_all_module_offsets.cache_clear()
37
+
38
+
39
+ def clear_module_offset_calibrations() -> None:
40
+ """
41
+ Delete all module offset calibration files.
42
+ """
43
+
44
+ offset_dir = config.get_opentrons_path("module_calibration_dir")
45
+ io._remove_json_files_in_directories(offset_dir)
46
+ # something changed, clear lru cache
47
+ get_module_offset.cache_clear()
48
+ load_all_module_offsets.cache_clear()
49
+
50
+
51
+ # Save Module Offset Calibrations
52
+
53
+
54
+ @no_type_check
55
+ def save_module_calibration(
56
+ offset: types.Point,
57
+ mount: OT3Mount,
58
+ slot: str,
59
+ module: ModuleType,
60
+ module_id: str,
61
+ instrument_id: Optional[str] = None,
62
+ cal_status: Optional[
63
+ Union[local_types.CalibrationStatus, v1.CalibrationStatus]
64
+ ] = None,
65
+ ) -> None:
66
+ module_dir = config.get_opentrons_path("module_calibration_dir")
67
+ if isinstance(cal_status, local_types.CalibrationStatus):
68
+ cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
69
+ elif isinstance(cal_status, v1.CalibrationStatus):
70
+ cal_status_model = cal_status
71
+ else:
72
+ cal_status_model = v1.CalibrationStatus()
73
+
74
+ module_calibration = v1.ModuleOffsetModel(
75
+ offset=offset,
76
+ mount=mount,
77
+ slot=slot,
78
+ module=module,
79
+ module_id=module_id,
80
+ instrument_id=instrument_id,
81
+ lastModified=utc_now(),
82
+ source=local_types.SourceType.user,
83
+ status=cal_status_model,
84
+ )
85
+ io.save_to_file(module_dir, module_id, module_calibration)
86
+ # something changed, clear lru cache
87
+ get_module_offset.cache_clear()
88
+ load_all_module_offsets.cache_clear()
89
+
90
+
91
+ # Get Module Offset Calibrations
92
+
93
+
94
+ @no_type_check
95
+ @lru_cache(maxsize=10)
96
+ def get_module_offset(
97
+ module: ModuleType, module_id: str, slot: Optional[str] = None
98
+ ) -> Optional[v1.ModuleOffsetModel]:
99
+ try:
100
+ module_calibration_filepath = (
101
+ config.get_opentrons_path("module_calibration_dir") / f"{module_id}.json"
102
+ )
103
+ return v1.ModuleOffsetModel(**io.read_cal_file(module_calibration_filepath))
104
+ except FileNotFoundError:
105
+ log.warning(
106
+ f"Calibrations for {module} {module_id} on slot {slot} does not exist."
107
+ )
108
+ return None
109
+ except (json.JSONDecodeError, ValidationError):
110
+ log.warning(
111
+ f"Malformed calibrations for {module_id} on slot {slot}. Please factory reset your calibrations.",
112
+ exc_info=True,
113
+ )
114
+ return None
115
+
116
+
117
+ @lru_cache(maxsize=10)
118
+ def load_all_module_offsets() -> List[v1.ModuleOffsetModel]:
119
+ """Load all module offsets from the disk."""
120
+
121
+ calibrations: List[v1.ModuleOffsetModel] = []
122
+ files = os.listdir(config.get_opentrons_path("module_calibration_dir"))
123
+ for file in files:
124
+ try:
125
+ calibrations.append(
126
+ v1.ModuleOffsetModel(
127
+ **io.read_cal_file(
128
+ Path(config.get_opentrons_path("module_calibration_dir") / file)
129
+ )
130
+ )
131
+ )
132
+ except (json.JSONDecodeError, ValidationError):
133
+ log.warning(
134
+ f"Malformed module calibrations for {file}. Please factory reset your calibrations.",
135
+ exc_info=True,
136
+ )
137
+ continue
138
+ return calibrations
@@ -0,0 +1,95 @@
1
+ import json
2
+ import logging
3
+ from pydantic import ValidationError
4
+ from typing import Optional, Union, no_type_check
5
+ from dataclasses import asdict
6
+
7
+ from opentrons import config, types
8
+
9
+
10
+ from .. import file_operators as io, types as local_types
11
+ from opentrons.util.helpers import utc_now
12
+
13
+ from .models import v1
14
+
15
+ log = logging.getLogger(__name__)
16
+ # Delete Pipette Offset Calibrations
17
+
18
+
19
+ @no_type_check
20
+ def delete_pipette_offset_file(pipette: str, mount: types.Mount) -> None:
21
+ """
22
+ Delete pipette offset file based on mount and pipette serial number
23
+
24
+ :param pipette: pipette serial number
25
+ :param mount: pipette mount
26
+ """
27
+ offset_dir = config.get_opentrons_path("pipette_calibration_dir")
28
+ offset_path = offset_dir / mount.name.lower() / f"{pipette}.json"
29
+ io.delete_file(offset_path)
30
+
31
+
32
+ def clear_pipette_offset_calibrations() -> None:
33
+ """
34
+ Delete all pipette offset calibration files.
35
+ """
36
+
37
+ offset_dir = config.get_opentrons_path("pipette_calibration_dir")
38
+ io._remove_json_files_in_directories(offset_dir)
39
+
40
+
41
+ # Save Pipette Offset Calibrations
42
+
43
+
44
+ @no_type_check
45
+ def save_pipette_calibration(
46
+ offset: types.Point,
47
+ pip_id: str,
48
+ mount: types.Mount,
49
+ cal_status: Optional[
50
+ Union[local_types.CalibrationStatus, v1.CalibrationStatus]
51
+ ] = None,
52
+ ) -> None:
53
+ pip_dir = config.get_opentrons_path("pipette_calibration_dir") / mount.name.lower()
54
+
55
+ if isinstance(cal_status, local_types.CalibrationStatus):
56
+ cal_status_model = v1.CalibrationStatus(**asdict(cal_status))
57
+ elif isinstance(cal_status, v1.CalibrationStatus):
58
+ cal_status_model = cal_status
59
+ else:
60
+ cal_status_model = v1.CalibrationStatus()
61
+
62
+ pipette_calibration = v1.InstrumentOffsetModel(
63
+ offset=offset,
64
+ lastModified=utc_now(),
65
+ source=local_types.SourceType.user,
66
+ status=cal_status_model,
67
+ )
68
+ io.save_to_file(pip_dir, pip_id, pipette_calibration)
69
+
70
+
71
+ # Get Pipette Offset Calibrations
72
+
73
+
74
+ @no_type_check
75
+ def get_pipette_offset(
76
+ pipette_id: str, mount: types.Mount
77
+ ) -> Optional[v1.InstrumentOffsetModel]:
78
+ try:
79
+ pipette_calibration_filepath = (
80
+ config.get_opentrons_path("pipette_calibration_dir")
81
+ / mount.name.lower()
82
+ / f"{pipette_id}.json"
83
+ )
84
+ return v1.InstrumentOffsetModel(
85
+ **io.read_cal_file(pipette_calibration_filepath)
86
+ )
87
+ except FileNotFoundError:
88
+ log.debug(f"Calibrations for {pipette_id} on {mount} does not exist.")
89
+ return None
90
+ except (json.JSONDecodeError, ValidationError):
91
+ log.warning(
92
+ f"Malformed calibrations for {pipette_id} on {mount}. Please factory reset your calibrations.",
93
+ exc_info=True,
94
+ )
95
+ return None
@@ -0,0 +1,45 @@
1
+ import typing
2
+
3
+ from dataclasses import dataclass
4
+ from datetime import datetime
5
+ from enum import Enum
6
+
7
+ AttitudeMatrix = typing.List[typing.List[float]]
8
+
9
+
10
+ class SourceType(str, Enum):
11
+ """Calibration source type"""
12
+
13
+ default = "default"
14
+ factory = "factory"
15
+ user = "user"
16
+ calibration_check = "calibration_check"
17
+ legacy = "legacy"
18
+ unknown = "unknown"
19
+
20
+
21
+ class TipLengthCalNotFound(Exception):
22
+ pass
23
+
24
+
25
+ @dataclass
26
+ class CalibrationStatus:
27
+ markedBad: bool = False
28
+ source: typing.Optional[SourceType] = None
29
+ markedAt: typing.Optional[datetime] = None
30
+
31
+
32
+ @dataclass
33
+ class UriDetails:
34
+ namespace: str
35
+ load_name: str
36
+ version: int
37
+
38
+
39
+ # TODO(mm, 2023-11-20): Deduplicate this with similar types in robot_server
40
+ # and opentrons.protocol_engine.
41
+ @dataclass
42
+ class CutoutFixturePlacement:
43
+ cutout_fixture_id: str
44
+ cutout_id: str
45
+ opentrons_module_serial_number: typing.Optional[str]
@@ -0,0 +1,21 @@
1
+ """Opentrons command-line interface.
2
+
3
+ This CLI application is not yet public-facing.
4
+ It is currently used by the Opentrons App to analyze protocols.
5
+ """
6
+
7
+ import click
8
+
9
+ from .analyze import analyze
10
+
11
+
12
+ @click.group()
13
+ def main() -> None:
14
+ """Welcome to the `opentrons` command-line application.
15
+
16
+ This application is not yet public facing.
17
+ Please check back in a future software version.
18
+ """
19
+
20
+
21
+ main.add_command(analyze)
@@ -0,0 +1,5 @@
1
+ """Opentrons CLI application entry point."""
2
+
3
+ from . import main
4
+
5
+ main()