pyobs-qhyccd 2.0.0.dev8__tar.gz → 2.0.0.dev9__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.
Files changed (281) hide show
  1. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/PKG-INFO +1 -1
  2. pyobs_qhyccd-2.0.0.dev9/lib/usr/local/lib/libqhyccd.so.20 +0 -0
  3. pyobs_qhyccd-2.0.0.dev9/lib/usr/local/lib/libqhyccd.so.25.9.29.10 +0 -0
  4. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/pyobs_qhyccd/qhyccdcamera.py +177 -64
  5. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/pyproject.toml +1 -1
  6. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/uv.lock +1 -1
  7. pyobs_qhyccd-2.0.0.dev8/lib/usr/local/lib/libqhyccd.so +0 -1
  8. pyobs_qhyccd-2.0.0.dev8/lib/usr/local/lib/libqhyccd.so.20 +0 -1
  9. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/.github/workflows/pypi.yml +0 -0
  10. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/.github/workflows/ruff.yml +0 -0
  11. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/.pre-commit-config.yaml +0 -0
  12. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/.readthedocs.yml +0 -0
  13. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/CMakeLists.txt +0 -0
  14. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/README.md +0 -0
  15. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/docs/Makefile +0 -0
  16. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/docs/make.bat +0 -0
  17. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/docs/requirements.txt +0 -0
  18. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/docs/source/_static/pyobs.gif +0 -0
  19. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/docs/source/conf.py +0 -0
  20. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/docs/source/index.rst +0 -0
  21. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/distclean.sh +0 -0
  22. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/etc/udev/rules.d/85-qhyccd.rules +0 -0
  23. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/install.sh +0 -0
  24. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IC16200A.HEX +0 -0
  25. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IC16803.HEX +0 -0
  26. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IC8300.HEX +0 -0
  27. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IC90A.HEX +0 -0
  28. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IMG0H.HEX +0 -0
  29. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IMG2P.HEX +0 -0
  30. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IMG2S.HEX +0 -0
  31. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/IMG50.HEX +0 -0
  32. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/Origin678C.img +0 -0
  33. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/POLEMASTER.HEX +0 -0
  34. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY0204.img +0 -0
  35. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY09000A.HEX +0 -0
  36. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY10.HEX +0 -0
  37. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY10768.img +0 -0
  38. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY11.HEX +0 -0
  39. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY12.HEX +0 -0
  40. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY1253.img +0 -0
  41. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY128.img +0 -0
  42. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY128PRO.img +0 -0
  43. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY15.HEX +0 -0
  44. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY16.HEX +0 -0
  45. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY16000.HEX +0 -0
  46. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY160002AD.HEX +0 -0
  47. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY16200A.HEX +0 -0
  48. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY163.img +0 -0
  49. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY165.img +0 -0
  50. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY168.img +0 -0
  51. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY16803A.HEX +0 -0
  52. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY174.img +0 -0
  53. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY178.img +0 -0
  54. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY183.img +0 -0
  55. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY183A.img +0 -0
  56. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY1920.img +0 -0
  57. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY2.HEX +0 -0
  58. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY20.HEX +0 -0
  59. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY2020.img +0 -0
  60. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY21.HEX +0 -0
  61. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY22.HEX +0 -0
  62. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY224.img +0 -0
  63. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY23.HEX +0 -0
  64. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY247.img +0 -0
  65. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY268.img +0 -0
  66. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY27.HEX +0 -0
  67. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY28.HEX +0 -0
  68. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY29.HEX +0 -0
  69. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY290.img +0 -0
  70. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY294.img +0 -0
  71. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY294PRO.img +0 -0
  72. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY2E.HEX +0 -0
  73. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY2PRO.HEX +0 -0
  74. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY342.img +0 -0
  75. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY342PRO.img +0 -0
  76. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY367.img +0 -0
  77. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY367PRO.img +0 -0
  78. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY4040.img +0 -0
  79. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY4040PRO.img +0 -0
  80. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY410.img +0 -0
  81. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY411.img +0 -0
  82. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY411ERIS.img +0 -0
  83. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY411_1.3.3.img +0 -0
  84. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY42.img +0 -0
  85. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY42PRO.img +0 -0
  86. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY432.img +0 -0
  87. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY461.img +0 -0
  88. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY487.img +0 -0
  89. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5.HEX +0 -0
  90. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY530.img +0 -0
  91. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY533.img +0 -0
  92. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY550.img +0 -0
  93. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY585.img +0 -0
  94. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5II.HEX +0 -0
  95. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III174.img +0 -0
  96. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III178.img +0 -0
  97. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III185.img +0 -0
  98. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III200.img +0 -0
  99. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III224.img +0 -0
  100. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III290.img +0 -0
  101. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III334.img +0 -0
  102. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III415.img +0 -0
  103. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III462.img +0 -0
  104. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III482.img +0 -0
  105. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III485.img +0 -0
  106. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III568.img +0 -0
  107. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III585.img +0 -0
  108. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III678.img +0 -0
  109. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5III715.img +0 -0
  110. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY5LOADER.HEX +0 -0
  111. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY6.HEX +0 -0
  112. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY600-9267-1203.img +0 -0
  113. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY600.img +0 -0
  114. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY600ERIS-12-qxx.img +0 -0
  115. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY6060.img +0 -0
  116. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY6060PRO.img +0 -0
  117. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY695A.HEX +0 -0
  118. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY7.HEX +0 -0
  119. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY8.HEX +0 -0
  120. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY811.img +0 -0
  121. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY814A.HEX +0 -0
  122. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY8L.HEX +0 -0
  123. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY8M.HEX +0 -0
  124. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY8PRO.HEX +0 -0
  125. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY90A.HEX +0 -0
  126. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY9701.img +0 -0
  127. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY990.img +0 -0
  128. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY991.img +0 -0
  129. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY992.img +0 -0
  130. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/QHY9S.HEX +0 -0
  131. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/miniCam5.HEX +0 -0
  132. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/firmware/qhy/miniCam8.img +0 -0
  133. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/lib/udev/rules.d/85-qhyccd.rules +0 -0
  134. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/sbin/fxload +0 -0
  135. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/uninstall.sh +0 -0
  136. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/cmake_modules/FindOpenCV.cmake +0 -0
  137. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/cmake_modules/FindUSB-1.cmake +0 -0
  138. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/cmake_modules/FindUSB-ARM.cmake +0 -0
  139. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/doc/HowTo_QHYCCD_SDK_CrossPlatform.pdf +0 -0
  140. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/COPYING +0 -0
  141. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/Makefile +0 -0
  142. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/README.txt +0 -0
  143. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/a3load.hex +0 -0
  144. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/ezusb.c +0 -0
  145. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/ezusb.h +0 -0
  146. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/fxload +0 -0
  147. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/fxload.8 +0 -0
  148. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/fxload.spec +0 -0
  149. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/fx3load/main.c +0 -0
  150. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/include/config.h +0 -0
  151. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/include/qhyccd.h +0 -0
  152. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/include/qhyccdcamdef.h +0 -0
  153. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/include/qhyccderr.h +0 -0
  154. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/include/qhyccdstruct.h +0 -0
  155. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/lib/libqhyccd.a +0 -0
  156. /pyobs_qhyccd-2.0.0.dev8/lib/usr/local/lib/libqhyccd.so.25.9.29.10 → /pyobs_qhyccd-2.0.0.dev9/lib/usr/local/lib/libqhyccd.so +0 -0
  157. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/riffa_linux_driver/Makefile +0 -0
  158. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/riffa_linux_driver/README.txt +0 -0
  159. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/riffa_linux_driver/circ_queue.c +0 -0
  160. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/riffa_linux_driver/circ_queue.h +0 -0
  161. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/riffa_linux_driver/riffa_driver.c +0 -0
  162. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/riffa_linux_driver/riffa_driver.h +0 -0
  163. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/DownloadFirmware/.svn/entries +0 -0
  164. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/DownloadFirmware/.svn/format +0 -0
  165. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/DownloadFirmware/.svn/text-base/Makefile.svn-base +0 -0
  166. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/DownloadFirmware/.svn/text-base/downfirmware.cpp.svn-base +0 -0
  167. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/DownloadFirmware/Makefile +0 -0
  168. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/DownloadFirmware/downfirmware.cpp +0 -0
  169. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/.svn/entries +0 -0
  170. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/.svn/format +0 -0
  171. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/.svn/text-base/LiveFrameSample.cpp.svn-base +0 -0
  172. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/.svn/text-base/Makefile.svn-base +0 -0
  173. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/LiveFrameSample +0 -0
  174. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/LiveFrameSample.cpp +0 -0
  175. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/LiveFrameSample.o +0 -0
  176. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/Makefile +0 -0
  177. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode/qhyccd.ini +0 -0
  178. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode_PCIE_Raw_Riffa/LiveFrameSample.cpp +0 -0
  179. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode_PCIE_Raw_Riffa/Makefile +0 -0
  180. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/LiveFrameMode_PCIE_Raw_Riffa/qhyccd.ini +0 -0
  181. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/.svn/entries +0 -0
  182. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/.svn/format +0 -0
  183. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/.svn/text-base/Makefile.svn-base +0 -0
  184. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/.svn/text-base/SingleFrameMode.cpp.svn-base +0 -0
  185. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/Makefile +0 -0
  186. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/SingleFrameMode +0 -0
  187. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/SingleFrameMode.cpp +0 -0
  188. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/SingleFrameMode.o +0 -0
  189. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/SingleFrameMode/qhyccd.ini +0 -0
  190. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/cmake/FindLibQHYCCD.cmake +0 -0
  191. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_base/CMakeLists.txt +0 -0
  192. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_base/main.cpp +0 -0
  193. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_cfw/CMakeLists.txt +0 -0
  194. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_cfw/build/qhyccd.ini +0 -0
  195. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_cfw/main.cpp +0 -0
  196. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/CMakeLists.txt +0 -0
  197. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/CMakeCommon.cmake +0 -0
  198. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/CMakeParseArguments.cmake +0 -0
  199. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindCFITSIO.cmake +0 -0
  200. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindDC1394.cmake +0 -0
  201. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindFFTW3.cmake +0 -0
  202. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindGMock.cmake +0 -0
  203. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindGSL.cmake +0 -0
  204. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindINDI.cmake +0 -0
  205. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindJPEG.cmake +0 -0
  206. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindLibXISF.cmake +0 -0
  207. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindLibev.cmake +0 -0
  208. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindNova.cmake +0 -0
  209. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindOggTheora.cmake +0 -0
  210. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindOpenAL.cmake +0 -0
  211. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindPackageHandleStandardArgs.cmake +0 -0
  212. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindPackageMessage.cmake +0 -0
  213. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindRTLSDR.cmake +0 -0
  214. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindUSB1.cmake +0 -0
  215. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/FindVorbis.cmake +0 -0
  216. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/cmake_modules/UnityBuild.cmake +0 -0
  217. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/main.cpp +0 -0
  218. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_client/main.h +0 -0
  219. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/CMakeLists.txt +0 -0
  220. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/CMakeCommon.cmake +0 -0
  221. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/CMakeParseArguments.cmake +0 -0
  222. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindCFITSIO.cmake +0 -0
  223. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindDC1394.cmake +0 -0
  224. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindFFTW3.cmake +0 -0
  225. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindGMock.cmake +0 -0
  226. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindGSL.cmake +0 -0
  227. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindINDI.cmake +0 -0
  228. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindJPEG.cmake +0 -0
  229. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindLibXISF.cmake +0 -0
  230. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindLibev.cmake +0 -0
  231. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindNova.cmake +0 -0
  232. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindOggTheora.cmake +0 -0
  233. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindOpenAL.cmake +0 -0
  234. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindPackageHandleStandardArgs.cmake +0 -0
  235. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindPackageMessage.cmake +0 -0
  236. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindRTLSDR.cmake +0 -0
  237. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindUSB1.cmake +0 -0
  238. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/FindVorbis.cmake +0 -0
  239. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/cmake_modules/UnityBuild.cmake +0 -0
  240. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/main.cpp +0 -0
  241. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_indi_focus/main.h +0 -0
  242. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/CMakeLists.txt +0 -0
  243. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/FindLibQHYCCD.cmake +0 -0
  244. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/README.md +0 -0
  245. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/CyAPI.h +0 -0
  246. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/CyUSB30_def.h +0 -0
  247. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/config.h +0 -0
  248. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/dllqhyccd.cpp +0 -0
  249. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/dllqhyccd.h +0 -0
  250. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccd.h +0 -0
  251. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccdcamdef.h +0 -0
  252. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccderr.h +0 -0
  253. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccdinternal.h +0 -0
  254. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/include/qhyccdstruct.h +0 -0
  255. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/lib/qhyccd.lib +0 -0
  256. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_multicam_opencv/main.cpp +0 -0
  257. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_opencv/CMakeLists.txt +0 -0
  258. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_live_opencv/main.cpp +0 -0
  259. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_single_opencv/CMakeLists.txt +0 -0
  260. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/cmake_demo/test_single_opencv/main.cpp +0 -0
  261. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/CMakeLists.txt +0 -0
  262. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/Capture.cpp +0 -0
  263. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/ControlCFW.cpp +0 -0
  264. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/ControlCool.cpp +0 -0
  265. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/ForceStop.cpp +0 -0
  266. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/GetCameraStatus.cpp +0 -0
  267. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/GetHistJPG.cpp +0 -0
  268. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/GetLastImageFIT.cpp +0 -0
  269. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/GetLastImageJPG.cpp +0 -0
  270. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/GetTemperature.cpp +0 -0
  271. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/LiveFrameSample.cpp +0 -0
  272. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/OSXDownloadFirmware2Camera.cpp +0 -0
  273. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/README +0 -0
  274. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/SetTemperature.cpp +0 -0
  275. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/testapp/common/SingleFrameSample.cpp +0 -0
  276. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/local/udev/85-qhyccd.rules +0 -0
  277. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/lib/usr/share/usb/a3load.hex +0 -0
  278. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/pyobs_qhyccd/__init__.py +0 -0
  279. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/pyobs_qhyccd/gui.py +0 -0
  280. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/pyobs_qhyccd/libqhyccd.pxd +0 -0
  281. {pyobs_qhyccd-2.0.0.dev8 → pyobs_qhyccd-2.0.0.dev9}/pyobs_qhyccd/qhyccddriver.pyx +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobs-qhyccd
