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 static constexpr bool c_stdCamera_fanSpeed = false; ///< app::dev config to tell stdCamera not to expose fan-speed control
122
123 static constexpr bool c_stdCamera_emGain = false; ///< app::dev config to tell stdCamera to not expose EM gain controls
124
125 static constexpr bool c_stdCamera_exptimeCtrl = true; ///< app::dev config to tell stdCamera to expose exposure time controls
126
127 static constexpr bool c_stdCamera_fpsCtrl = false; ///< app::dev config to tell stdCamera to expose FPS controls
128
129 static constexpr bool c_stdCamera_fps = false; ///< app::dev config to tell stdCamera not to expose FPS status (ignored since fpsCtrl=true)
130
131 static constexpr bool c_stdCamera_usesModes = false; ///< app:dev config to tell stdCamera not to expose mode controls
132
133 static constexpr bool c_stdCamera_usesROI = false; ///< app:dev config to tell stdCamera to expose ROI controls
134
135 static constexpr bool c_stdCamera_cropMode = false; ///< app:dev config to tell stdCamera not to expose Crop Mode controls
136
137 static constexpr bool c_stdCamera_hasShutter = false; ///< app:dev config to tell stdCamera to expose shutter controls
138
139 static constexpr bool c_stdCamera_usesStateString = false; ///< app::dev confg to tell stdCamera to expose the state string property
140
141 static constexpr bool c_frameGrabber_flippable = false; ///< app:dev config to tell framegrabber that this camera can be flipped
142
143 ///@}
144
145protected:
146
147 /** \name configurable parameters
148 *@{
149 */
150
151 std::string m_serialNumber; ///< The camera's identifying serial number
152 char m_camId[32]; ///< The camera's ID
153 uint32_t m_bits {16}; ///< The number of bits used by the camera.
154
155 ///@}
156
157 unsigned int m_retVal {0}; ///< Return code for QHYCCD cameras
158 double m_ccdTemp;
159
161 double m_expTime;
162
163 unsigned int channels {1};
166
167 qhyccd_handle *m_camera {nullptr}; ///< The library camera handle
168
169public:
170
171 ///Default c'tor
172 qhyCtrl();
173
174 ///Destructor
176
177 /// Setup the configuration system (called by MagAOXApp::setup())
178 virtual void setupConfig();
179
180 /// load the configuration system results (called by MagAOXApp::setup())
181 virtual void loadConfig();
182
183 /// Startup functions
184 /** Sets up the INDI vars.
185 *
186 */
187 virtual int appStartup();
188
189 /// Implementation of the FSM for the Siglent SDG
190 virtual int appLogic();
191
192 /// Do any needed shutdown tasks. Currently nothing in this app.
193 virtual int appShutdown();
194
195 int connect();
196
198 int startAcquisition();
199 int AbortAcquisition();
201 int loadImageIntoStream(void * dest);
202 int reconfig();
203 /*
204* The derived class must implement:
205 * \code
206 * int powerOnDefaults(); // called on power-on after powerOnWaitElapsed has occurred.
207 * \endcode
208 *
209 * Calls to this class's `setupConfig`, `loadConfig`, `appStartup`, `appLogic`, `appShutdown`
210 * `onPowerOff`, and `whilePowerOff`, must be placed in the derived class's functions of the same name.
211 */
212
214
215 /// Get the current detector temperature
216 /**
217 * \returns 0 on success
218 * \returns -1 on an error.
219 */
220 int getTemp();
221
222 /// Set the CCD temperature setpoint [stdCamera interface].
223 /** Sets the temperature to m_ccdTempSetpt.
224 * \returns 0 on success
225 * \returns -1 on error
226 */
228
229 /// Get the current exposure time
230 /**
231 * \returns 0 on success
232 * \returns -1 on an error.
233 */
234 int getExpTime();
235
236 /// Get the current framerate
237 /**
238 * \returns 0 on success
239 * \returns -1 on an error.
240 */
241 int getFPS(){return 1/m_expTime;};
242
243 float fps(){return m_fps;};
244
245 /** \name stdCamera Interface
246 *
247 * @{
248 */
249
250 /// Set defaults for a power on state.
251 /**
252 * \returns 0 on success
253 * \returns -1 on error
254 */
255 int powerOnDefaults();
256
257
258 /// Set the Exposure Time. [stdCamera interface]
259 /** Sets the frame rate to m_expTimeSet.
260 *
261 * \returns 0 on success
262 * \returns -1 on error
263 */
264 int setExpTime();
265
266 /// Check the next ROI
267 /** Checks if the target values are valid and adjusts them to the closest valid values if needed.
268 *
269 * \returns 0 always
270 */
271 int checkNextROI();
272
273 /// Set the next ROI
274 /**
275 * \returns 0 always
276 */
277 int setNextROI();
278
279 ///@}
280
281 /** \name Telemeter Interface
282 *
283 * @{
284 */
285
286 int checkRecordTimes();
287
288 int recordTelem( const telem_stdcam * );
289
290 ///@}
291
292};
293
294inline
295qhyCtrl::qhyCtrl() : MagAOXApp(MAGAOX_CURRENT_SHA1, MAGAOX_REPO_MODIFIED)
296{
297 m_powerMgtEnabled = false;
298
299 return;
300}
301
302inline
304{
305 return;
306}
307
308inline
310{
312
314
315 config.add("camera.serialNumber", "", "camera.serialNumber", argType::Required, "camera", "serialNumber", false, "string", "The identifying serial number of the camera.");
316 config.add("camera.bits", "", "camera.bits", argType::Required, "camera", "bits", false, "int", "The number of bits used by the camera. Default is 16.");
317
319}
320
321inline
323{
325
326 config(m_serialNumber, "camera.serialNumber");
327 // m_camId = &m_serialNumber[0];
328 for(int i=0; i < 32; ++i){
330 }
331
332 config(m_bits, "camera.bits");
333
335
337}
338
339
340inline
342{
343
344 //=================================
345 // Do camera configuration here
346 unsigned int m_retVal = InitQHYCCDResource();
347 if (QHYCCD_SUCCESS == m_retVal){
348 printf("SDK resources initialized.\n");
349 }else{
350 printf("Cannot initialize SDK resources, error: %d\n", m_retVal);
351 return 1;
352 }
353
355 {
357 }
358
360 {
362 }
363
365 {
366 return log<software_error,-1>({__FILE__,__LINE__});
367 }
368
370
371 return 0;
372
373}
374
375inline
377{
378 //and run stdCamera's appLogic
380 {
381 return log<software_error, -1>({__FILE__, __LINE__});
382 }
383
384 //and run frameGrabber's appLogic to see if the f.g. thread has exited.
386 {
387 return log<software_error, -1>({__FILE__, __LINE__});
388 }
389
390
391 ///\todo Fall through check?
392
393 return 0;
394
395}
396
397
398inline
400{
402
404
405 if(m_camera){
406 // close camera handle
408 if (QHYCCD_SUCCESS == m_retVal){
409 printf("Close QHYCCD success.\n");
410 }else{
411 printf("Close QHYCCD failure, error: %d\n", m_retVal);
412 }
413 }
414
415 // release sdk resources
417 if (QHYCCD_SUCCESS == m_retVal){
418 printf("SDK resources released.\n");
419 }else{
420 printf("Cannot release SDK resources, error %d.\n", m_retVal);
421 return 1;
422 }
423
424
426
427 return 0;
428}
429
430
431inline
433{
434 try {
435 if(m_camera)
437
438 m_camera = nullptr;
440
441 }catch(...){
442 if(m_camera)
444 m_camera = nullptr;
445
447 if(!stateLogged())
448 log<text_log>("no camera with serial number " + m_serialNumber + " found.");
449
450 return 0;
451 }
452
453 return 0;
454}
455
456
458{
459 if(!m_camera) return -1;
460
461 /*
462 Setup m_frame_data here!
463 */
464 //lock mutex
465 std::unique_lock<std::mutex> lock(m_indiMutex);
466
467 uint8_t buf;
469 if(m_retVal != QHYCCD_SUCCESS)
470 {
472 return log<software_error,-1>({__FILE__, __LINE__, "QHYCCD SDK Error from GetStatus: " });
473 }
474
476 if(m_retVal != QHYCCD_SUCCESS){
477 // Do error handling
478 }
479
480 //QHYCCD expects the top left corner as starting point
481 int x0 = (m_nextROI.x - 0.5 * (m_nextROI.w - 1)) + 1;
482 int y0 = (m_nextROI.y - 0.5 * (m_nextROI.h - 1)) + 1;
484
485 if(m_retVal != QHYCCD_SUCCESS){
486 // Do error handling
487 }
488
492
494
495 // Only allocate memory if the frame size has changed
497
499
500 if(m_frame_data){
501 delete[] m_frame_data;
502 }
503
505
506 }
507
508 //Update binning
515
522
523 getFPS();
524
525 recordCamera(true);
526
527 return 0;
528}
529
531{
532
533 try
534 {
535 //m_camera->StartGrabbing(GrabStrategy_LatestImageOnly); // Start grabbing, and always grab just the last image.
536 }
537 catch(...)
538 {
540 return -1;
541 }
542
544
545 return 0;
546}
547
549{
551 if(m_retVal != QHYCCD_SUCCESS){
552 // Error handling
553 }
554
555 // Call readout image
556
557 return 0;
558}
559
561{
562 try
563 {
564 // m_camera->RetrieveResult(1000, ptrGrabResult, TimeoutHandling_ThrowException);
565 }
566 catch(...)
567 {
569 return -1;
570 }
571
572 /*
573 if (ptrGrabResult->GrabSucceeded()) // If image is grabbed successfully
574 {
575 clock_gettime(CLOCK_REALTIME, &m_currImageTimestamp);
576 return 0;
577 }
578 else
579 {
580 state(stateCodes::NOTCONNECTED);
581 return -1;
582 }
583 */
584
585}
586
587
589{
590 // pixelT * src = nullptr;
591 // src = (pixelT *) ptrGrabResult->GetBuffer();
592
593 try
594 {
596 // Do error handling
597 }
598 catch(...)
599 {
601 return -1;
602 }
603
604 // if(src == nullptr) return -1;
606
607 return 0;
608}
609
611{
612 return 0;
613}
614
615
616inline
618{
619 if( m_camera == nullptr) return 0;
620
621 try
622 {
623 m_ccdTemp = GetQHYCCDParam(&m_camera, CONTROL_CURTEMP);
624 recordCamera();
625 }
626 catch(...)
627 {
628 m_ccdTemp = -999;
629 recordCamera();
631 return -1;
632 }
633
634 return 0;
635
636}
637
638inline
640{
641 if( m_camera == nullptr) return 0;
642
643 try
644 {
645 m_expTime = GetQHYCCDParam(&m_camera, CONTROL_EXPOSURE); // returns exposure time in us.
646 m_expTime /= 1e6; // divide by 1e6 to get exposure time in seconds
647
648 recordCamera();
649 }
650 catch(...)
651 {
652 m_expTime = -999;
653 recordCamera();
655 return -1;
656 }
657
658 return 0;
659
660}
661
662
663inline
665{
672
673 return 0;
674}
675
676
677inline
679{
680 if( m_camera == nullptr) return 0;
681
682 try
683 {
684 recordCamera(true);
685 m_retVal = SetQHYCCDParam(m_camera, CONTROL_EXPOSURE, m_expTimeSet * 1e6);
686 }
687 catch(...)
688 {
689 log<software_error>({__FILE__, __LINE__, "Error setting exposure time"});
690 return -1;
691 }
692
693 log<text_log>( "Set exposure time: " + std::to_string(m_expTimeSet) + " sec");
694
695 return 0;
696}
697
698inline
700{
701 std::cerr << "checkNextROI!\n";
702 return 0;
703}
704
705inline
707{
708
709 std::cerr << "setNextROI:\n";
710 std::cerr << " m_nextROI.x = " << m_nextROI.x << "\n";
711 std::cerr << " m_nextROI.y = " << m_nextROI.y << "\n";
712 std::cerr << " m_nextROI.w = " << m_nextROI.w << "\n";
713 std::cerr << " m_nextROI.h = " << m_nextROI.h << "\n";
714 std::cerr << " m_nextROI.bin_x = " << m_nextROI.bin_x << "\n";
715 std::cerr << " m_nextROI.bin_y = " << m_nextROI.bin_y << "\n";
716
717 recordCamera(true);
720
722 m_reconfig = true;
723
724 updateSwitchIfChanged(m_indiP_roi_set, "request", pcf::IndiElement::Off, INDI_IDLE);
725
726 return 0;
727}
728
729inline
734
735inline
737{
738 return recordCamera(true);
739}
740
741
742}//namespace app
743} //namespace MagAOX
744#endif
int16_t pixelT
The base-class for XWCTk applications.
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.
int 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.
int 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:129
static constexpr bool c_stdCamera_usesStateString
app::dev confg to tell stdCamera to expose the state string property
Definition qhyCtrl.hpp:139
int checkNextROI()
Check the next ROI.
Definition qhyCtrl.hpp:699
int powerOnDefaults()
Set defaults for a power on state.
Definition qhyCtrl.hpp:664
int setNextROI()
Set the next ROI.
Definition qhyCtrl.hpp:706
~qhyCtrl() noexcept
Destructor.
Definition qhyCtrl.hpp:303
qhyccd_handle * m_camera
The library camera handle.
Definition qhyCtrl.hpp:167
unsigned int m_retVal
Return code for QHYCCD cameras.
Definition qhyCtrl.hpp:157
static constexpr bool c_stdCamera_usesModes
app:dev config to tell stdCamera not to expose mode controls
Definition qhyCtrl.hpp:131
qhyCtrl()
Default c'tor.
Definition qhyCtrl.hpp:295
static constexpr bool c_stdCamera_exptimeCtrl
app::dev config to tell stdCamera to expose exposure time controls
Definition qhyCtrl.hpp:125
static constexpr bool c_stdCamera_cropMode
app:dev config to tell stdCamera not to expose Crop Mode controls
Definition qhyCtrl.hpp:135
static constexpr bool c_frameGrabber_flippable
app:dev config to tell framegrabber that this camera can be flipped
Definition qhyCtrl.hpp:141
int setExpTime()
Set the Exposure Time. [stdCamera interface].
Definition qhyCtrl.hpp:678
int loadImageIntoStream(void *dest)
Definition qhyCtrl.hpp:588
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:164
static constexpr bool c_stdCamera_fpsCtrl
app::dev config to tell stdCamera to expose FPS controls
Definition qhyCtrl.hpp:127
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:227
static constexpr bool c_stdCamera_emGain
app::dev config to tell stdCamera to not expose EM gain controls
Definition qhyCtrl.hpp:123
virtual int appStartup()
Startup functions.
Definition qhyCtrl.hpp:341
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:152
int getTemp()
Get the current detector temperature.
Definition qhyCtrl.hpp:617
static constexpr bool c_stdCamera_fanSpeed
app::dev config to tell stdCamera not to expose fan-speed control
Definition qhyCtrl.hpp:121
int getExpTime()
Get the current exposure time.
Definition qhyCtrl.hpp:639
unsigned int channels
Definition qhyCtrl.hpp:163
uint32_t m_bits
The number of bits used by the camera.
Definition qhyCtrl.hpp:153
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:399
virtual int appLogic()
Implementation of the FSM for the Siglent SDG.
Definition qhyCtrl.hpp:376
int recordTelem(const telem_stdcam *)
Definition qhyCtrl.hpp:736
static constexpr bool c_stdCamera_hasShutter
app:dev config to tell stdCamera to expose shutter controls
Definition qhyCtrl.hpp:137
static constexpr bool c_stdCamera_usesROI
app:dev config to tell stdCamera to expose ROI controls
Definition qhyCtrl.hpp:133
virtual void setupConfig()
Setup the configuration system (called by MagAOXApp::setup())
Definition qhyCtrl.hpp:309
uint8_t * m_frame_data
Definition qhyCtrl.hpp:165
virtual void loadConfig()
load the configuration system results (called by MagAOXApp::setup())
Definition qhyCtrl.hpp:322
std::string m_serialNumber
The camera's identifying serial number.
Definition qhyCtrl.hpp:151
int getFPS()
Get the current framerate.
Definition qhyCtrl.hpp:241
#define protected
#define INDI_IDLE
Definition indiUtils.hpp:27
#define INDI_OK
Definition indiUtils.hpp:28
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:19
uint16_t pixelT
Definition qhyCtrl.hpp:12
A device base class which saves telemetry.
Definition telemeter.hpp:75
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.
@ 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.
Software CRITICAL log entry.
Software ERR log entry.
Log entry recording stdcam stage specific status.