pyobs-qhyccd 2.0.0.dev8__tar.gz → 2.0.0.dev11__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_qhyccd-2.0.0.dev11/.github/dependabot.yml +10 -0
- pyobs_qhyccd-2.0.0.dev11/.github/workflows/pypi.yml +65 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/PKG-INFO +4 -4
- pyobs_qhyccd-2.0.0.dev11/lib/usr/local/lib/libqhyccd.so.20 +0 -0
- pyobs_qhyccd-2.0.0.dev11/lib/usr/local/lib/libqhyccd.so.25.9.29.10 +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/pyobs_qhyccd/qhyccdcamera.py +177 -64
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/pyproject.toml +14 -5
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/uv.lock +700 -151
- pyobs_qhyccd-2.0.0.dev8/.github/workflows/pypi.yml +0 -29
- pyobs_qhyccd-2.0.0.dev8/lib/usr/local/lib/libqhyccd.so +0 -1
- pyobs_qhyccd-2.0.0.dev8/lib/usr/local/lib/libqhyccd.so.20 +0 -1
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/.github/workflows/ruff.yml +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/.pre-commit-config.yaml +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/.readthedocs.yml +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/README.md +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/docs/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/docs/make.bat +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/docs/requirements.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/docs/source/_static/pyobs.gif +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/docs/source/conf.py +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/docs/source/index.rst +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/distclean.sh +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/etc/udev/rules.d/85-qhyccd.rules +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/install.sh +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IC16200A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IC16803.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IC8300.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IC90A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IMG0H.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IMG2P.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IMG2S.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/IMG50.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/Origin678C.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/POLEMASTER.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY0204.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY09000A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY10.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY10768.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY11.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY12.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY1253.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY128.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY128PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY15.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY16.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY16000.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY160002AD.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY16200A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY163.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY165.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY168.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY16803A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY174.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY178.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY183.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY183A.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY1920.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY2.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY20.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY2020.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY21.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY22.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY224.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY23.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY247.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY268.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY27.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY28.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY29.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY290.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY294.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY294PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY2E.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY2PRO.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY342.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY342PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY367.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY367PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY4040.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY4040PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY410.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY411.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY411ERIS.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY411_1.3.3.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY42.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY42PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY432.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY461.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY487.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY530.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY533.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY550.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY585.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5II.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III174.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III178.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III185.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III200.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III224.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III290.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III334.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III415.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III462.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III482.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III485.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III568.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III585.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III678.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5III715.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY5LOADER.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY6.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY600-9267-1203.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY600.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY600ERIS-12-qxx.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY6060.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY6060PRO.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY695A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY7.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY8.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY811.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY814A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY8L.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY8M.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY8PRO.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY90A.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY9701.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY990.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY991.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY992.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/QHY9S.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/miniCam5.HEX +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/firmware/qhy/miniCam8.img +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/lib/udev/rules.d/85-qhyccd.rules +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/sbin/fxload +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/uninstall.sh +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/cmake_modules/FindOpenCV.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/cmake_modules/FindUSB-1.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/cmake_modules/FindUSB-ARM.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/doc/HowTo_QHYCCD_SDK_CrossPlatform.pdf +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/COPYING +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/README.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/a3load.hex +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/ezusb.c +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/ezusb.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/fxload +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/fxload.8 +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/fxload.spec +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/fx3load/main.c +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/include/config.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/include/qhyccd.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/include/qhyccdcamdef.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/include/qhyccderr.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/include/qhyccdstruct.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/lib/libqhyccd.a +0 -0
- /pyobs_qhyccd-2.0.0.dev8/lib/usr/local/lib/libqhyccd.so.25.9.29.10 → /pyobs_qhyccd-2.0.0.dev11/lib/usr/local/lib/libqhyccd.so +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/riffa_linux_driver/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/riffa_linux_driver/README.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/riffa_linux_driver/circ_queue.c +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/riffa_linux_driver/circ_queue.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/riffa_linux_driver/riffa_driver.c +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/riffa_linux_driver/riffa_driver.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/DownloadFirmware/.svn/entries +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/DownloadFirmware/.svn/format +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/DownloadFirmware/.svn/text-base/Makefile.svn-base +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/DownloadFirmware/.svn/text-base/downfirmware.cpp.svn-base +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/DownloadFirmware/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/DownloadFirmware/downfirmware.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/.svn/entries +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/.svn/format +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/.svn/text-base/LiveFrameSample.cpp.svn-base +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/.svn/text-base/Makefile.svn-base +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/LiveFrameSample +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/LiveFrameSample.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/LiveFrameSample.o +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode/qhyccd.ini +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode_PCIE_Raw_Riffa/LiveFrameSample.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode_PCIE_Raw_Riffa/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/LiveFrameMode_PCIE_Raw_Riffa/qhyccd.ini +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/.svn/entries +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/.svn/format +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/.svn/text-base/Makefile.svn-base +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/.svn/text-base/SingleFrameMode.cpp.svn-base +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/Makefile +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/SingleFrameMode +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/SingleFrameMode.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/SingleFrameMode.o +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/SingleFrameMode/qhyccd.ini +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/cmake/FindLibQHYCCD.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_base/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_base/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_cfw/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_cfw/build/qhyccd.ini +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_cfw/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/CMakeCommon.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/CMakeParseArguments.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindCFITSIO.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindDC1394.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindFFTW3.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindGMock.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindGSL.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindINDI.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindJPEG.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindLibXISF.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindLibev.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindNova.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindOggTheora.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindOpenAL.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindPackageHandleStandardArgs.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindPackageMessage.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindRTLSDR.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindUSB1.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindVorbis.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/UnityBuild.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_client/main.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/CMakeCommon.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/CMakeParseArguments.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindCFITSIO.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindDC1394.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindFFTW3.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindGMock.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindGSL.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindINDI.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindJPEG.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindLibXISF.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindLibev.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindNova.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindOggTheora.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindOpenAL.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindPackageHandleStandardArgs.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindPackageMessage.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindRTLSDR.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindUSB1.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindVorbis.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/UnityBuild.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_indi_focus/main.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/FindLibQHYCCD.cmake +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/README.md +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/CyAPI.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/CyUSB30_def.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/config.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/dllqhyccd.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/dllqhyccd.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccd.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccdcamdef.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccderr.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccdinternal.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccdstruct.h +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/lib/qhyccd.lib +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_opencv/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_live_opencv/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_single_opencv/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/cmake_demo/test_single_opencv/main.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/CMakeLists.txt +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/Capture.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/ControlCFW.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/ControlCool.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/ForceStop.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/GetCameraStatus.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/GetHistJPG.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/GetLastImageFIT.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/GetLastImageJPG.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/GetTemperature.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/LiveFrameSample.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/OSXDownloadFirmware2Camera.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/README +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/SetTemperature.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/testapp/common/SingleFrameSample.cpp +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/local/udev/85-qhyccd.rules +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/lib/usr/share/usb/a3load.hex +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/pyobs_qhyccd/__init__.py +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/pyobs_qhyccd/gui.py +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/pyobs_qhyccd/libqhyccd.pxd +0 -0
- {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev11}/pyobs_qhyccd/qhyccddriver.pyx +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: Publish package to PyPI
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
tags:
|
|
5
|
+
- 'v*'
|
|
6
|
+
jobs:
|
|
7
|
+
build-wheels:
|
|
8
|
+
name: Build wheels
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- name: Check out repository code
|
|
12
|
+
uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Build wheels
|
|
15
|
+
uses: pypa/cibuildwheel@v4.2.0
|
|
16
|
+
|
|
17
|
+
- name: Upload wheels
|
|
18
|
+
uses: actions/upload-artifact@v4
|
|
19
|
+
with:
|
|
20
|
+
name: wheels
|
|
21
|
+
path: wheelhouse/*.whl
|
|
22
|
+
|
|
23
|
+
build-sdist:
|
|
24
|
+
name: Build sdist
|
|
25
|
+
runs-on: ubuntu-latest
|
|
26
|
+
steps:
|
|
27
|
+
- name: Check out repository code
|
|
28
|
+
uses: actions/checkout@v4
|
|
29
|
+
|
|
30
|
+
- name: Set up Python
|
|
31
|
+
uses: astral-sh/setup-uv@v5
|
|
32
|
+
with:
|
|
33
|
+
enable-cache: true
|
|
34
|
+
python-version: "3.13"
|
|
35
|
+
|
|
36
|
+
- name: Build sdist
|
|
37
|
+
run: uv build --sdist
|
|
38
|
+
|
|
39
|
+
- name: Upload sdist
|
|
40
|
+
uses: actions/upload-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: sdist
|
|
43
|
+
path: dist/*.tar.gz
|
|
44
|
+
|
|
45
|
+
publish:
|
|
46
|
+
name: Publish to PyPI
|
|
47
|
+
needs: [build-wheels, build-sdist]
|
|
48
|
+
runs-on: ubuntu-latest
|
|
49
|
+
steps:
|
|
50
|
+
- name: Download artifacts
|
|
51
|
+
uses: actions/download-artifact@v4
|
|
52
|
+
with:
|
|
53
|
+
path: dist
|
|
54
|
+
merge-multiple: true
|
|
55
|
+
|
|
56
|
+
- name: Set up Python
|
|
57
|
+
uses: astral-sh/setup-uv@v5
|
|
58
|
+
with:
|
|
59
|
+
enable-cache: true
|
|
60
|
+
python-version: "3.13"
|
|
61
|
+
|
|
62
|
+
- name: Publish
|
|
63
|
+
env:
|
|
64
|
+
PYPI_TOKEN: ${{ secrets.pypi_password }}
|
|
65
|
+
run: uv publish --token $PYPI_TOKEN dist/*
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyobs-qhyccd
|
|
3
|
-
Version: 2.0.0.
|
|
3
|
+
Version: 2.0.0.dev11
|
|
4
4
|
Summary: pyobs module for QHYCCD cameras
|
|
5
5
|
Author-Email: Tim-Oliver Husser <thusser@uni-goettingen.de>
|
|
6
6
|
License-Expression: MIT
|
|
7
|
-
Requires-Python:
|
|
7
|
+
Requires-Python: >=3.11
|
|
8
8
|
Requires-Dist: astropy<8,>=7.0.1
|
|
9
9
|
Requires-Dist: numpy<3,>=2.2.5
|
|
10
|
-
Requires-Dist: pyobs-core<3,>=2.0.0.
|
|
10
|
+
Requires-Dist: pyobs-core<3,>=2.0.0.dev48
|
|
11
11
|
Provides-Extra: gui
|
|
12
|
-
Requires-Dist: pyobs-core[gui]<3,>=2.0.0.
|
|
12
|
+
Requires-Dist: pyobs-core[gui]<3,>=2.0.0.dev48; extra == "gui"
|
|
13
13
|
Requires-Dist: qasync>=0.28.0; extra == "gui"
|
|
14
14
|
|
|
Binary file
|
|
Binary file
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import logging
|
|
3
3
|
import math
|
|
4
|
+
import threading
|
|
4
5
|
import time
|
|
6
|
+
from collections.abc import Callable
|
|
5
7
|
from datetime import UTC, datetime
|
|
6
|
-
from typing import Any
|
|
8
|
+
from typing import Any, TypeVar, cast
|
|
7
9
|
|
|
8
10
|
import numpy as np
|
|
9
11
|
from pyobs.images import Image
|
|
@@ -31,6 +33,13 @@ from .qhyccddriver import Control, QHYCCDDriver, set_log_level # type: ignore
|
|
|
31
33
|
|
|
32
34
|
log = logging.getLogger(__name__)
|
|
33
35
|
|
|
36
|
+
_T = TypeVar("_T")
|
|
37
|
+
|
|
38
|
+
# QHYCCD SDK calls are blocking and are made directly on the event loop thread (see
|
|
39
|
+
# _run_blocking). If the camera has gone unresponsive, they can hang indefinitely, so they're
|
|
40
|
+
# bounded with a timeout rather than let a single dead camera freeze the whole module.
|
|
41
|
+
_SDK_CALL_TIMEOUT = 5.0
|
|
42
|
+
|
|
34
43
|
|
|
35
44
|
class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling, IGain):
|
|
36
45
|
"""A pyobs module for QHYCCD cameras."""
|
|
@@ -61,41 +70,93 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
61
70
|
|
|
62
71
|
self.add_background_task(self._update_cooling)
|
|
63
72
|
|
|
73
|
+
@staticmethod
|
|
74
|
+
async def _run_blocking(func: Callable[[], None], timeout: float = _SDK_CALL_TIMEOUT) -> bool:
|
|
75
|
+
"""Run a blocking QHYCCD SDK call in a daemon thread, so a hung call can't freeze the module.
|
|
76
|
+
|
|
77
|
+
A plain executor isn't used here, since its worker threads are non-daemon and Python joins
|
|
78
|
+
them on interpreter shutdown -- a hung call would then just move the freeze to process exit.
|
|
79
|
+
|
|
80
|
+
Returns:
|
|
81
|
+
True if func completed within timeout, False if it's still running in the background.
|
|
82
|
+
"""
|
|
83
|
+
loop = asyncio.get_running_loop()
|
|
84
|
+
future: asyncio.Future[None] = loop.create_future()
|
|
85
|
+
|
|
86
|
+
def _wrapper() -> None:
|
|
87
|
+
try:
|
|
88
|
+
func()
|
|
89
|
+
finally:
|
|
90
|
+
loop.call_soon_threadsafe(future.set_result, None)
|
|
91
|
+
|
|
92
|
+
threading.Thread(target=_wrapper, daemon=True).start()
|
|
93
|
+
try:
|
|
94
|
+
await asyncio.wait_for(future, timeout=timeout)
|
|
95
|
+
return True
|
|
96
|
+
except TimeoutError:
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
async def _run_blocking_or_raise(self, func: Callable[[], _T], timeout: float = _SDK_CALL_TIMEOUT) -> _T:
|
|
100
|
+
"""Run a blocking QHYCCD SDK call in a thread, returning its result or re-raising what it raised.
|
|
101
|
+
|
|
102
|
+
Unlike _run_blocking(), this also carries the callable's return value/exception back to the
|
|
103
|
+
caller -- several QHYCCD calls here drive control flow via their return value or a raised
|
|
104
|
+
ValueError (e.g. unsupported color cams), which a bare fire-and-forget thread call would
|
|
105
|
+
otherwise silently lose.
|
|
106
|
+
"""
|
|
107
|
+
outcome: list[Any] = []
|
|
108
|
+
|
|
109
|
+
def _wrapper() -> None:
|
|
110
|
+
try:
|
|
111
|
+
outcome.append(func())
|
|
112
|
+
except BaseException as e:
|
|
113
|
+
outcome.append(e)
|
|
114
|
+
|
|
115
|
+
if not await self._run_blocking(_wrapper, timeout=timeout):
|
|
116
|
+
raise TimeoutError(f"Timed out waiting for QHYCCD SDK call after {timeout}s.")
|
|
117
|
+
value = outcome[0]
|
|
118
|
+
if isinstance(value, BaseException):
|
|
119
|
+
raise value
|
|
120
|
+
return cast(_T, value)
|
|
121
|
+
|
|
64
122
|
async def open(self) -> None:
|
|
65
123
|
"""Open module."""
|
|
66
124
|
await BaseCamera.open(self)
|
|
67
125
|
|
|
68
|
-
|
|
126
|
+
def _connect() -> tuple[int, int]:
|
|
127
|
+
set_log_level(0)
|
|
128
|
+
|
|
129
|
+
devices = QHYCCDDriver.list_devices()
|
|
130
|
+
self._driver = QHYCCDDriver(devices[0])
|
|
131
|
+
self._driver.open()
|
|
69
132
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
self._driver.open()
|
|
133
|
+
if self._driver.is_control_available(Control.CAM_COLOR):
|
|
134
|
+
raise ValueError("Color cams are not supported.")
|
|
73
135
|
|
|
74
|
-
|
|
75
|
-
|
|
136
|
+
if self._driver.is_control_available(Control.CONTROL_USBTRAFFIC):
|
|
137
|
+
self._driver.set_param(Control.CONTROL_USBTRAFFIC, 60)
|
|
76
138
|
|
|
77
|
-
|
|
78
|
-
|
|
139
|
+
if self._driver.is_control_available(Control.CONTROL_GAIN):
|
|
140
|
+
self._driver.set_param(Control.CONTROL_GAIN, 10)
|
|
79
141
|
|
|
80
|
-
|
|
81
|
-
|
|
142
|
+
if self._driver.is_control_available(Control.CONTROL_OFFSET):
|
|
143
|
+
self._driver.set_param(Control.CONTROL_OFFSET, 140)
|
|
82
144
|
|
|
83
|
-
|
|
84
|
-
|
|
145
|
+
if self._driver.is_control_available(Control.CONTROL_TRANSFERBIT):
|
|
146
|
+
self._driver.set_bits_mode(16)
|
|
85
147
|
|
|
86
|
-
|
|
87
|
-
|
|
148
|
+
chip = self._driver.get_chip_info()
|
|
149
|
+
log.info("Chip size: %.3fx%.3f [mm]", chip[0], chip[1])
|
|
150
|
+
log.info("Pixel size: %.3fx %.3f [um]", chip[4], chip[5])
|
|
151
|
+
log.info("Image size: %dx%d", chip[2], chip[3])
|
|
152
|
+
overscan = self._driver.get_overscan_area()
|
|
153
|
+
log.info("Overscan Area: %dx%d from %d,%d", overscan[2], overscan[3], overscan[0], overscan[1])
|
|
154
|
+
effective = self._driver.get_effective_area()
|
|
155
|
+
log.info("Effective Area: %dx%d from %d,%d", effective[2], effective[3], effective[0], effective[1])
|
|
88
156
|
|
|
89
|
-
|
|
90
|
-
log.info("Chip size: %.3fx%.3f [mm]", chip[0], chip[1])
|
|
91
|
-
log.info("Pixel size: %.3fx %.3f [um]", chip[4], chip[5])
|
|
92
|
-
log.info("Image size: %dx%d", chip[2], chip[3])
|
|
93
|
-
overscan = self._driver.get_overscan_area()
|
|
94
|
-
log.info("Overscan Area: %dx%d from %d,%d", overscan[2], overscan[3], overscan[0], overscan[1])
|
|
95
|
-
effective = self._driver.get_effective_area()
|
|
96
|
-
log.info("Effective Area: %dx%d from %d,%d", effective[2], effective[3], effective[0], effective[1])
|
|
157
|
+
return chip[2], chip[3]
|
|
97
158
|
|
|
98
|
-
full_width, full_height =
|
|
159
|
+
full_width, full_height = await self._run_blocking_or_raise(_connect)
|
|
99
160
|
self._window = (0, 0, full_width, full_height)
|
|
100
161
|
|
|
101
162
|
# publish static capabilities
|
|
@@ -105,46 +166,64 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
105
166
|
full_frame_x=0, full_frame_y=0, full_frame_width=full_width, full_frame_height=full_height
|
|
106
167
|
),
|
|
107
168
|
)
|
|
108
|
-
await self.comm.set_capabilities(IBinning, BinningCapabilities(binnings=self._available_binnings()))
|
|
169
|
+
await self.comm.set_capabilities(IBinning, BinningCapabilities(binnings=await self._available_binnings()))
|
|
109
170
|
|
|
110
171
|
# publish initial states
|
|
111
172
|
await self.comm.set_state(IWindow, WindowState(x=0, y=0, width=full_width, height=full_height))
|
|
112
173
|
await self.comm.set_state(IBinning, BinningState(x=self._binning[0], y=self._binning[1]))
|
|
113
|
-
|
|
114
|
-
|
|
174
|
+
|
|
175
|
+
def _get_gain_offset() -> tuple[float, float]:
|
|
176
|
+
assert self._driver is not None
|
|
177
|
+
return float(self._driver.get_param(Control.CONTROL_GAIN)), float(
|
|
178
|
+
self._driver.get_param(Control.CONTROL_OFFSET)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
gain, offset = await self._run_blocking_or_raise(_get_gain_offset)
|
|
115
182
|
await self.comm.set_state(IGain, GainState(gain=gain, offset=offset))
|
|
116
183
|
|
|
117
184
|
if self._setpoint is not None:
|
|
118
185
|
await self.set_cooling(True, self._setpoint)
|
|
119
186
|
|
|
120
187
|
if self._params is not None:
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
188
|
+
params = self._params
|
|
189
|
+
|
|
190
|
+
def _set_custom_params() -> None:
|
|
191
|
+
assert self._driver is not None
|
|
192
|
+
for key, value in params.items():
|
|
193
|
+
p = "CONTROL_" + key.upper()
|
|
194
|
+
if hasattr(Control, p):
|
|
195
|
+
control_param = getattr(Control, p)
|
|
196
|
+
log.info("Setting %s to %s.", control_param, value)
|
|
197
|
+
self._driver.set_param(control_param, value)
|
|
198
|
+
|
|
199
|
+
await self._run_blocking_or_raise(_set_custom_params)
|
|
200
|
+
|
|
201
|
+
async def _available_binnings(self) -> list[BinningState]:
|
|
129
202
|
if self._driver is None:
|
|
130
203
|
return []
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
204
|
+
driver = self._driver
|
|
205
|
+
|
|
206
|
+
def _get() -> list[BinningState]:
|
|
207
|
+
binnings = []
|
|
208
|
+
if driver.is_control_available(Control.CAM_BIN1X1MODE):
|
|
209
|
+
binnings.append(BinningState(x=1, y=1))
|
|
210
|
+
if driver.is_control_available(Control.CAM_BIN2X2MODE):
|
|
211
|
+
binnings.append(BinningState(x=2, y=2))
|
|
212
|
+
if driver.is_control_available(Control.CAM_BIN3X3MODE):
|
|
213
|
+
binnings.append(BinningState(x=3, y=3))
|
|
214
|
+
if driver.is_control_available(Control.CAM_BIN4X4MODE):
|
|
215
|
+
binnings.append(BinningState(x=4, y=4))
|
|
216
|
+
return binnings
|
|
217
|
+
|
|
218
|
+
return await self._run_blocking_or_raise(_get)
|
|
141
219
|
|
|
142
220
|
async def close(self) -> None:
|
|
143
221
|
"""Close the module."""
|
|
144
222
|
await BaseCamera.close(self)
|
|
145
223
|
|
|
146
224
|
if self._driver:
|
|
147
|
-
self._driver.close
|
|
225
|
+
if not await self._run_blocking(self._driver.close):
|
|
226
|
+
log.error("Timed out closing QHYCCD camera after %.1fs.", _SDK_CALL_TIMEOUT)
|
|
148
227
|
|
|
149
228
|
async def set_window(self, left: int, top: int, width: int, height: int, **kwargs: Any) -> None:
|
|
150
229
|
"""Set the camera window.
|
|
@@ -173,8 +252,9 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
173
252
|
async def _prepare_driver_for_exposure(self, exposure_time: float) -> None:
|
|
174
253
|
if self._driver is None:
|
|
175
254
|
raise ValueError("No camera driver.")
|
|
255
|
+
driver = self._driver
|
|
256
|
+
|
|
176
257
|
log.info("Set binning to %dx%d.", self._binning[0], self._binning[1])
|
|
177
|
-
self._driver.set_bin_mode(*self._binning)
|
|
178
258
|
|
|
179
259
|
width = int(math.floor(self._window[2]) / self._binning[0])
|
|
180
260
|
height = int(math.floor(self._window[3]) / self._binning[1])
|
|
@@ -187,10 +267,14 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
187
267
|
self._window[0],
|
|
188
268
|
self._window[1],
|
|
189
269
|
)
|
|
190
|
-
self._driver.set_resolution(self._window[0], self._window[1], width, height)
|
|
191
|
-
self._driver.set_param(Control.CONTROL_EXPOSURE, int(exposure_time * 1000.0 * 1000.0))
|
|
192
270
|
|
|
193
|
-
|
|
271
|
+
def _prepare() -> tuple[int, int, int, int]:
|
|
272
|
+
driver.set_bin_mode(*self._binning)
|
|
273
|
+
driver.set_resolution(self._window[0], self._window[1], width, height)
|
|
274
|
+
driver.set_param(Control.CONTROL_EXPOSURE, int(exposure_time * 1000.0 * 1000.0))
|
|
275
|
+
return driver.get_effective_area()
|
|
276
|
+
|
|
277
|
+
eff = await self._run_blocking_or_raise(_prepare)
|
|
194
278
|
self._effective_area = (eff[0], eff[1], eff[2] * self._binning[0], eff[3] * self._binning[1])
|
|
195
279
|
|
|
196
280
|
async def _get_image_with_header(self, image_data: Any, date_obs: str, exposure_time: float) -> Image:
|
|
@@ -228,16 +312,17 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
228
312
|
"""
|
|
229
313
|
if self._driver is None:
|
|
230
314
|
raise ValueError("No camera driver.")
|
|
315
|
+
driver = self._driver
|
|
231
316
|
|
|
232
317
|
await self._prepare_driver_for_exposure(exposure_time)
|
|
233
318
|
log.info(
|
|
234
319
|
"Starting exposure with %s shutter for %.2f seconds...", "open" if open_shutter else "closed", exposure_time
|
|
235
320
|
)
|
|
236
321
|
date_obs = datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%S.%f")
|
|
237
|
-
self.
|
|
322
|
+
await self._run_blocking_or_raise(driver.expose_single_frame)
|
|
238
323
|
await self._wait_exposure(abort_event, exposure_time, open_shutter)
|
|
239
324
|
loop = asyncio.get_running_loop()
|
|
240
|
-
image_data = await loop.run_in_executor(None,
|
|
325
|
+
image_data = await loop.run_in_executor(None, driver.get_single_frame)
|
|
241
326
|
return await self._get_image_with_header(image_data, date_obs, exposure_time)
|
|
242
327
|
|
|
243
328
|
async def _wait_exposure(self, abort_event: asyncio.Event, exposure_time: float, open_shutter: bool) -> None:
|
|
@@ -253,7 +338,12 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
253
338
|
async def _get_cooling_power(self) -> float:
|
|
254
339
|
if self._driver is None:
|
|
255
340
|
raise ValueError("No camera driver.")
|
|
256
|
-
|
|
341
|
+
driver = self._driver
|
|
342
|
+
|
|
343
|
+
def _get() -> float:
|
|
344
|
+
return float(driver.get_param(Control.CONTROL_CURPWM)) / 255 * 100 # TODO:
|
|
345
|
+
|
|
346
|
+
return await self._run_blocking_or_raise(_get)
|
|
257
347
|
|
|
258
348
|
async def set_cooling(self, enabled: bool, setpoint: float, **kwargs: Any) -> None:
|
|
259
349
|
if enabled:
|
|
@@ -270,33 +360,46 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
270
360
|
await asyncio.sleep(5)
|
|
271
361
|
if self._driver is None:
|
|
272
362
|
raise ValueError("No camera driver.")
|
|
363
|
+
driver = self._driver
|
|
273
364
|
|
|
274
365
|
start_time = 0.0
|
|
275
366
|
while True:
|
|
276
367
|
try:
|
|
277
368
|
await asyncio.sleep(1.0)
|
|
278
369
|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
370
|
+
cooling_next = self._cooling_next
|
|
371
|
+
|
|
372
|
+
def _poll() -> tuple[float, float, bool, bool]:
|
|
373
|
+
if cooling_next is not None:
|
|
374
|
+
driver.set_temperature(cooling_next)
|
|
375
|
+
current_temp = float(driver.get_param(Control.CONTROL_CURTEMP))
|
|
376
|
+
power_raw = float(driver.get_param(Control.CONTROL_CURPWM))
|
|
377
|
+
cooler_available = driver.is_control_available(Control.CONTROL_COOLER)
|
|
378
|
+
# bug: QHY PWM wraps above 250 -- checked with a fresh read, same as the
|
|
379
|
+
# separate driver.get_param() call the original code made for this check
|
|
380
|
+
pwm_over_250 = float(driver.get_param(Control.CONTROL_CURPWM)) > 250
|
|
381
|
+
return current_temp, power_raw, cooler_available, pwm_over_250
|
|
382
|
+
|
|
383
|
+
self._current_temperature, power_raw, cooler_available, pwm_over_250 = (
|
|
384
|
+
await self._run_blocking_or_raise(_poll)
|
|
385
|
+
)
|
|
282
386
|
|
|
283
387
|
# publish live temperatures and cooling state
|
|
284
388
|
await self.comm.set_state(
|
|
285
389
|
ITemperatures,
|
|
286
390
|
TemperaturesState(readings=[SensorReading(name="CCD", value=self._current_temperature)]),
|
|
287
391
|
)
|
|
288
|
-
power = round(
|
|
392
|
+
power = round(power_raw / 255 * 100)
|
|
289
393
|
await self.comm.set_state(
|
|
290
394
|
ICooling,
|
|
291
395
|
CoolingState(
|
|
292
396
|
setpoint=self._setpoint,
|
|
293
397
|
power=power,
|
|
294
|
-
enabled=
|
|
398
|
+
enabled=cooler_available,
|
|
295
399
|
),
|
|
296
400
|
)
|
|
297
401
|
|
|
298
|
-
|
|
299
|
-
if self._driver.get_param(Control.CONTROL_CURPWM) > 250:
|
|
402
|
+
if pwm_over_250:
|
|
300
403
|
self._cooling_next = self._current_temperature + 5.0
|
|
301
404
|
log.warning(
|
|
302
405
|
"Cooling power seems to be bugged. Setting temperature to %.2f°. "
|
|
@@ -341,8 +444,13 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
341
444
|
"""
|
|
342
445
|
if self._driver is None:
|
|
343
446
|
raise ValueError("No camera driver.")
|
|
344
|
-
self._driver
|
|
345
|
-
|
|
447
|
+
driver = self._driver
|
|
448
|
+
|
|
449
|
+
def _set() -> float:
|
|
450
|
+
driver.set_param(Control.CONTROL_GAIN, gain)
|
|
451
|
+
return float(driver.get_param(Control.CONTROL_OFFSET))
|
|
452
|
+
|
|
453
|
+
offset = await self._run_blocking_or_raise(_set)
|
|
346
454
|
await self.comm.set_state(IGain, GainState(gain=gain, offset=offset))
|
|
347
455
|
|
|
348
456
|
async def set_offset(self, offset: float, **kwargs: Any) -> None:
|
|
@@ -353,8 +461,13 @@ class QHYCCDCamera(BaseCamera, ICamera, IWindow, IBinning, IAbortable, ICooling,
|
|
|
353
461
|
"""
|
|
354
462
|
if self._driver is None:
|
|
355
463
|
raise ValueError("No camera driver.")
|
|
356
|
-
self._driver
|
|
357
|
-
|
|
464
|
+
driver = self._driver
|
|
465
|
+
|
|
466
|
+
def _set() -> float:
|
|
467
|
+
driver.set_param(Control.CONTROL_OFFSET, offset)
|
|
468
|
+
return float(driver.get_param(Control.CONTROL_GAIN))
|
|
469
|
+
|
|
470
|
+
gain = await self._run_blocking_or_raise(_set)
|
|
358
471
|
await self.comm.set_state(IGain, GainState(gain=gain, offset=offset))
|
|
359
472
|
|
|
360
473
|
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "pyobs-qhyccd"
|
|
3
|
-
version = "2.0.0.
|
|
3
|
+
version = "2.0.0.dev11"
|
|
4
4
|
description = "pyobs module for QHYCCD cameras"
|
|
5
5
|
authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
|
|
6
|
-
requires-python = ">=3.11
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
7
|
license = "MIT"
|
|
8
8
|
dependencies = [
|
|
9
9
|
"astropy>=7.0.1,<8",
|
|
10
10
|
"numpy>=2.2.5,<3",
|
|
11
|
-
"pyobs-core>=2.0.0.
|
|
11
|
+
"pyobs-core>=2.0.0.dev48,<3",
|
|
12
12
|
]
|
|
13
13
|
|
|
14
14
|
[project.optional-dependencies]
|
|
15
15
|
gui = [
|
|
16
|
-
"pyobs-core[gui]>=2.0.0.
|
|
16
|
+
"pyobs-core[gui]>=2.0.0.dev48,<3",
|
|
17
17
|
"qasync>=0.28.0",
|
|
18
18
|
]
|
|
19
19
|
|
|
20
20
|
[dependency-groups]
|
|
21
21
|
dev = [
|
|
22
|
-
"black>=25.1.0,<
|
|
22
|
+
"black>=25.1.0,<27",
|
|
23
23
|
"ruff>=0.9.0",
|
|
24
24
|
"pyrefly>=1.1.1",
|
|
25
25
|
"pre-commit>=4.2.0,<5",
|
|
@@ -35,6 +35,15 @@ qhyccd-gui = 'pyobs_qhyccd.gui:main'
|
|
|
35
35
|
[tool.scikit-build]
|
|
36
36
|
wheel.packages = ["pyobs_qhyccd"]
|
|
37
37
|
|
|
38
|
+
[tool.cibuildwheel]
|
|
39
|
+
build = "cp311-* cp312-* cp313-* cp314-*"
|
|
40
|
+
skip = "*-musllinux_* *-manylinux_i686"
|
|
41
|
+
archs = ["x86_64"]
|
|
42
|
+
|
|
43
|
+
[tool.cibuildwheel.linux]
|
|
44
|
+
manylinux-x86_64-image = "manylinux_2_28"
|
|
45
|
+
before-all = "dnf install -y epel-release && dnf install -y cfitsio-devel libusbx-devel"
|
|
46
|
+
|
|
38
47
|
[build-system]
|
|
39
48
|
requires = ["scikit_build_core>=0.12", "cython>=3.0", "cython-cmake", "numpy>=2.0"]
|
|
40
49
|
build-backend = "scikit_build_core.build"
|