forked from indilib/indi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
indiapi.h
533 lines (475 loc) · 17.3 KB
/
indiapi.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
#if 0
INDI
Copyright (C) 2003 Elwood C. Downey
This library is free software;
you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation;
either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY;
without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library;
if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110 - 1301 USA
#endif
#pragma once
#include <stdio.h>
/** \mainpage Instrument Neutral Distributed Interface INDI
*
\section Introduction
<p>INDI is a simple XML-like communications protocol described for interactive and automated remote control of diverse instrumentation. INDI is small, easy to parse, and stateless.</p>
<p>A full description of the INDI protocol is detailed in the INDI <a href="http://www.clearskyinstitute.com/INDI/INDI.pdf">white paper</a></p>
<p>Under INDI, any number of clients can connect to any number of drivers running one or more devices. It is a true N-to-N server/client architecture topology
allowing for reliable deployments of several INDI server, client, and driver instances distrubted across different systems in different physical and logical locations.</p>
<p>The basic premise of INDI is this: Drivers are responsible for defining their functionality in terms of <b>Properties</b>. Clients are not aware of such properties until they establish connection with the driver
and start receiving streams of defined properties. Each property encompases some functionality or information about the device. These include number, text, switch, light, and BLOB properties.</p>
<p>For example, all devices define the <i>CONNECTION</i> vector switch property, which is compromised of two switches:</p>
<ol>
<li><strong>CONNECT</strong>: Connect to the device.</li>
<li><strong>DISCONNECT</strong>: Disconnect to the device.</li>
</ol>
<p>Therefore, a client, whether it is a GUI client that represents such property as buttons, or a Python script that parses the properties, can change the state
of the switch to cause the desired action.</p>
<p>Not all properties are equal. A few properties are reserved to ensure interoperality among different clients that want to target a specific functionality.
These <i>Standard Properties</i> ensure that different clients agree of a common set of properties with specific meaning since INDI does not impose any specific meaning on the properties themselves.</p>
<p>INDI server acts as a convenient hub to route communications between clients and drivers. While it is not strictly required for controlling driver, it offers many queue and routing capabilities.</p>
\section Audience Intended Audience
INDI is intended for developers seeking to add support for their devices in INDI. Any INDI driver can be operated from numerous cross-platform cross-architecture <a href="http://indilib.org/about/clients.html">clients</a>.
\section Development Developing under INDI
<p>Please refere to the <a href="http://www.indilib.org/develop/developer-manual">INDI Developers Manual</a> for a complete guide on INDI's driver developemnt framework.</p>
<p>The INDI Library API is divided into the following main sections:</p>
<ul>
<li><a href="indidevapi_8h.html">INDI Device API</a></li>
<li><a href="classINDI_1_1BaseClient.html">INDI Client API</a></li>
<li><a href="namespaceINDI.html">INDI Base Drivers</a>: Base classes for all INDI drivers. Current base drivers include:
<ul>
<li><a href="classINDI_1_1Telescope.html">Telescope</a></li>
<li><a href="classINDI_1_1CCD.html">CCD</a></li>
<li><a href="classINDI_1_1GuiderInterface.html">Guider</a></li>
<li><a href="classINDI_1_1FilterWheel.html">Filter Wheel</a></li>
<li><a href="classINDI_1_1Focuser.html">Focuser</a></li>
<li><a href="classINDI_1_1Rotator.html">Rotator</a></li>
<li><a href="classINDI_1_1Detector.html">Detector</a></li>
<li><a href="classINDI_1_1Dome.html">Dome</a></li>
<li><a href="classLightBoxInterface.html">Light Panel</a></li>
<li><a href="classINDI_1_1Weather.html">Weather</a></li>
<li><a href="classINDI_1_1GPS.html">GPS</a></li>
<li><a href="classINDI_1_1USBDevice.html">USB</a></li>
</ul>
<li>@ref Connection "INDI Connection Interface"</li>
<li>@ref INDI::SP "INDI Standard Properties"</li>
<li><a href="md_libs_indibase_alignment_alignment_white_paper.html">INDI Alignment Subsystem</a></li>
<li><a href="structINDI_1_1Logger.html">INDI Debugging & Logging API</a></li>
<li>@ref DSP "Digital Signal Processing API"</li>
<li><a href="indicom_8h.html">INDI Common Routine Library</a></li>
<li><a href="lilxml_8h.html">INDI LilXML Library</a></li>
<li><a href="classStreamManager.html">INDI Stream Manager for video encoding, streaming, and recording.</a></li>
<li><a href="group__configFunctions.html">Configuration</a></li>
</ul>
\section Tutorials
INDI Library includes a number of tutorials to illustrate development of INDI drivers. Check out the <a href="examples.html">examples</a> provided with INDI library.
\section Simulators
Simulators provide a great framework to test drivers and equipment alike. INDI Library provides the following simulators:
<ul>
<li><b>@ref ScopeSim "Telescope Simulator"</b>: Offers GOTO capability, motion control, guiding, and ability to set Periodic Error (PE) which is read by the CCD simulator when generating images.</li>
<li><b>@ref CCDSim "CCD Simulator"</b>: Offers a very flexible CCD simulator with a primary CCD chip and a guide chip. The simulator generate images based on the RA & DEC coordinates it
snoops from the telescope driver using General Star Catalog (GSC). Please note that you must install GSC for the CCD simulator to work properly. Furthermore,
The simulator snoops FWHM from the focuser simulator which affects the generated images focus. All images are generated in standard FITS format.</li>
<li><b>@ref GuideSim "Guide Simulator"</b>: Simple dedicated Guide Simulator.
<li><b>@ref FilterSim "Filter Wheel Simulator"</b>: Offers a simple simulator to change filter wheels and their corresponding designations.</li>
<li><b>@ref FocusSim "Focuser Simulator"</b>: Offers a simple simualtor for an absolute position focuser. It generates a simulated FWHM value that may be used by other simulator such as the CCD simulator.</li>
<li><b>@ref DomeSim "Dome Simulator"</b>: Offers a simple simulator for an absolute position dome with shutter.
<li><b>@ref GPSSimulator "GPS Simulator"</b>: Offers a simple simulator for GPS devices that send time and location data to the client and other drivers.
</ul>
\section Help
You can find information on INDI development in the <a href="http://www.indilib.org">INDI Library</a> site. Furthermore, you can discuss INDI related issues on the <a href="http://sourceforge.net/mail/?group_id=90275">INDI development mailing list</a>.
\author Jasem Mutlaq
\author Elwood Downey
For a full list of contributors, please check <a href="https://github.com/indilib/indi/graphs/contributors">Contributors page</a> on Github.
*/
/** \file indiapi.h
\brief Constants and Data structure definitions for the interface to the reference INDI C API implementation.
\author Elwood C. Downey
*/
/*******************************************************************************
* INDI wire protocol version implemented by this API.
* N.B. this is indepedent of the API itself.
*/
#define INDIV 1.7
/* INDI Library version */
#define INDI_VERSION_MAJOR 1
#define INDI_VERSION_MINOR 9
#define INDI_VERSION_RELEASE 2
/*******************************************************************************
* Manifest constants
*/
/**
* @typedef ISState
* @brief Switch state.
*/
typedef enum
{
ISS_OFF = 0, /*!< Switch is OFF */
ISS_ON /*!< Switch is ON */
} ISState;
/**
* @typedef IPState
* @brief Property state.
*/
typedef enum
{
IPS_IDLE = 0, /*!< State is idle */
IPS_OK, /*!< State is ok */
IPS_BUSY, /*!< State is busy */
IPS_ALERT /*!< State is alert */
} IPState;
/**
* @typedef ISRule
* @brief Switch vector rule hint.
*/
typedef enum
{
ISR_1OFMANY, /*!< Only 1 switch of many can be ON (e.g. radio buttons) */
ISR_ATMOST1, /*!< At most one switch can be ON, but all switches can be off. It is similar to ISR_1OFMANY with the exception that all switches can be off. */
ISR_NOFMANY /*!< Any number of switches can be ON (e.g. check boxes) */
} ISRule;
/**
* @typedef IPerm
* @brief Permission hint, with respect to client.
*/
typedef enum
{
IP_RO, /*!< Read Only */
IP_WO, /*!< Write Only */
IP_RW /*!< Read & Write */
} IPerm;
// The XML strings for these attributes may be any length but implementations
// are only obligued to support these lengths for the various string attributes.
#define MAXINDINAME 64
#define MAXINDILABEL 64
#define MAXINDIDEVICE 64
#define MAXINDIGROUP 64
#define MAXINDIFORMAT 64
#define MAXINDIBLOBFMT 64
#define MAXINDITSTAMP 64
#define MAXINDIMESSAGE 255
/*******************************************************************************
* Typedefs for each INDI Property type.
*
* INumber.format may be any printf-style appropriate for double
* or style "m" to create sexigesimal using the form "%<w>.<f>m" where
* <w> is the total field width.
* <f> is the width of the fraction. valid values are:
* 9 -> :mm:ss.ss
* 8 -> :mm:ss.s
* 6 -> :mm:ss
* 5 -> :mm.m
* 3 -> :mm
*
* examples:
*
* to produce use
*
* "-123:45" %7.3m
* " 0:01:02" %9.6m
*/
/**
* @struct IText
* @brief One text descriptor.
*/
typedef struct _IText
{
/** Index name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** Allocated text string */
char *text;
/** Pointer to parent */
struct _ITextVectorProperty *tvp;
/** Helper info */
void *aux0;
/** Helper info */
void *aux1;
} IText;
/**
* @struct _ITextVectorProperty
* @brief Text vector property descriptor.
*/
typedef struct _ITextVectorProperty
{
/** Device name */
char device[MAXINDIDEVICE];
/** Property name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** GUI grouping hint */
char group[MAXINDIGROUP];
/** Client accessibility hint */
IPerm p;
/** Current max time to change, secs */
double timeout;
/** Current property state */
IPState s;
/** Texts comprising this vector */
IText *tp;
/** Dimension of tp[] */
int ntp;
/** ISO 8601 timestamp of this event */
char timestamp[MAXINDITSTAMP];
/** Helper info */
void *aux;
} ITextVectorProperty;
/**
* @struct INumber
* @brief One number descriptor.
*/
typedef struct _INumber
{
/** Index name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** GUI display format, see above */
char format[MAXINDIFORMAT];
/** Range min, ignored if min == max */
double min;
/** Range max, ignored if min == max */
double max;
/** Step size, ignored if step == 0 */
double step;
/** Current value */
double value;
/** Pointer to parent */
struct _INumberVectorProperty *nvp;
/** Helper info */
void *aux0;
/** Helper info */
void *aux1;
} INumber;
/**
* @struct _INumberVectorProperty
* @brief Number vector property descriptor.
*
* INumber.format may be any printf-style appropriate for double or style
* "m" to create sexigesimal using the form "%\<w\>.\<f\>m" where:\n
* \<w\> is the total field width.\n
* \<f\> is the width of the fraction. valid values are:\n
* 9 -> \<w\>:mm:ss.ss \n
* 8 -> \<w\>:mm:ss.s \n
* 6 -> \<w\>:mm:ss \n
* 5 -> \<w\>:mm.m \n
* 3 -> \<w\>:mm \n
*
* examples:\n
*
* To produce "-123:45", use \%7.3m \n
* To produce " 0:01:02", use \%9.6m
*/
typedef struct _INumberVectorProperty
{
/** Device name */
char device[MAXINDIDEVICE];
/** Property name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** GUI grouping hint */
char group[MAXINDIGROUP];
/** Client accessibility hint */
IPerm p;
/** Current max time to change, secs */
double timeout;
/** current property state */
IPState s;
/** Numbers comprising this vector */
INumber *np;
/** Dimension of np[] */
int nnp;
/** ISO 8601 timestamp of this event */
char timestamp[MAXINDITSTAMP];
/** Helper info */
void *aux;
} INumberVectorProperty;
/**
* @struct ISwitch
* @brief One switch descriptor.
*/
typedef struct _ISwitch
{
/** Index name */
char name[MAXINDINAME];
/** Switch label */
char label[MAXINDILABEL];
/** Switch state */
ISState s;
/** Pointer to parent */
struct _ISwitchVectorProperty *svp;
/** Helper info */
void *aux;
} ISwitch;
/**
* @struct _ISwitchVectorProperty
* @brief Switch vector property descriptor.
*/
typedef struct _ISwitchVectorProperty
{
/** Device name */
char device[MAXINDIDEVICE];
/** Property name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** GUI grouping hint */
char group[MAXINDIGROUP];
/** Client accessibility hint */
IPerm p;
/** Switch behavior hint */
ISRule r;
/** Current max time to change, secs */
double timeout;
/** Current property state */
IPState s;
/** Switches comprising this vector */
ISwitch *sp;
/** Dimension of sp[] */
int nsp;
/** ISO 8601 timestamp of this event */
char timestamp[MAXINDITSTAMP];
/** Helper info */
void *aux;
} ISwitchVectorProperty;
/**
* @struct ILight
* @brief One light descriptor.
*/
typedef struct _ILight
{
/** Index name */
char name[MAXINDINAME];
/** Light labels */
char label[MAXINDILABEL];
/** Light state */
IPState s;
/** Pointer to parent */
struct _ILightVectorProperty *lvp;
/** Helper info */
void *aux;
} ILight;
/**
* @struct _ILightVectorProperty
* @brief Light vector property descriptor.
*/
typedef struct _ILightVectorProperty
{
/** Device name */
char device[MAXINDIDEVICE];
/** Property name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** GUI grouping hint */
char group[MAXINDIGROUP];
/** Current property state */
IPState s;
/** Lights comprising this vector */
ILight *lp;
/** Dimension of lp[] */
int nlp;
/** ISO 8601 timestamp of this event */
char timestamp[MAXINDITSTAMP];
/** Helper info */
void *aux;
} ILightVectorProperty;
/**
* @struct IBLOB
* @brief One Blob (Binary Large Object) descriptor.
*/
typedef struct _IBLOB/* one BLOB descriptor */
{
/** Index name */
char name[MAXINDINAME];
/** Blob label */
char label[MAXINDILABEL];
/** Format attr */
char format[MAXINDIBLOBFMT];
/** Allocated binary large object bytes - maybe a shared buffer: use IDSharedBlobFree to free*/
void *blob;
/** Blob size in bytes */
int bloblen;
/** N uncompressed bytes */
int size;
/** Pointer to parent */
struct _IBLOBVectorProperty *bvp;
/** Helper info */
void *aux0;
/** Helper info */
void *aux1;
/** Helper info */
void *aux2;
} IBLOB;
/**
* @struct _IBLOBVectorProperty
* @brief BLOB (Binary Large Object) vector property descriptor.
*/
typedef struct _IBLOBVectorProperty /* BLOB vector property descriptor */
{
/** Device name */
char device[MAXINDIDEVICE];
/** Property name */
char name[MAXINDINAME];
/** Short description */
char label[MAXINDILABEL];
/** GUI grouping hint */
char group[MAXINDIGROUP];
/** Client accessibility hint */
IPerm p;
/** Current max time to change, secs */
double timeout;
/** Current property state */
IPState s;
/** BLOBs comprising this vector */
IBLOB *bp;
/** Dimension of bp[] */
int nbp;
/** ISO 8601 timestamp of this event */
char timestamp[MAXINDITSTAMP];
/** Helper info */
void *aux;
} IBLOBVectorProperty;
/**
* @brief Handy macro to find the number of elements in array a[]. Must be used
* with actual array, not pointer.
*/
#define NARRAY(a) (sizeof(a) / sizeof(a[0]))
/**
* @brief Bails out if memory pointer is 0. Prints file and function.
*/
#define assert_mem(p) if((p) == 0) { fprintf(stderr, "%s(%s): Failed to allocate memory\n", __FILE__, __func__); exit(1); }
#ifdef __cplusplus
extern "C" {
#endif
// FIXME: duplicated from indidevapi.h. Can we share ?
// Advertize support for shared blob on this platform
#define INDI_SHARED_BLOB_SUPPORT
/** \brief Allocate a buffer suitable for fast exchange over local links. Warning : the buffer will be sealed (readonly) once exchanged.
\param size_t size of the memory area to allocate
*/
extern void * IDSharedBlobAlloc(size_t size);
/** \brief Adjust the size of a buffer obtained using IDSharedBlobAlloc.
\param size_t size of the memory area to allocate
*/
extern void * IDSharedBlobRealloc(void * ptr, size_t size);
/** \brief Free a buffer allocated using IDSharedBlobAlloc. Fall back to free for buffer that are not shared blob
* Must be used for IBLOB.data
*/
extern void IDSharedBlobFree(void * ptr);
#ifdef __cplusplus
}
#endif