API
 
Loading...
Searching...
No Matches
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
12typedef 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
26namespace MagAOX
27{
28namespace app
29{
30
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
50void 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
70std::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 */
103class 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
110public:
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
144protected:
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
160 double m_expTime;
161
162 unsigned int channels {1};
165
166 qhyccd_handle *m_camera {nullptr}; ///< The library camera handle
167
168public:
169
170 ///Default c'tor
171 qhyCtrl();
172
173 ///Destructor
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
197 int startAcquisition();
198 int AbortAcquisition();
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
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 */
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
293inline
294qhyCtrl::qhyCtrl() : MagAOXApp(MAGAOX_CURRENT_SHA1, MAGAOX_REPO_MODIFIED)
295{
296 m_powerMgtEnabled = false;
297
298 return;
299}
300
301inline
303{
304 return;
305}
306
307inline
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
320inline
322{
324
325 config(m_serialNumber, "camera.serialNumber");
326 // m_camId = &m_serialNumber[0];
327 for(int i=0; i < 32; ++i){
329 }
330
331 config(m_bits, "camera.bits");
332
334
336}
337
338
339inline
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 {
356 }
357
359 {
361 }
362
364 {
365 return log<software_error,-1>({__FILE__,__LINE__});
366 }
367
369
370 return 0;
371
372}
373
374inline
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
397inline
399{
401
403
404 if(m_camera){
405 // close camera handle
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
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
430inline
432{
433 try {
434 if(m_camera)
436
437 m_camera = nullptr;
439
440 }catch(...){
441 if(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;
468 if(m_retVal != QHYCCD_SUCCESS)
469 {
471 return log<software_error,-1>({__FILE__, __LINE__, "QHYCCD SDK Error from GetStatus: " });
472 }
473
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;
483
484 if(m_retVal != QHYCCD_SUCCESS){
485 // Do error handling
486 }
487
491
493
494 // Only allocate memory if the frame size has changed
496
498
499 if(m_frame_data){
500 delete[] m_frame_data;
501 }
502
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{
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 {
595 // Do error handling
596 }
597 catch(...)
598 {
600 return -1;
601 }
602
603 // if(src == nullptr) return -1;
605
606 return 0;
607}
608
610{
611 return 0;
612}
613
614
615inline
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
637inline
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
662inline
664{
671
672 return 0;
673}
674
675
676inline
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
697inline
699{
700 std::cerr << "checkNextROI!\n";
701 return 0;
702}
703
704inline
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
728inline
733
734inline
736{
737 return recordCamera(true);
738}
739
740
741}//namespace app
742} //namespace MagAOX
743#endif
int16_t pixelT
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.
stateCodes::stateCodeT state()
Get the current state code.
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.
int stateLogged()
Updates and returns the value of m_stateLogged. Will be 0 on first call after a state change,...
static int log(const typename logT::messageT &msg, logPrioT level=logPrio::LOG_DEFAULT)
Make a log entry.
std::mutex m_indiMutex
Mutex for locking INDI communications.
uint32_t m_width
The width of the image, once deinterlaced etc.
int appShutdown()
Shuts down the framegrabber thread.
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.
pcf::IndiProperty m_indiP_roi_y
Property used to set the ROI x center coordinate.
float m_default_x
Power-on ROI center x coordinate.
std::string m_nextMode
The mode to be set by the next reconfiguration.
int m_default_bin_x
Power-on ROI x binning.
int m_default_h
Power-on ROI height.
pcf::IndiProperty m_indiP_roi_h
Property used to set the ROI height.
void setupConfig(mx::app::appConfigurator &config)
Setup the configuration system.
pcf::IndiProperty m_indiP_roi_w
Property used to set the ROI width.
std::string m_modeName
The current mode name.
pcf::IndiProperty m_indiP_roi_bin_x
Property used to set the ROI x binning.
void loadConfig(mx::app::appConfigurator &config)
load the configuration system results
pcf::IndiProperty m_indiP_roi_set
Property used to trigger setting the ROI.
int appShutdown()
Application shutdown.
float m_default_y
Power-on ROI center y coordinate.
pcf::IndiProperty m_indiP_roi_bin_y
Property used to set the ROI y binning.
pcf::IndiProperty m_indiP_roi_x
Property used to set the ROI x center coordinate.
int m_default_bin_y
Power-on ROI y binning.
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
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
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.
@ NODEVICE
No device exists for the application to control.
@ CONFIGURING
The application is configuring the device.
@ ERROR
The application has encountered an error, from which it is recovering (with or without intervention)
@ NOTCONNECTED
The application is not connected to the device or service.
#define INDI_IDLE
Definition indiUtils.hpp:28
#define INDI_OK
Definition indiUtils.hpp:29
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.
int loadConfig(appConfigurator &config)
Load the device section from an application configurator.
int setupConfig(appConfigurator &config)
Setup an application configurator for the device section.
Software CRITICAL log entry.
Software ERR log entry.
Log entry recording stdcam stage specific status.