pyobs-core 2.0.0.dev3__tar.gz → 2.0.0.dev5__tar.gz
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.
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/PKG-INFO +1 -1
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/comm.py +14 -18
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/local/localcomm.py +1 -1
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/proxy.py +14 -2
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xmppcomm.py +5 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IBinning.py +15 -10
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IConfig.py +7 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ICooling.py +10 -7
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IExposure.py +10 -7
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IExposureTime.py +8 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFilters.py +14 -9
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFocuser.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IGain.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IImageFormat.py +14 -9
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IImageType.py +8 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IMode.py +14 -9
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IModule.py +8 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IMotion.py +15 -11
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IMultiFiber.py +17 -13
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IOffsetsAltAz.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IOffsetsRaDec.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingAltAz.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingHGS.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingHelioprojective.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingRaDec.py +9 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IReady.py +8 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRotation.py +8 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRunning.py +8 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ITemperatures.py +13 -11
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IVideo.py +7 -4
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IWindow.py +20 -12
- pyobs_core-2.0.0.dev5/pyobs/interfaces/__init__.py +151 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/interface.py +3 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/motionstatus.py +3 -3
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/basecamera.py +19 -9
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/basevideo.py +2 -2
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/dummycamera.py +52 -20
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/dummyvideo.py +3 -3
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/flatfield.py +16 -6
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/module.py +6 -8
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/autoguiding.py +2 -2
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/baseroof.py +2 -2
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/telescope/dummytelescope.py +27 -16
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/dummymode.py +5 -5
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyproject.toml +1 -1
- pyobs_core-2.0.0.dev3/pyobs/interfaces/__init__.py +0 -115
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/.gitignore +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/LICENSE +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/application.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/background_task.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/_cli.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/pyobs.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/pyobsd.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/cli/pyobsw.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/commlogging.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/dummy/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/dummy/dummycomm.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/local/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/local/localnetwork.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/rpc.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/serializer.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/comm/xmpp/xmppclient.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/badweather.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/event.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/exposurestatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/filterchanged.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/focusfound.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/goodweather.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/log.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/modechanged.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/moduleclosed.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/moduleopened.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/motionstatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/move.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/newimage.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/newspectrum.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/offsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/roofclosing.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/roofopened.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/taskfailed.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/taskfinished.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/taskstarted.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/events/testevent.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/image.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/altazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/exptime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/genericoffset.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/onskydistance.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/radecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/meta/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processor.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/_daobackgroundremover.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/_pillow.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/circle.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/crosshair.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/annotation/text.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/astrometry/dotnet.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/calibration/calibration.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/_source_catalog.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/daophot.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/pysep.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/simpledisk.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/detection/sourcedetection.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/exptime/star.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/addfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/download.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/flip.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/grayscale.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/httpserver.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/normalize.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/save.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/saveimage.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/smooth.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/image/softbin.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/addmask.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/circularmask.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/createfilename.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/misc/removebackground.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/brighteststar.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/offsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/projected.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/offsets/spilled_light.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/photometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/photutil.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/photometry/pysep.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/wcs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAbortable.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAcquisition.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAutoFocus.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAutoGuiding.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IAutonomous.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ICalibrate.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ICamera.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IData.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IDome.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFlatField.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IFocusModel.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IPointingSeries.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRoof.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IRunnable.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IScriptRunner.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ISpectrograph.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IStartStop.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ISyncTarget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/ITelescope.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/interfaces/IWeather.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/camerasettings.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/fitsnamespace.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/follow.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/waitformotion.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/mixins/weatheraware.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/adaptive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/basespectrograph.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/dummyspectrograph.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/camera/pipelinecamera.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/pointing.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/flatfield/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/focus/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/focus/focusmodel.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/focus/focusseries.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/imagewatcher.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/imagewriter.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/image/seeing.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/_base.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/_baseguiding.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/acquisition.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/dummyacquisition.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/dummyguiding.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/mastermind.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/pointing.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/robotic/scriptrunner.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/basedome.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/roof/dummyroof.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/telescope/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/telescope/basetelescope.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/test/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/test/standalone.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/autonomouswarning.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/fluentlogger.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/httpfilecache.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/kiosk.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/matrix.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/stellarium.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/telegram.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/utils/trigger.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/weather.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/weather_api.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/modules/weather/weather_state.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/object.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/py.typed +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/observation.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/dataprovider.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/constant.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/follow.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/interval.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/merit.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/random.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/merits/transit.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/helioprojectiveradialarget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/targets/target.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/cases.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/conditional.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/parallel.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/selector.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/control/sequential.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/scripts/utils/log.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/backend/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/_portal.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/configdb.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/task.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/memory/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/storage/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/task.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/archive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/local_archive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/average.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/cache.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/config.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/coordinates.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/curvefit.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/enums.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/fits.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/base.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/photometry.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/focusseries/projection.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/filters.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/grid.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/gridnode.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/grids/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/binningwidget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/exposewidget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/http.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/influxdb.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logger.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logging/context.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/logging/resolvableerror.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/modulegui.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/applyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/parallel.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/pipeline/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/pipeline/night.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/pipeline/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/csv.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/http.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/log.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/multi.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/publisher/publisher.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/serialization.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/shellcommand.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/threads/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/threads/lockwithabort.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/time.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/utils/types.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/version.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/archivefile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/bufferedfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/file.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/filelists/__init__.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/filelists/filelist.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/filelists/testing.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/httpfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/localfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/memfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/sftpfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/smbfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/sshfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/tempfile.py +0 -0
- {pyobs_core-2.0.0.dev3 → pyobs_core-2.0.0.dev5}/pyobs/vfs/vfs.py +0 -0
|
@@ -4,7 +4,6 @@ import asyncio
|
|
|
4
4
|
import functools
|
|
5
5
|
import inspect
|
|
6
6
|
import logging
|
|
7
|
-
import sys
|
|
8
7
|
from collections.abc import Callable, Coroutine
|
|
9
8
|
from typing import TYPE_CHECKING, Any, overload
|
|
10
9
|
|
|
@@ -132,12 +131,20 @@ class Comm:
|
|
|
132
131
|
except IndexError:
|
|
133
132
|
return None
|
|
134
133
|
|
|
134
|
+
# collect capabilities (fixed at proxy construction time)
|
|
135
|
+
capabilities: dict[type[Interface], Any] = {}
|
|
136
|
+
for interface in interfaces:
|
|
137
|
+
if interface.capabilities is not None:
|
|
138
|
+
cap = await self._get_capabilities(client, interface)
|
|
139
|
+
if cap is not None:
|
|
140
|
+
capabilities[interface] = cap
|
|
141
|
+
|
|
135
142
|
# create new proxy
|
|
136
|
-
proxy = Proxy(self, client, interfaces)
|
|
143
|
+
proxy = Proxy(self, client, interfaces, capabilities)
|
|
137
144
|
|
|
138
145
|
# subscribe to state
|
|
139
146
|
for interface in interfaces:
|
|
140
|
-
if
|
|
147
|
+
if interface.state is not None:
|
|
141
148
|
await self.subscribe_state(client, interface, functools.partial(proxy.update_state, interface))
|
|
142
149
|
|
|
143
150
|
self._proxies[client] = proxy
|
|
@@ -438,40 +445,29 @@ class Comm:
|
|
|
438
445
|
) -> None:
|
|
439
446
|
pass
|
|
440
447
|
|
|
441
|
-
|
|
442
|
-
def _interface_from_state(state_cls: type) -> type:
|
|
443
|
-
outer_name = state_cls.__qualname__.rsplit(".", 1)[0]
|
|
444
|
-
return getattr(sys.modules[state_cls.__module__], outer_name)
|
|
445
|
-
|
|
446
|
-
async def set_state(self, state: Any) -> None:
|
|
448
|
+
async def set_state(self, interface: type[Interface], state: Any) -> None:
|
|
447
449
|
"""Publish state for this module.
|
|
448
450
|
|
|
449
451
|
Args:
|
|
450
452
|
interface: Interface type for the state.
|
|
451
453
|
state: State object to publish.
|
|
452
454
|
"""
|
|
453
|
-
interface = Comm._interface_from_state(type(state))
|
|
454
455
|
await self._set_state(interface, state)
|
|
455
456
|
|
|
456
457
|
async def _set_state(self, interface: type[Interface], state: Any) -> None:
|
|
457
458
|
pass
|
|
458
459
|
|
|
459
|
-
|
|
460
|
-
def _interface_from_capabilities(caps_cls: type) -> type:
|
|
461
|
-
outer_name = caps_cls.__qualname__.rsplit(".", 1)[0]
|
|
462
|
-
return getattr(sys.modules[caps_cls.__module__], outer_name)
|
|
463
|
-
|
|
464
|
-
async def set_capabilities(self, capabilities: Any) -> None:
|
|
460
|
+
async def set_capabilities(self, interface: type[Interface], capabilities: Any) -> None:
|
|
465
461
|
"""Publish capabilities for this module.
|
|
466
462
|
|
|
467
|
-
Called by Module.open() for each interface that defines a
|
|
463
|
+
Called by Module.open() for each interface that defines a capabilities
|
|
468
464
|
dataclass. Not intended to be called directly by module authors after
|
|
469
465
|
that point — capabilities are fixed for the module lifetime.
|
|
470
466
|
|
|
471
467
|
Args:
|
|
468
|
+
interface: Interface type the capabilities belong to.
|
|
472
469
|
capabilities: Capabilities dataclass instance.
|
|
473
470
|
"""
|
|
474
|
-
interface = Comm._interface_from_capabilities(type(capabilities))
|
|
475
471
|
await self._set_capabilities(interface, capabilities)
|
|
476
472
|
|
|
477
473
|
async def _set_capabilities(self, interface: type[Interface], capabilities: Any) -> None:
|
|
@@ -120,7 +120,7 @@ class LocalComm(Comm):
|
|
|
120
120
|
|
|
121
121
|
async def _get_capabilities(self, module: str, interface: type[Interface]) -> Any | None:
|
|
122
122
|
"""Fetch capabilities from a remote module."""
|
|
123
|
-
if
|
|
123
|
+
if interface.capabilities is None:
|
|
124
124
|
return None
|
|
125
125
|
try:
|
|
126
126
|
remote = self._network.get_client(module)
|
|
@@ -21,13 +21,20 @@ class Proxy:
|
|
|
21
21
|
|
|
22
22
|
__module__ = "pyobs.comm"
|
|
23
23
|
|
|
24
|
-
def __init__(
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
comm: Comm,
|
|
27
|
+
client: str,
|
|
28
|
+
interfaces: list[type[Interface]],
|
|
29
|
+
capabilities: dict[type[Interface], Any] | None = None,
|
|
30
|
+
):
|
|
25
31
|
"""Creates a new proxy.
|
|
26
32
|
|
|
27
33
|
Args:
|
|
28
34
|
comm: Comm object to use for connection.
|
|
29
35
|
client: Name of client to connect to.
|
|
30
36
|
interfaces: List of interfaces supported by client.
|
|
37
|
+
capabilities: Pre-populated capabilities dict, keyed by interface type.
|
|
31
38
|
"""
|
|
32
39
|
|
|
33
40
|
# set client and interfaces
|
|
@@ -53,8 +60,9 @@ class Proxy:
|
|
|
53
60
|
# create methods
|
|
54
61
|
self._methods = self._create_methods()
|
|
55
62
|
|
|
56
|
-
# store state
|
|
63
|
+
# store state and capabilities
|
|
57
64
|
self._state: dict[type[Interface], Any] = {}
|
|
65
|
+
self._capabilities: dict[type[Interface], Any] = capabilities if capabilities is not None else {}
|
|
58
66
|
|
|
59
67
|
@property
|
|
60
68
|
def name(self) -> str:
|
|
@@ -170,6 +178,10 @@ class Proxy:
|
|
|
170
178
|
"""Latest known state for the given interface, or None if nothing has arrived yet."""
|
|
171
179
|
return self._state.get(interface)
|
|
172
180
|
|
|
181
|
+
def capabilities(self, interface: type[Interface]) -> Any | None:
|
|
182
|
+
"""Capabilities for the given interface, populated once at Proxy construction."""
|
|
183
|
+
return self._capabilities.get(interface)
|
|
184
|
+
|
|
173
185
|
async def wait_for_state(
|
|
174
186
|
self,
|
|
175
187
|
interface: type[Interface],
|
|
@@ -658,7 +658,7 @@ class XmppComm(Comm):
|
|
|
658
658
|
item_xml = items_xml.find(f"{{{pubsub_ns}}}item")
|
|
659
659
|
payload = list(item_xml)[0] if item_xml is not None and len(item_xml) > 0 else None
|
|
660
660
|
if payload is not None:
|
|
661
|
-
state_obj = _xml_to_dataclass(payload, interface.
|
|
661
|
+
state_obj = _xml_to_dataclass(payload, interface.state)
|
|
662
662
|
for callback in callbacks:
|
|
663
663
|
callback(state_obj)
|
|
664
664
|
else:
|
|
@@ -786,7 +786,7 @@ class XmppComm(Comm):
|
|
|
786
786
|
item_xml = items_xml.find(f"{{{pubsub_ns}}}item") if items_xml is not None else None
|
|
787
787
|
payload = list(item_xml)[0] if item_xml is not None and len(item_xml) > 0 else None
|
|
788
788
|
if payload is not None:
|
|
789
|
-
callback(_xml_to_dataclass(payload, interface.
|
|
789
|
+
callback(_xml_to_dataclass(payload, interface.state))
|
|
790
790
|
except (slixmpp.exceptions.IqError, slixmpp.exceptions.IqTimeout):
|
|
791
791
|
pass
|
|
792
792
|
|
|
@@ -828,7 +828,7 @@ class XmppComm(Comm):
|
|
|
828
828
|
|
|
829
829
|
async def _get_capabilities(self, module: str, interface: type[Interface]) -> Any | None:
|
|
830
830
|
"""Fetch and deserialize capabilities for a remote module's interface."""
|
|
831
|
-
if
|
|
831
|
+
if interface.capabilities is None:
|
|
832
832
|
return None
|
|
833
833
|
# Use full JID (with resource) if we know it — bare JID may not route correctly
|
|
834
834
|
full_jid = next(
|
|
@@ -848,7 +848,7 @@ class XmppComm(Comm):
|
|
|
848
848
|
for elem in child:
|
|
849
849
|
tag = elem.tag.split("}")[-1]
|
|
850
850
|
if tag == "capabilities" and f"{{{ns}}}" in elem.tag:
|
|
851
|
-
return _xml_to_dataclass(elem, interface.
|
|
851
|
+
return _xml_to_dataclass(elem, interface.capabilities)
|
|
852
852
|
return None
|
|
853
853
|
|
|
854
854
|
async def _set_presence(self, state: ModuleState, error_string: str = "") -> None:
|
|
@@ -902,7 +902,7 @@ class XmppComm(Comm):
|
|
|
902
902
|
payload = list(item_xml)[0] if item_xml is not None and len(item_xml) > 0 else None
|
|
903
903
|
if payload is not None and node in self._state_node_handlers:
|
|
904
904
|
_, callbacks = self._state_node_handlers[node]
|
|
905
|
-
state_obj = _xml_to_dataclass(payload, interface.
|
|
905
|
+
state_obj = _xml_to_dataclass(payload, interface.state)
|
|
906
906
|
for cb in callbacks:
|
|
907
907
|
cb(state_obj)
|
|
908
908
|
except (slixmpp.exceptions.IqError, slixmpp.exceptions.IqTimeout):
|
|
@@ -8,20 +8,25 @@ from ..utils.time import Time
|
|
|
8
8
|
from .interface import Interface
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
@dataclass
|
|
12
|
+
class BinningState:
|
|
13
|
+
x: int
|
|
14
|
+
y: int
|
|
15
|
+
time: Time = field(default_factory=Time.now)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class BinningCapabilities:
|
|
20
|
+
binnings: list[BinningState] = field(default_factory=list)
|
|
21
|
+
|
|
22
|
+
|
|
11
23
|
class IBinning(Interface, metaclass=ABCMeta):
|
|
12
24
|
"""The camera supports binning, to be used together with :class:`~pyobs.interfaces.ICamera`."""
|
|
13
25
|
|
|
14
26
|
__module__ = "pyobs.interfaces"
|
|
15
27
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
x: int
|
|
19
|
-
y: int
|
|
20
|
-
time: Time = field(default_factory=Time.now)
|
|
21
|
-
|
|
22
|
-
@dataclass
|
|
23
|
-
class Capabilities:
|
|
24
|
-
binnings: list[IBinning.State] = field(default_factory=list)
|
|
28
|
+
state = BinningState
|
|
29
|
+
capabilities = BinningCapabilities
|
|
25
30
|
|
|
26
31
|
@abstractmethod
|
|
27
32
|
async def set_binning(self, x: int, y: int, **kwargs: Any) -> None:
|
|
@@ -37,4 +42,4 @@ class IBinning(Interface, metaclass=ABCMeta):
|
|
|
37
42
|
...
|
|
38
43
|
|
|
39
44
|
|
|
40
|
-
__all__ = ["IBinning"]
|
|
45
|
+
__all__ = ["IBinning", "BinningState", "BinningCapabilities"]
|
|
@@ -7,16 +7,17 @@ from typing import Any
|
|
|
7
7
|
from .interface import Interface
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
@dataclass
|
|
11
|
+
class ConfigCapabilities:
|
|
12
|
+
caps: dict[str, tuple[bool, bool, bool]] = field(default_factory=dict)
|
|
13
|
+
|
|
14
|
+
|
|
10
15
|
class IConfig(Interface, metaclass=ABCMeta):
|
|
11
16
|
"""The module allows access to some of its configuration options."""
|
|
12
17
|
|
|
13
18
|
__module__ = "pyobs.interfaces"
|
|
14
19
|
|
|
15
|
-
|
|
16
|
-
class Capabilities:
|
|
17
|
-
readable: list[str] = field(default_factory=list)
|
|
18
|
-
writable: list[str] = field(default_factory=list)
|
|
19
|
-
options: dict[str, list[str]] = field(default_factory=dict)
|
|
20
|
+
capabilities = ConfigCapabilities
|
|
20
21
|
|
|
21
22
|
@abstractmethod
|
|
22
23
|
async def get_config_value(self, name: str, **kwargs: Any) -> Any:
|
|
@@ -47,4 +48,4 @@ class IConfig(Interface, metaclass=ABCMeta):
|
|
|
47
48
|
...
|
|
48
49
|
|
|
49
50
|
|
|
50
|
-
__all__ = ["IConfig"]
|
|
51
|
+
__all__ = ["IConfig", "ConfigCapabilities"]
|
|
@@ -9,17 +9,20 @@ from ..utils.time import Time
|
|
|
9
9
|
from .ITemperatures import ITemperatures
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
@dataclass
|
|
13
|
+
class CoolingState:
|
|
14
|
+
setpoint: Annotated[float, Unit.CELSIUS] | None
|
|
15
|
+
power: Annotated[int, Unit.PERCENT] | None
|
|
16
|
+
enabled: bool
|
|
17
|
+
time: Time = field(default_factory=Time.now)
|
|
18
|
+
|
|
19
|
+
|
|
12
20
|
class ICooling(ITemperatures, metaclass=ABCMeta):
|
|
13
21
|
"""The module can control the cooling of a device."""
|
|
14
22
|
|
|
15
23
|
__module__ = "pyobs.interfaces"
|
|
16
24
|
|
|
17
|
-
|
|
18
|
-
class State:
|
|
19
|
-
setpoint: Annotated[float, Unit.CELSIUS] | None
|
|
20
|
-
power: Annotated[int, Unit.PERCENT] | None
|
|
21
|
-
enabled: bool
|
|
22
|
-
time: Time = field(default_factory=Time.now)
|
|
25
|
+
state = CoolingState
|
|
23
26
|
|
|
24
27
|
@abstractmethod
|
|
25
28
|
async def set_cooling(self, enabled: bool, setpoint: Annotated[float, Unit.CELSIUS], **kwargs: Any) -> None:
|
|
@@ -35,4 +38,4 @@ class ICooling(ITemperatures, metaclass=ABCMeta):
|
|
|
35
38
|
...
|
|
36
39
|
|
|
37
40
|
|
|
38
|
-
__all__ = ["ICooling"]
|
|
41
|
+
__all__ = ["ICooling", "CoolingState"]
|
|
@@ -10,17 +10,20 @@ from ..utils.time import Time
|
|
|
10
10
|
from .interface import Interface
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
@dataclass
|
|
14
|
+
class ExposureState:
|
|
15
|
+
status: ExposureStatus
|
|
16
|
+
progress: Annotated[float, Unit.PERCENT]
|
|
17
|
+
exposure_time_left: Annotated[float, Unit.SECONDS] = 0.0
|
|
18
|
+
time: Time = field(default_factory=Time.now)
|
|
19
|
+
|
|
20
|
+
|
|
13
21
|
class IExposure(Interface, metaclass=ABCMeta):
|
|
14
22
|
"""The module controls a camera."""
|
|
15
23
|
|
|
16
24
|
__module__ = "pyobs.interfaces"
|
|
17
25
|
|
|
18
|
-
|
|
19
|
-
class State:
|
|
20
|
-
status: ExposureStatus
|
|
21
|
-
progress: Annotated[float, Unit.PERCENT]
|
|
22
|
-
exposure_time_left: Annotated[float, Unit.SECONDS] = 0.0
|
|
23
|
-
time: Time = field(default_factory=Time.now)
|
|
26
|
+
state = ExposureState
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
__all__ = ["IExposure"]
|
|
29
|
+
__all__ = ["IExposure", "ExposureState"]
|
|
@@ -9,15 +9,18 @@ from ..utils.time import Time
|
|
|
9
9
|
from .interface import Interface
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
@dataclass
|
|
13
|
+
class ExposureTimeState:
|
|
14
|
+
exposure_time: Annotated[float, Unit.SECONDS]
|
|
15
|
+
time: Time = field(default_factory=Time.now)
|
|
16
|
+
|
|
17
|
+
|
|
12
18
|
class IExposureTime(Interface, metaclass=ABCMeta):
|
|
13
19
|
"""The camera supports exposure times, to be used together with :class:`~pyobs.interfaces.ICamera`."""
|
|
14
20
|
|
|
15
21
|
__module__ = "pyobs.interfaces"
|
|
16
22
|
|
|
17
|
-
|
|
18
|
-
class State:
|
|
19
|
-
exposure_time: Annotated[float, Unit.SECONDS]
|
|
20
|
-
time: Time = field(default_factory=Time.now)
|
|
23
|
+
state = ExposureTimeState
|
|
21
24
|
|
|
22
25
|
@abstractmethod
|
|
23
26
|
async def set_exposure_time(self, exposure_time: Annotated[float, Unit.SECONDS], **kwargs: Any) -> None:
|
|
@@ -32,4 +35,4 @@ class IExposureTime(Interface, metaclass=ABCMeta):
|
|
|
32
35
|
...
|
|
33
36
|
|
|
34
37
|
|
|
35
|
-
__all__ = ["IExposureTime"]
|
|
38
|
+
__all__ = ["IExposureTime", "ExposureTimeState"]
|
|
@@ -8,19 +8,24 @@ from ..utils.time import Time
|
|
|
8
8
|
from .IMotion import IMotion
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
@dataclass
|
|
12
|
+
class FilterState:
|
|
13
|
+
filter: str
|
|
14
|
+
time: Time = field(default_factory=Time.now)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class FiltersCapabilities:
|
|
19
|
+
filters: list[str] = field(default_factory=list)
|
|
20
|
+
|
|
21
|
+
|
|
11
22
|
class IFilters(IMotion, metaclass=ABCMeta):
|
|
12
23
|
"""The module can change filters in a device."""
|
|
13
24
|
|
|
14
25
|
__module__ = "pyobs.interfaces"
|
|
15
26
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
filter: str
|
|
19
|
-
time: Time = field(default_factory=Time.now)
|
|
20
|
-
|
|
21
|
-
@dataclass
|
|
22
|
-
class Capabilities:
|
|
23
|
-
filters: list[str] = field(default_factory=list)
|
|
27
|
+
state = FilterState
|
|
28
|
+
capabilities = FiltersCapabilities
|
|
24
29
|
|
|
25
30
|
@abstractmethod
|
|
26
31
|
async def set_filter(self, filter_name: str, **kwargs: Any) -> None:
|
|
@@ -36,4 +41,4 @@ class IFilters(IMotion, metaclass=ABCMeta):
|
|
|
36
41
|
...
|
|
37
42
|
|
|
38
43
|
|
|
39
|
-
__all__ = ["IFilters"]
|
|
44
|
+
__all__ = ["IFilters", "FilterState", "FiltersCapabilities"]
|
|
@@ -8,16 +8,19 @@ from ..utils.time import Time
|
|
|
8
8
|
from .IMotion import IMotion
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
@dataclass
|
|
12
|
+
class FocuserState:
|
|
13
|
+
focus: float
|
|
14
|
+
focus_offset: float
|
|
15
|
+
time: Time = field(default_factory=Time.now)
|
|
16
|
+
|
|
17
|
+
|
|
11
18
|
class IFocuser(IMotion, metaclass=ABCMeta):
|
|
12
19
|
"""The module is a focusing device."""
|
|
13
20
|
|
|
14
21
|
__module__ = "pyobs.interfaces"
|
|
15
22
|
|
|
16
|
-
|
|
17
|
-
class State:
|
|
18
|
-
focus: float
|
|
19
|
-
focus_offset: float
|
|
20
|
-
time: Time = field(default_factory=Time.now)
|
|
23
|
+
state = FocuserState
|
|
21
24
|
|
|
22
25
|
@abstractmethod
|
|
23
26
|
async def set_focus(self, focus: float, **kwargs: Any) -> None:
|
|
@@ -46,4 +49,4 @@ class IFocuser(IMotion, metaclass=ABCMeta):
|
|
|
46
49
|
...
|
|
47
50
|
|
|
48
51
|
|
|
49
|
-
__all__ = ["IFocuser"]
|
|
52
|
+
__all__ = ["IFocuser", "FocuserState"]
|
|
@@ -8,16 +8,19 @@ from ..utils.time import Time
|
|
|
8
8
|
from .interface import Interface
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
@dataclass
|
|
12
|
+
class GainState:
|
|
13
|
+
gain: float
|
|
14
|
+
offset: float
|
|
15
|
+
time: Time = field(default_factory=Time.now)
|
|
16
|
+
|
|
17
|
+
|
|
11
18
|
class IGain(Interface, metaclass=ABCMeta):
|
|
12
19
|
"""The camera supports setting of gain, to be used together with :class:`~pyobs.interfaces.ICamera`."""
|
|
13
20
|
|
|
14
21
|
__module__ = "pyobs.interfaces"
|
|
15
22
|
|
|
16
|
-
|
|
17
|
-
class State:
|
|
18
|
-
gain: float
|
|
19
|
-
offset: float
|
|
20
|
-
time: Time = field(default_factory=Time.now)
|
|
23
|
+
state = GainState
|
|
21
24
|
|
|
22
25
|
@abstractmethod
|
|
23
26
|
async def set_gain(self, gain: float, **kwargs: Any) -> None:
|
|
@@ -44,4 +47,4 @@ class IGain(Interface, metaclass=ABCMeta):
|
|
|
44
47
|
...
|
|
45
48
|
|
|
46
49
|
|
|
47
|
-
__all__ = ["IGain"]
|
|
50
|
+
__all__ = ["IGain", "GainState"]
|
|
@@ -10,19 +10,24 @@ from ..utils.time import Time
|
|
|
10
10
|
from .interface import Interface
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
@dataclass
|
|
14
|
+
class ImageFormatState:
|
|
15
|
+
image_format: ImageFormat
|
|
16
|
+
time: Time = field(default_factory=Time.now)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class ImageFormatCapabilities:
|
|
21
|
+
image_formats: list[str] = field(default_factory=list)
|
|
22
|
+
|
|
23
|
+
|
|
13
24
|
class IImageFormat(Interface, metaclass=ABCMeta):
|
|
14
25
|
"""The module supports different image formats (e.g. INT16, FLOAT32), mainly used by cameras."""
|
|
15
26
|
|
|
16
27
|
__module__ = "pyobs.interfaces"
|
|
17
28
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
image_format: ImageFormat
|
|
21
|
-
time: Time = field(default_factory=Time.now)
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class Capabilities:
|
|
25
|
-
image_formats: list[str] = field(default_factory=list)
|
|
29
|
+
state = ImageFormatState
|
|
30
|
+
capabilities = ImageFormatCapabilities
|
|
26
31
|
|
|
27
32
|
@abstractmethod
|
|
28
33
|
async def set_image_format(self, fmt: ImageFormat, **kwargs: Any) -> None:
|
|
@@ -37,4 +42,4 @@ class IImageFormat(Interface, metaclass=ABCMeta):
|
|
|
37
42
|
...
|
|
38
43
|
|
|
39
44
|
|
|
40
|
-
__all__ = ["IImageFormat"]
|
|
45
|
+
__all__ = ["IImageFormat", "ImageFormatState", "ImageFormatCapabilities"]
|
|
@@ -10,15 +10,18 @@ from ..utils.time import Time
|
|
|
10
10
|
from .interface import Interface
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
@dataclass
|
|
14
|
+
class ImageTypeState:
|
|
15
|
+
image_type: ImageType
|
|
16
|
+
time: Time = field(default_factory=Time.now)
|
|
17
|
+
|
|
18
|
+
|
|
13
19
|
class IImageType(Interface, metaclass=ABCMeta):
|
|
14
20
|
"""The module supports different image types (e.g. object, bias, dark, etc), mainly used by cameras."""
|
|
15
21
|
|
|
16
22
|
__module__ = "pyobs.interfaces"
|
|
17
23
|
|
|
18
|
-
|
|
19
|
-
class State:
|
|
20
|
-
image_type: ImageType
|
|
21
|
-
time: Time = field(default_factory=Time.now)
|
|
24
|
+
state = ImageTypeState
|
|
22
25
|
|
|
23
26
|
@abstractmethod
|
|
24
27
|
async def set_image_type(self, image_type: ImageType, **kwargs: Any) -> None:
|
|
@@ -30,4 +33,4 @@ class IImageType(Interface, metaclass=ABCMeta):
|
|
|
30
33
|
...
|
|
31
34
|
|
|
32
35
|
|
|
33
|
-
__all__ = ["IImageType"]
|
|
36
|
+
__all__ = ["IImageType", "ImageTypeState"]
|
|
@@ -8,19 +8,24 @@ from ..utils.time import Time
|
|
|
8
8
|
from .interface import Interface
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
@dataclass
|
|
12
|
+
class ModeState:
|
|
13
|
+
modes: dict[str, str] = field(default_factory=dict) # group -> current mode
|
|
14
|
+
time: Time = field(default_factory=Time.now)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class ModeCapabilities:
|
|
19
|
+
modes: dict[str, list[str]] = field(default_factory=dict) # group -> list of modes
|
|
20
|
+
|
|
21
|
+
|
|
11
22
|
class IMode(Interface, metaclass=ABCMeta):
|
|
12
23
|
"""The module can change modes in a device."""
|
|
13
24
|
|
|
14
25
|
__module__ = "pyobs.interfaces"
|
|
15
26
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
modes: dict[str, list[str]] = field(default_factory=dict) # group -> list of modes
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class State:
|
|
22
|
-
modes: dict[str, str] = field(default_factory=dict) # group -> current mode
|
|
23
|
-
time: Time = field(default_factory=Time.now)
|
|
27
|
+
state = ModeState
|
|
28
|
+
capabilities = ModeCapabilities
|
|
24
29
|
|
|
25
30
|
@abstractmethod
|
|
26
31
|
async def set_mode(self, mode: str, group: int = 0, **kwargs: Any) -> None:
|
|
@@ -37,4 +42,4 @@ class IMode(Interface, metaclass=ABCMeta):
|
|
|
37
42
|
...
|
|
38
43
|
|
|
39
44
|
|
|
40
|
-
__all__ = ["IMode"]
|
|
45
|
+
__all__ = ["IMode", "ModeState", "ModeCapabilities"]
|
|
@@ -7,15 +7,18 @@ from typing import Any
|
|
|
7
7
|
from .interface import Interface
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
@dataclass
|
|
11
|
+
class ModuleCapabilities:
|
|
12
|
+
label: str = ""
|
|
13
|
+
version: str = ""
|
|
14
|
+
|
|
15
|
+
|
|
10
16
|
class IModule(Interface, metaclass=ABCMeta):
|
|
11
17
|
"""The module is actually a module. Implemented by all modules."""
|
|
12
18
|
|
|
13
19
|
__module__ = "pyobs.interfaces"
|
|
14
20
|
|
|
15
|
-
|
|
16
|
-
class Capabilities:
|
|
17
|
-
version: str = ""
|
|
18
|
-
label: str = ""
|
|
21
|
+
capabilities = ModuleCapabilities
|
|
19
22
|
|
|
20
23
|
@abstractmethod
|
|
21
24
|
async def reset_error(self, **kwargs: Any) -> bool:
|
|
@@ -23,4 +26,4 @@ class IModule(Interface, metaclass=ABCMeta):
|
|
|
23
26
|
...
|
|
24
27
|
|
|
25
28
|
|
|
26
|
-
__all__ = ["IModule"]
|
|
29
|
+
__all__ = ["IModule", "ModuleCapabilities"]
|
|
@@ -10,21 +10,25 @@ from ..utils.time import Time
|
|
|
10
10
|
from .IReady import IReady
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
@dataclass
|
|
14
|
+
class DeviceMotionStatus:
|
|
15
|
+
name: str
|
|
16
|
+
status: MotionStatus
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class MotionState:
|
|
21
|
+
status: MotionStatus
|
|
22
|
+
devices: list[DeviceMotionStatus] = field(default_factory=list)
|
|
23
|
+
time: Time = field(default_factory=Time.now)
|
|
24
|
+
|
|
25
|
+
|
|
13
26
|
class IMotion(IReady, metaclass=ABCMeta):
|
|
14
27
|
"""The module controls a device that can move."""
|
|
15
28
|
|
|
16
29
|
__module__ = "pyobs.interfaces"
|
|
17
30
|
|
|
18
|
-
|
|
19
|
-
class DeviceMotionStatus:
|
|
20
|
-
name: str
|
|
21
|
-
status: MotionStatus
|
|
22
|
-
|
|
23
|
-
@dataclass
|
|
24
|
-
class State:
|
|
25
|
-
status: MotionStatus
|
|
26
|
-
devices: list[IMotion.DeviceMotionStatus] = field(default_factory=list)
|
|
27
|
-
time: Time = field(default_factory=Time.now)
|
|
31
|
+
state = MotionState
|
|
28
32
|
|
|
29
33
|
@abstractmethod
|
|
30
34
|
async def init(self, **kwargs: Any) -> None:
|
|
@@ -54,4 +58,4 @@ class IMotion(IReady, metaclass=ABCMeta):
|
|
|
54
58
|
...
|
|
55
59
|
|
|
56
60
|
|
|
57
|
-
__all__ = ["IMotion"]
|
|
61
|
+
__all__ = ["IMotion", "DeviceMotionStatus", "MotionState"]
|
|
@@ -8,24 +8,28 @@ from ..utils.time import Time
|
|
|
8
8
|
from .interface import Interface
|
|
9
9
|
|
|
10
10
|
|
|
11
|
+
@dataclass
|
|
12
|
+
class MultiFiberState:
|
|
13
|
+
fiber: str = ""
|
|
14
|
+
pixel_x: float = 0.0
|
|
15
|
+
pixel_y: float = 0.0
|
|
16
|
+
radius: float = 0.0
|
|
17
|
+
time: Time = field(default_factory=Time.now)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@dataclass
|
|
21
|
+
class MultiFiberCapabilities:
|
|
22
|
+
fiber_count: int = 0
|
|
23
|
+
|
|
24
|
+
|
|
11
25
|
class IMultiFiber(Interface, metaclass=ABCMeta):
|
|
12
26
|
"""An interface for multi-fiber setups that helps to set/get a fiber and retrieve position and size of the
|
|
13
27
|
current fiber on the acquisition/guiding image."""
|
|
14
28
|
|
|
15
29
|
__module__ = "pyobs.interfaces"
|
|
16
30
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
fiber_count: int = 0
|
|
20
|
-
fiber_names: list[str] = field(default_factory=list)
|
|
21
|
-
|
|
22
|
-
@dataclass
|
|
23
|
-
class State:
|
|
24
|
-
fiber: str = ""
|
|
25
|
-
pixel_x: float = 0.0
|
|
26
|
-
pixel_y: float = 0.0
|
|
27
|
-
radius: float = 0.0
|
|
28
|
-
time: Time = field(default_factory=Time.now)
|
|
31
|
+
state = MultiFiberState
|
|
32
|
+
capabilities = MultiFiberCapabilities
|
|
29
33
|
|
|
30
34
|
@abstractmethod
|
|
31
35
|
async def abort(self, **kwargs: Any) -> None:
|
|
@@ -42,4 +46,4 @@ class IMultiFiber(Interface, metaclass=ABCMeta):
|
|
|
42
46
|
...
|
|
43
47
|
|
|
44
48
|
|
|
45
|
-
__all__ = ["IMultiFiber"]
|
|
49
|
+
__all__ = ["IMultiFiber", "MultiFiberState", "MultiFiberCapabilities"]
|