3
- Version: 2.0.0.dev8
3
+ Version: 2.0.0.dev9
4
4
  Summary: pyobs module for QHYCCD cameras
5
5
  Author-Email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -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
- set_log_level(0)
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
- devices = QHYCCDDriver.list_devices()
71
- self._driver = QHYCCDDriver(devices[0])
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
- if self._driver.is_control_available(Control.CAM_COLOR):
75
- raise ValueError("Color cams are not supported.")
136
+ if self._driver.is_control_available(Control.CONTROL_USBTRAFFIC):
137
+ self._driver.set_param(Control.CONTROL_USBTRAFFIC, 60)
76
138
 
77
- if self._driver.is_control_available(Control.CONTROL_USBTRAFFIC):
78
- self._driver.set_param(Control.CONTROL_USBTRAFFIC, 60)
139
+ if self._driver.is_control_available(Control.CONTROL_GAIN):
140
+ self._driver.set_param(Control.CONTROL_GAIN, 10)
79
141
 
80
- if self._driver.is_control_available(Control.CONTROL_GAIN):
81
- self._driver.set_param(Control.CONTROL_GAIN, 10)
142
+ if self._driver.is_control_available(Control.CONTROL_OFFSET):
143
+ self._driver.set_param(Control.CONTROL_OFFSET, 140)
82
144
 
