API
qhyCtrl.hpp
Go to the documentation of this file.
1 /** \file qhyCtrl.hpp
2  * \brief The MagAO-X QHYCCD camera controller.
3  *
4  * \author Sebastiaan Y. Haffert (shaffert@arizona.edu)
5  *
6  * \ingroup qhyCtrl_files
7  */
8 
9 #ifndef qhyCtrl_hpp
10 #define qhyCtrl_hpp
11 
12 typedef uint16_t pixelT;
13 
14 #include <ImageStruct.h>
15 #include <ImageStreamIO.h>
16 
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <string.h>
21 #include "qhyccd.h"
22 
23 #include "../../libMagAOX/libMagAOX.hpp" //Note this is included on command line to trigger pch
24 #include "../../magaox_git_version.h"
25 
26 namespace MagAOX
27 {
28 namespace app
29 {
30 
31 void SDKVersion(){
32  unsigned int YMDS[4];
33  unsigned char sVersion[80];
34 
35  memset ((char *)sVersion, 0x00, sizeof(sVersion));
36  GetQHYCCDSDKVersion(&YMDS[0], &YMDS[1], &YMDS[2], &YMDS[3]);
37 
38  if ((YMDS[1] < 10) && (YMDS[2] < 10)){
39  sprintf((char *)sVersion, "V20%d0%d0%d_%d\n", YMDS[0], YMDS[1], YMDS[2], YMDS[3]);
40  }else if ((YMDS[1] < 10) && (YMDS[2] > 10)){
41  sprintf((char *)sVersion, "V20%d0%d%d_%d\n", YMDS[0], YMDS[1], YMDS[2], YMDS[3]);
42  }else if ((YMDS[1] > 10) && (YMDS[2] < 10)){
43  sprintf((char *)sVersion, "V20%d%d0%d_%d\n", YMDS[0], YMDS[1], YMDS[2], YMDS[3]);
44  }else{
45  sprintf((char *)sVersion, "V20%d%d%d_%d\n", YMDS[0], YMDS[1], YMDS[2], YMDS[3]);
46  }
47  fprintf(stderr, "QHYCCD SDK Version: %s\n", sVersion);
48 }
49 
50 void FirmWareVersion(qhyccd_handle *h)
51 {
52  unsigned char fwv[32], FWInfo[256];
53  unsigned int ret;
54  memset (FWInfo, 0x00, sizeof(FWInfo));
55  ret = GetQHYCCDFWVersion(h, fwv);
56 
57  if(ret == QHYCCD_SUCCESS){
58  if((fwv[0] >> 4) <= 9){
59  sprintf((char *)FWInfo, "Firmware version:20%d_%d_%d\n", ((fwv[0] >> 4) + 0x10), (fwv[0]&~0xf0),fwv[1]);
60  }else{
61  sprintf((char *)FWInfo, "Firmware version:20%d_%d_%d\n", (fwv[0] >> 4), (fwv[0]&~0xf0), fwv[1]);
62  }
63  }else{
64  sprintf((char *)FWInfo,"Firmware version:Not Found!\n");
65  }
66 
67  fprintf(stderr,"%s\n", FWInfo);
68 }
69 
70 std::string qhyccdSDKErrorName(CONTROL_ID error)
71 {
72  /*
73  Fill and complete error messages.
74  */
75 
76  switch(error)
77  {
78  case QHYCCD_SUCCESS:
79  return "QHT_SUCCES";
80  default:
81  return "UNKNOWN: " + std::to_string(error);
82  }
83 }
84 
85 /** \defgroup qhyCtrl QHYCCD USB3 Camera
86  * \brief Control of a QHYCCD USB3 Camera
87  *
88  * <a href="../handbook/operating/software/apps/qhyCtrl.html">Application Documentation</a>
89  *
90  * \ingroup apps
91  *
92  */
93 
94 /** \defgroup qhyCtrl_files QHYCCD USB3 Camera Files
95  * \ingroup qhyCtrl
96  */
97 
98 /** MagAO-X application to control a QHYCCD USB3 Camera
99  *
100  * \ingroup qhyCtrl
101  *
102  */
103 class qhyCtrl : public MagAOXApp<>, public dev::stdCamera<qhyCtrl>, public dev::frameGrabber<qhyCtrl>, public dev::telemeter<qhyCtrl>
104 {
105 
106  friend class dev::stdCamera<qhyCtrl>;
107  friend class dev::frameGrabber<qhyCtrl>;
108  friend class dev::telemeter<qhyCtrl>;
109 
110 public:
111  /** \name app::dev Configurations
112  *@{
113  */
114  static constexpr bool c_stdCamera_tempControl = true; ///< app::dev config to tell stdCamera to not expose temperature controls
115 
116  static constexpr bool c_stdCamera_temp = true; ///< app::dev config to tell stdCamera to expose temperature
117 
118  static constexpr bool c_stdCamera_readoutSpeed = false; ///< app::dev config to tell stdCamera not to expose readout speed controls
119 
120  static constexpr bool c_stdCamera_vShiftSpeed = false; ///< app:dev config to tell stdCamera not to expose vertical shift speed control
121 
122  static constexpr bool c_stdCamera_emGain = false; ///< app::dev config to tell stdCamera to not expose EM gain controls
123 
124  static constexpr bool c_stdCamera_exptimeCtrl = true; ///< app::dev config to tell stdCamera to expose exposure time controls
125 
126  static constexpr bool c_stdCamera_fpsCtrl = false; ///< app::dev config to tell stdCamera to expose FPS controls
127 
128  static constexpr bool c_stdCamera_fps = false; ///< app::dev config to tell stdCamera not to expose FPS status (ignored since fpsCtrl=true)
129 
130  static constexpr bool c_stdCamera_usesModes = false; ///< app:dev config to tell stdCamera not to expose mode controls
131 
132  static constexpr bool c_stdCamera_usesROI = false; ///< app:dev config to tell stdCamera to expose ROI controls
133 
134  static constexpr bool c_stdCamera_cropMode = false; ///< app:dev config to tell stdCamera not to expose Crop Mode controls
135 
136  static constexpr bool c_stdCamera_hasShutter = false; ///< app:dev config to tell stdCamera to expose shutter controls
137 
138  static constexpr bool c_stdCamera_usesStateString = false; ///< app::dev confg to tell stdCamera to expose the state string property
139 
140  static constexpr bool c_frameGrabber_flippable = false; ///< app:dev config to tell framegrabber that this camera can be flipped
141 
142  ///@}
143 
144 protected:
145 
146  /** \name configurable parameters
147  *@{
148  */
149 
150  std::string m_serialNumber; ///< The camera's identifying serial number
151  char m_camId[32]; ///< The camera's ID
152  uint32_t m_bits {16}; ///< The number of bits used by the camera.
153 
154  ///@}
155 
156  unsigned int m_retVal {0}; ///< Return code for QHYCCD cameras
157  double m_ccdTemp;
158 
159  double m_expTimeSet;
160  double m_expTime;
161 
162  unsigned int channels {1};
163  uint32_t m_frame_length;
164  uint8_t * m_frame_data;
165 
166  qhyccd_handle *m_camera {nullptr}; ///< The library camera handle
167 
168 public:
169 
170  ///Default c'tor
171  qhyCtrl();
172 
173  ///Destructor
174  ~qhyCtrl() noexcept;
175 
176  /// Setup the configuration system (called by MagAOXApp::setup())
177  virtual void setupConfig();
178 
179  /// load the configuration system results (called by MagAOXApp::setup())
180  virtual void loadConfig();
181 
182  /// Startup functions
183  /** Sets up the INDI vars.
184  *
185  */
186  virtual int appStartup();
187 
188  /// Implementation of the FSM for the Siglent SDG
189  virtual int appLogic();
190 
191  /// Do any needed shutdown tasks. Currently nothing in this app.
192  virtual int appShutdown();
193 
194  int connect();
195 
196  int configureAcquisition();
197  int startAcquisition();
198  int AbortAcquisition();
199  int acquireAndCheckValid();
200  int loadImageIntoStream(void * dest);
201  int reconfig();
202  /*
203 * The derived class must implement:
204  * \code
205  * int powerOnDefaults(); // called on power-on after powerOnWaitElapsed has occurred.
206  * \endcode
207  *
208  * Calls to this class's `setupConfig`, `loadConfig`, `appStartup`, `appLogic`, `appShutdown`
209  * `onPowerOff`, and `whilePowerOff`, must be placed in the derived class's functions of the same name.
210  */
211 
212 protected:
213 
214  /// Get the current detector temperature
215  /**
216  * \returns 0 on success
217  * \returns -1 on an error.
218  */
219  int getTemp();
220 
221  /// Set the CCD temperature setpoint [stdCamera interface].
222  /** Sets the temperature to m_ccdTempSetpt.
223  * \returns 0 on success
224  * \returns -1 on error
225  */
226  int setTempSetPt(){};
227 
228  /// Get the current exposure time
229  /**
230  * \returns 0 on success
231  * \returns -1 on an error.
232  */
233  int getExpTime();
234 
235  /// Get the current framerate
236  /**
237  * \returns 0 on success
238  * \returns -1 on an error.
239  */
240  int getFPS(){return 1/m_expTime;};
241 
242  float fps(){return m_fps;};
243 
244  /** \name stdCamera Interface
245  *
246  * @{
247  */
248 
249  /// Set defaults for a power on state.
250  /**
251  * \returns 0 on success
252  * \returns -1 on error
253  */
254  int powerOnDefaults();
255 
256 
257  /// Set the Exposure Time. [stdCamera interface]
258  /** Sets the frame rate to m_expTimeSet.
259  *
260  * \returns 0 on success
261  * \returns -1 on error
262  */
263  int setExpTime();
264 
265  /// Check the next ROI
266  /** Checks if the target values are valid and adjusts them to the closest valid values if needed.
267  *
268  * \returns 0 always
269  */
270  int checkNextROI();
271 
272  /// Set the next ROI
273  /**
274  * \returns 0 always
275  */
276  int setNextROI();
277 
278  ///@}
279 
280  /** \name Telemeter Interface
281  *
282  * @{
283  */
284 
285  int checkRecordTimes();
286 
287  int recordTelem( const telem_stdcam * );
288 
289  ///@}
290 
291 };
292 
293 inline
294 qhyCtrl::qhyCtrl() : MagAOXApp(MAGAOX_CURRENT_SHA1, MAGAOX_REPO_MODIFIED)
295 {
296  m_powerMgtEnabled = false;
297 
298  return;
299 }
300 
301 inline
303 {
304  return;
305 }
306 
307 inline
309 {
311 
313 
314  config.add("camera.serialNumber", "", "camera.serialNumber", argType::Required, "camera", "serialNumber", false, "string", "The identifying serial number of the camera.");
315  config.add("camera.bits", "", "camera.bits", argType::Required, "camera", "bits", false, "int", "The number of bits used by the camera. Default is 16.");
316 
318 }
319 
320 inline
322 {
324 
325  config(m_serialNumber, "camera.serialNumber");
326  // m_camId = &m_serialNumber[0];
327  for(int i=0; i < 32; ++i){
328  m_camId[i] = m_serialNumber[i];
329  }
330 
331  config(m_bits, "camera.bits");
332 
334 
336 }
337 
338 
339 inline
341 {
342 
343  //=================================
344  // Do camera configuration here
345  unsigned int m_retVal = InitQHYCCDResource();
346  if (QHYCCD_SUCCESS == m_retVal){
347  printf("SDK resources initialized.\n");
348  }else{
349  printf("Cannot initialize SDK resources, error: %d\n", m_retVal);
350  return 1;
351  }
352 
354  {
355  return log<software_critical,-1>({__FILE__,__LINE__});
356  }
357 
359  {
360  return log<software_critical,-1>({__FILE__,__LINE__});
361  }
362 
364  {
365  return log<software_error,-1>({__FILE__,__LINE__});
366  }
367 
369 
370  return 0;
371 
372 }
373 
374 inline
376 {
377  //and run stdCamera's appLogic
379  {
380  return log<software_error, -1>({__FILE__, __LINE__});
381  }
382 
383  //and run frameGrabber's appLogic to see if the f.g. thread has exited.
385  {
386  return log<software_error, -1>({__FILE__, __LINE__});
387  }
388 
389 
390  ///\todo Fall through check?
391 
392  return 0;
393 
394 }
395 
396 
397 inline
399 {
401 
403 
404  if(m_camera){
405  // close camera handle
406  m_retVal = CloseQHYCCD(m_camera);
407  if (QHYCCD_SUCCESS == m_retVal){
408  printf("Close QHYCCD success.\n");
409  }else{
410  printf("Close QHYCCD failure, error: %d\n", m_retVal);
411  }
412  }
413 
414  // release sdk resources
415  m_retVal = ReleaseQHYCCDResource();
416  if (QHYCCD_SUCCESS == m_retVal){
417  printf("SDK resources released.\n");
418  }else{
419  printf("Cannot release SDK resources, error %d.\n", m_retVal);
420  return 1;
421  }
422 
423 
425 
426  return 0;
427 }
428 
429 
430 inline
432 {
433  try {
434  if(m_camera)
435  m_retVal = CloseQHYCCD(m_camera);
436 
437  m_camera = nullptr;
438  m_camera = OpenQHYCCD(m_camId);
439 
440  }catch(...){
441  if(m_camera)
442  m_retVal = CloseQHYCCD(m_camera);
443  m_camera = nullptr;
444 
446  if(!stateLogged())
447  log<text_log>("no camera with serial number " + m_serialNumber + " found.");
448 
449  return 0;
450  }
451 
452  return 0;
453 }
454 
455 
457 {
458  if(!m_camera) return -1;
459 
460  /*
461  Setup m_frame_data here!
462  */
463  //lock mutex
464  std::unique_lock<std::mutex> lock(m_indiMutex);
465 
466  uint8_t buf;
467  m_retVal = GetQHYCCDCameraStatus(&m_camera, &buf);
468  if(m_retVal != QHYCCD_SUCCESS)
469  {
471  return log<software_error,-1>({__FILE__, __LINE__, "QHYCCD SDK Error from GetStatus: " });
472  }
473 
474  m_retVal = SetQHYCCDBinMode(&m_camera, m_nextROI.bin_x, m_nextROI.bin_y);
475  if(m_retVal != QHYCCD_SUCCESS){
476  // Do error handling
477  }
478 
479  //QHYCCD expects the top left corner as starting point
480  int x0 = (m_nextROI.x - 0.5 * (m_nextROI.w - 1)) + 1;
481  int y0 = (m_nextROI.y - 0.5 * (m_nextROI.h - 1)) + 1;
482  m_retVal = SetQHYCCDResolution(&m_camera, x0, y0, m_nextROI.w, m_nextROI.h);
483 
484  if(m_retVal != QHYCCD_SUCCESS){
485  // Do error handling
486  }
487 
488  m_width = m_currentROI.w;
490  m_dataType = _DATATYPE_INT16;
491 
492  uint32_t new_frame_length = GetQHYCCDMemLength(&m_camera);
493 
494  // Only allocate memory if the frame size has changed
495  if(new_frame_length != m_frame_length){
496 
497  m_frame_length = new_frame_length;
498 
499  if(m_frame_data){
500  delete[] m_frame_data;
501  }
502 
503  m_frame_data = new uint8_t[m_frame_length];
504 
505  }
506 
507  //Update binning
514 
521 
522  getFPS();
523 
524  recordCamera(true);
525 
526  return 0;
527 }
528 
530 {
531 
532  try
533  {
534  //m_camera->StartGrabbing(GrabStrategy_LatestImageOnly); // Start grabbing, and always grab just the last image.
535  }
536  catch(...)
537  {
539  return -1;
540  }
541 
543 
544  return 0;
545 }
546 
548 {
549  m_retVal = CancelQHYCCDExposing(&m_camera);
550  if(m_retVal != QHYCCD_SUCCESS){
551  // Error handling
552  }
553 
554  // Call readout image
555 
556  return 0;
557 }
558 
560 {
561  try
562  {
563  // m_camera->RetrieveResult(1000, ptrGrabResult, TimeoutHandling_ThrowException);
564  }
565  catch(...)
566  {
568  return -1;
569  }
570 
571  /*
572  if (ptrGrabResult->GrabSucceeded()) // If image is grabbed successfully
573  {
574  clock_gettime(CLOCK_REALTIME, &m_currImageTimestamp);
575  return 0;
576  }
577  else
578  {
579  state(stateCodes::NOTCONNECTED);
580  return -1;
581  }
582  */
583 
584 }
585 
586 
588 {
589  // pixelT * src = nullptr;
590  // src = (pixelT *) ptrGrabResult->GetBuffer();
591 
592  try
593  {
594  m_retVal = GetQHYCCDSingleFrame(m_camera, &m_width, &m_height, &m_bits, &channels, m_frame_data);
595  // Do error handling
596  }
597  catch(...)
598  {
600  return -1;
601  }
602 
603  // if(src == nullptr) return -1;
604  if( frameGrabber<qhyCtrl>::loadImageIntoStreamCopy(dest, m_frame_data, m_width, m_height, sizeof(pixelT)) == nullptr) return -1;
605 
606  return 0;
607 }
608 
610 {
611  return 0;
612 }
613 
614 
615 inline
617 {
618  if( m_camera == nullptr) return 0;
619 
620  try
621  {
622  m_ccdTemp = GetQHYCCDParam(&m_camera, CONTROL_CURTEMP);
623  recordCamera();
624  }
625  catch(...)
626  {
627  m_ccdTemp = -999;
628  recordCamera();
630  return -1;
631  }
632 
633  return 0;
634 
635 }
636 
637 inline
639 {
640  if( m_camera == nullptr) return 0;
641 
642  try
643  {
644  m_expTime = GetQHYCCDParam(&m_camera, CONTROL_EXPOSURE); // returns exposure time in us.
645  m_expTime /= 1e6; // divide by 1e6 to get exposure time in seconds
646 
647  recordCamera();
648  }
649  catch(...)
650  {
651  m_expTime = -999;
652  recordCamera();
654  return -1;
655  }
656 
657  return 0;
658 
659 }
660 
661 
662 inline
664 {
669  m_nextROI.bin_x = m_default_bin_x;
670  m_nextROI.bin_y = m_default_bin_y;
671 
672  return 0;
673 }
674 
675 
676 inline
678 {
679  if( m_camera == nullptr) return 0;
680 
681  try
682  {
683  recordCamera(true);
684  m_retVal = SetQHYCCDParam(m_camera, CONTROL_EXPOSURE, m_expTimeSet * 1e6);
685  }
686  catch(...)
687  {
688  log<software_error>({__FILE__, __LINE__, "Error setting exposure time"});
689  return -1;
690  }
691 
692  log<text_log>( "Set exposure time: " + std::to_string(m_expTimeSet) + " sec");
693 
694  return 0;
695 }
696 
697 inline
699 {
700  std::cerr << "checkNextROI!\n";
701  return 0;
702 }
703 
704 inline
706 {
707 
708  std::cerr << "setNextROI:\n";
709  std::cerr << " m_nextROI.x = " << m_nextROI.x << "\n";
710  std::cerr << " m_nextROI.y = " << m_nextROI.y << "\n";
711  std::cerr << " m_nextROI.w = " << m_nextROI.w << "\n";
712  std::cerr << " m_nextROI.h = " << m_nextROI.h << "\n";
713  std::cerr << " m_nextROI.bin_x = " << m_nextROI.bin_x << "\n";
714  std::cerr << " m_nextROI.bin_y = " << m_nextROI.bin_y << "\n";
715 
716  recordCamera(true);
719 
721  m_reconfig = true;
722 
723  updateSwitchIfChanged(m_indiP_roi_set, "request", pcf::IndiElement::Off, INDI_IDLE);
724 
725  return 0;
726 }
727 
728 inline
730 {
732 }
733 
734 inline
736 {
737  return recordCamera(true);
738 }
739 
740 
741 }//namespace app
742 } //namespace MagAOX
743 #endif
int16_t pixelT
Definition: baslerCtrl.hpp:22
The base-class for MagAO-X applications.
Definition: MagAOXApp.hpp:73
void updateIfChanged(pcf::IndiProperty &p, const std::string &el, const T &newVal, pcf::IndiProperty::PropertyStateType ipState=pcf::IndiProperty::Ok)
Update an INDI property element value if it has changed.
Definition: MagAOXApp.hpp:3120
stateCodes::stateCodeT state()
Get the current state code.
Definition: MagAOXApp.hpp:2297
void updateSwitchIfChanged(pcf::IndiProperty &p, const std::string &el, const pcf::IndiElement::SwitchStateType &newVal, pcf::IndiProperty::PropertyStateType ipState=pcf::IndiProperty::Ok)
Update an INDI switch element value if it has changed.
Definition: MagAOXApp.hpp:3144
int stateLogged()
Updates and returns the value of m_stateLogged. Will be 0 on first call after a state change,...
Definition: MagAOXApp.hpp:2361
static int log(const typename logT::messageT &msg, logPrioT level=logPrio::LOG_DEFAULT)
Make a log entry.
Definition: MagAOXApp.hpp:1804
std::mutex m_indiMutex
Mutex for locking INDI communications.
Definition: MagAOXApp.hpp:545
uint32_t m_width
The width of the image, once deinterlaced etc.
int appShutdown()
Shuts down the framegrabber thread.
void * loadImageIntoStreamCopy(void *dest, void *src, size_t width, size_t height, size_t szof)
int loadConfig(mx::app::appConfigurator &config)
load the configuration system results
uint8_t m_dataType
The ImageStreamIO type code.
bool m_reconfig
Flag to set if a camera reconfiguration requires a framegrabber reset.
uint32_t m_height
The height of the image, once deinterlaced etc.
int setupConfig(mx::app::appConfigurator &config)
Setup the configuration system.
MagAO-X standard camera interface.
Definition: stdCamera.hpp:287
pcf::IndiProperty m_indiP_roi_y
Property used to set the ROI x center coordinate.
Definition: stdCamera.hpp:470
float m_default_x
Power-on ROI center x coordinate.
Definition: stdCamera.hpp:450
std::string m_nextMode
The mode to be set by the next reconfiguration.
Definition: stdCamera.hpp:400
int m_default_bin_x
Power-on ROI x binning.
Definition: stdCamera.hpp:454
int m_default_w
Power-on ROI width.
Definition: stdCamera.hpp:452
int m_default_h
Power-on ROI height.
Definition: stdCamera.hpp:453
pcf::IndiProperty m_indiP_roi_h
Property used to set the ROI height.
Definition: stdCamera.hpp:472
void setupConfig(mx::app::appConfigurator &config)
Setup the configuration system.
Definition: stdCamera.hpp:1035
pcf::IndiProperty m_indiP_roi_w
Property used to set the ROI width.
Definition: stdCamera.hpp:471
std::string m_modeName
The current mode name.
Definition: stdCamera.hpp:398
pcf::IndiProperty m_indiP_roi_bin_x
Property used to set the ROI x binning.
Definition: stdCamera.hpp:473
void loadConfig(mx::app::appConfigurator &config)
load the configuration system results
Definition: stdCamera.hpp:1074
pcf::IndiProperty m_indiP_roi_set
Property used to trigger setting the ROI.
Definition: stdCamera.hpp:480
int appShutdown()
Application shutdown.
Definition: stdCamera.hpp:1742
float m_default_y
Power-on ROI center y coordinate.
Definition: stdCamera.hpp:451
pcf::IndiProperty m_indiP_roi_bin_y
Property used to set the ROI y binning.
Definition: stdCamera.hpp:474
pcf::IndiProperty m_indiP_roi_x
Property used to set the ROI x center coordinate.
Definition: stdCamera.hpp:469
int m_default_bin_y
Power-on ROI y binning.
Definition: stdCamera.hpp:455
static constexpr bool c_stdCamera_fps
app::dev config to tell stdCamera not to expose FPS status (ignored since fpsCtrl=true)
Definition: qhyCtrl.hpp:128
static constexpr bool c_stdCamera_usesStateString
app::dev confg to tell stdCamera to expose the state string property
Definition: qhyCtrl.hpp:138
int checkNextROI()
Check the next ROI.
Definition: qhyCtrl.hpp:698
int powerOnDefaults()
Set defaults for a power on state.
Definition: qhyCtrl.hpp:663
int setNextROI()
Set the next ROI.
Definition: qhyCtrl.hpp:705
~qhyCtrl() noexcept
Destructor.
Definition: qhyCtrl.hpp:302
int configureAcquisition()
Definition: qhyCtrl.hpp:456
qhyccd_handle * m_camera
The library camera handle.
Definition: qhyCtrl.hpp:166
unsigned int m_retVal
Return code for QHYCCD cameras.
Definition: qhyCtrl.hpp:156
static constexpr bool c_stdCamera_usesModes
app:dev config to tell stdCamera not to expose mode controls
Definition: qhyCtrl.hpp:130
qhyCtrl()
Default c'tor.
Definition: qhyCtrl.hpp:294
static constexpr bool c_stdCamera_exptimeCtrl
app::dev config to tell stdCamera to expose exposure time controls
Definition: qhyCtrl.hpp:124
static constexpr bool c_stdCamera_cropMode
app:dev config to tell stdCamera not to expose Crop Mode controls
Definition: qhyCtrl.hpp:134
static constexpr bool c_frameGrabber_flippable
app:dev config to tell framegrabber that this camera can be flipped
Definition: qhyCtrl.hpp:140
int setExpTime()
Set the Exposure Time. [stdCamera interface].
Definition: qhyCtrl.hpp:677
int loadImageIntoStream(void *dest)
Definition: qhyCtrl.hpp:587
static constexpr bool c_stdCamera_tempControl
app::dev config to tell stdCamera to not expose temperature controls
Definition: qhyCtrl.hpp:114
uint32_t m_frame_length
Definition: qhyCtrl.hpp:163
static constexpr bool c_stdCamera_fpsCtrl
app::dev config to tell stdCamera to expose FPS controls
Definition: qhyCtrl.hpp:126
static constexpr bool c_stdCamera_vShiftSpeed
app:dev config to tell stdCamera not to expose vertical shift speed control
Definition: qhyCtrl.hpp:120
int setTempSetPt()
Set the CCD temperature setpoint [stdCamera interface].
Definition: qhyCtrl.hpp:226
static constexpr bool c_stdCamera_emGain
app::dev config to tell stdCamera to not expose EM gain controls
Definition: qhyCtrl.hpp:122
virtual int appStartup()
Startup functions.
Definition: qhyCtrl.hpp:340
static constexpr bool c_stdCamera_temp
app::dev config to tell stdCamera to expose temperature
Definition: qhyCtrl.hpp:116
char m_camId[32]
The camera's ID.
Definition: qhyCtrl.hpp:151
int getTemp()
Get the current detector temperature.
Definition: qhyCtrl.hpp:616
int getExpTime()
Get the current exposure time.
Definition: qhyCtrl.hpp:638
unsigned int channels
Definition: qhyCtrl.hpp:162
int acquireAndCheckValid()
Definition: qhyCtrl.hpp:559
uint32_t m_bits
The number of bits used by the camera.
Definition: qhyCtrl.hpp:152
static constexpr bool c_stdCamera_readoutSpeed
app::dev config to tell stdCamera not to expose readout speed controls
Definition: qhyCtrl.hpp:118
virtual int appShutdown()
Do any needed shutdown tasks. Currently nothing in this app.
Definition: qhyCtrl.hpp:398
virtual int appLogic()
Implementation of the FSM for the Siglent SDG.
Definition: qhyCtrl.hpp:375
int recordTelem(const telem_stdcam *)
Definition: qhyCtrl.hpp:735
static constexpr bool c_stdCamera_hasShutter
app:dev config to tell stdCamera to expose shutter controls
Definition: qhyCtrl.hpp:136
static constexpr bool c_stdCamera_usesROI
app:dev config to tell stdCamera to expose ROI controls
Definition: qhyCtrl.hpp:132
virtual void setupConfig()
Setup the configuration system (called by MagAOXApp::setup())
Definition: qhyCtrl.hpp:308
uint8_t * m_frame_data
Definition: qhyCtrl.hpp:164
virtual void loadConfig()
load the configuration system results (called by MagAOXApp::setup())
Definition: qhyCtrl.hpp:321
std::string m_serialNumber
The camera's identifying serial number.
Definition: qhyCtrl.hpp:150
int getFPS()
Get the current framerate.
Definition: qhyCtrl.hpp:240
@ OPERATING
The device is operating, other than homing.
Definition: stateCodes.hpp:55
@ NODEVICE
No device exists for the application to control.
Definition: stateCodes.hpp:46
@ CONFIGURING
The application is configuring the device.
Definition: stateCodes.hpp:52
@ ERROR
The application has encountered an error, from which it is recovering (with or without intervention)
Definition: stateCodes.hpp:43
@ NOTCONNECTED
The application is not connected to the device or service.
Definition: stateCodes.hpp:49
#define INDI_IDLE
Definition: indiUtils.hpp:28
#define INDI_OK
Definition: indiUtils.hpp:29
std::ostream & cerr()
void SDKVersion()
Definition: qhyCtrl.hpp:31
std::string qhyccdSDKErrorName(CONTROL_ID error)
Definition: qhyCtrl.hpp:70
std::unique_lock< std::mutex > lock(m_indiMutex)
void FirmWareVersion(qhyccd_handle *h)
Definition: qhyCtrl.hpp:50
Definition: dm.hpp:24
uint16_t pixelT
Definition: qhyCtrl.hpp:12
A device base class which saves telemetry.
Definition: telemeter.hpp:69
int appShutdown()
Perform telemeter application shutdown.
Definition: telemeter.hpp:274
int loadConfig(appConfigurator &config)
Load the device section from an application configurator.
Definition: telemeter.hpp:223
int setupConfig(appConfigurator &config)
Setup an application configurator for the device section.
Definition: telemeter.hpp:211
int checkRecordTimes(const telT &tel, telTs... tels)
Check the time of the last record for each telemetry type and make an entry if needed.
Definition: telemeter.hpp:281
Software CRITICAL log entry.
Software ERR log entry.
Log entry recording stdcam stage specific status.