83
- if self._driver.is_control_available(Control.CONTROL_OFFSET):
84
- self._driver.set_param(Control.CONTROL_OFFSET, 140)
145
+ if self._driver.is_control_available(Control.CONTROL_TRANSFERBIT):
146
+ self._driver.set_bits_mode(16)
85
147
 
86
- if self._driver.is_control_available(Control.CONTROL_TRANSFERBIT):
87
- self._driver.set_bits_mode(16)
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
- chip = self._driver.get_chip_info()
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 = chip[2], chip[3]
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
- gain = float(self._driver.get_param(Control.CONTROL_GAIN))
114
- offset = float(self._driver.get_param(Control.CONTROL_OFFSET))
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
- for key, value in self._params.items():
122
- p = "CONTROL_" + key.upper()
123
- if hasattr(Control, p):
124
- control_param = getattr(Control, p)
125
- log.info("Setting %s to %s.", control_param, value)
126
- self._driver.set_param(control_param, value)
127
-
128
- def _available_binnings(self) -> list[BinningState]:
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
- binnings = []
132
- if self._driver.is_control_available(Control.CAM_BIN1X1MODE):
133
- binnings.append(BinningState(x=1, y=1))
134
- if self._driver.is_control_available(Control.CAM_BIN2X2MODE):
135
- binnings.append(BinningState(x=2, y=2))
136
- if self._driver.is_control_available(Control.CAM_BIN3X3MODE):
137
- binnings.append(BinningState(x=3, y=3))
138
- if self._driver.is_control_available(Control.CAM_BIN4X4MODE):
139
- binnings.append(BinningState(x=4, y=4))
140
- return binnings
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
- eff = self._driver.get_effective_area()
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._driver.expose_single_frame()
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, self._driver.get_single_frame)
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
- return float(self._driver.get_param(Control.CONTROL_CURPWM)) / 255 * 100 # TODO:
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
- if self._cooling_next is not None:
280
- self._driver.set_temperature(self._cooling_next)
281
- self._current_temperature = float(self._driver.get_param(Control.CONTROL_CURTEMP))
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(float(self._driver.get_param(Control.CONTROL_CURPWM)) / 255 * 100)
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=self._driver.is_control_available(Control.CONTROL_COOLER),
398
+ enabled=cooler_available,
295
399
  ),
296
400
  )
297
401
 
298
- # bug: QHY PWM wraps above 250 — back off setpoint
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.set_param(Control.CONTROL_GAIN, gain)
345
- offset = float(self._driver.get_param(Control.CONTROL_OFFSET))
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.set_param(Control.CONTROL_OFFSET, offset)
357
- gain = float(self._driver.get_param(Control.CONTROL_GAIN))
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,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-qhyccd"
3
- version = "2.0.0.dev8"
3
+ version = "2.0.0.dev9"
4
4
  description = "pyobs module for QHYCCD cameras"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11,<3.14"
@@ -1780,7 +1780,7 @@ gui = [
1780
1780
 
1781
1781
  [[package]]
1782
1782
  name = "pyobs-qhyccd"
1783
- version = "2.0.0.dev8"
1783
+ version = "2.0.0.dev9"
1784
1784
  source = { editable = "." }
1785
1785
  dependencies = [
1786
1786
  { name = "astropy" },
@@ -1 +0,0 @@
1
- libqhyccd.so.20
@@ -1 +0,0 @@
1
- libqhyccd.so.25.9.29.10