summaryrefslogtreecommitdiff
path: root/spectro/vtpglut.h
blob: c461887fa41f8570b548137b89170cddf2b76a45 (plain)
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

#ifndef VTPGLUT_H

/*
 * v3dlut/vtpg API definition.
 *
 * Abstract base class for common color Video Test Pattern Generator interface
 * and Video 3DLut devices.
 */

/* 
 * Argyll Color Correction System
 *
 * Author: Graeme W. Gill
 * Date:   15/3/2001
 *
 * Copyright 2001 - 2013 Graeme W. Gill
 * All rights reserved.
 *
 * This material is licenced under the GNU GENERAL PUBLIC LICENSE Version 2 or later :-
 * see the License2.txt file for licencing details.
 *
 */

#include "dev.h"			/* Device base class */
#include "insttypes.h"		/* libinst Includes this functionality */
#include "icoms.h"			/* libinst Includes this functionality */
#include "conv.h"

#ifdef __cplusplus
	extern "C" {
#endif

/* ------------------------------------------------- */
/* aprox. debug level guide:

	1,2  Applications, internal errors
	2,3  High level instrument drivers
	4,5  High level instrument communications
	6,7  High level serial/USB communications
	8,9  Low level serial/USB communications

*/

/* ---------------------------------------- */
/* Device interface abstract base class. */

/* This is used for all device types except color instruments */

/* Abstract return codes in ms 8bits. */
/* Device dependant codes in ls 16 bits. */
/* Note :- update vtpglut_interp_error() in other.c if anything here is changed. */
/* and also check all the device specific XXX_interp_code() routines too. */
typedef enum {
	vtpglut_ok                = 0x000000,
	vtpglut_notify            = 0x010000,	/* A Notification */
	vtpglut_warning           = 0x020000,	/* A Warning */
	vtpglut_no_coms           = 0x030000,	/* init_coms() hasn't been called yet */
	vtpglut_no_init           = 0x040000,	/* init_dev() hasn't been called yet */
	vtpglut_unsupported       = 0x050000,	/* Unsupported function */
	vtpglut_internal_error    = 0x060000,	/* Internal software error */
	vtpglut_coms_fail         = 0x070000,	/* Communication failure */
	vtpglut_unknown_model     = 0x080000,	/* Not the expected device */
	vtpglut_protocol_error    = 0x090000, 	/* Read or Write protocol error */
	vtpglut_user_abort        = 0x0A0000,	/* User hit escape */
	vtpglut_user_trig         = 0x0C0000,	/* User hit trigger key */
	vtpglut_unexpected_reply  = 0x140000,	/* Unexpected Reply */
	vtpglut_wrong_setup       = 0x150000,	/* Setup is wrong or conflicting */
	vtpglut_hardware_fail     = 0x160000,	/* Hardware failure */
	vtpglut_system_error      = 0x170000,	/* System call (ie malloc) fail */
	vtpglut_bad_parameter     = 0x180000,	/* Bad parameter value */
	vtpglut_other_error       = 0x190000,	/* Some other error */
	vtpglut_mask              = 0xff0000,	/* vtpglut_code mask value */
	vtpglut_dmask             = 0x00ffff	/* device specific mask value */
} vtpglut_code;

/* Device capabilities & modes */
/* Note that due to the binary combinations, capabilities is not definititive */
/* as to valid modes. check_mode() is definitive. */
/* #defines are for saving modes in a version independent way. */
/* Note :- update vtpglut_mode_sym[] table in vtpglut.c if anything here is changed. */
typedef enum {
	vtpglut_mode_none                = 0x00000000, /* No capability/mode */
} vtpglut_mode;

typedef enum {
	vtpglut2_none                    = 0x00000000, /* No capability */
} vtpglut_capability;


/* Device options for get_set_opt() */
typedef enum {
	vtpglut_opt_unknown            = 0x0000,	/* Option not specified */
} vtpglut_opt_type;

/* User interaction callback (uicallback()) function purpose */
/* (Make sure vtpglut.c inst_code ser_uicallbac() is updated if this changes. */
typedef enum {
    vtpglut_negcoms			/* Negotiating communications - can abort */
} vtpglut_ui_purp;

/* Asynchronous event callback type */
typedef enum {
    inst_event_none		/* (Placeholder) */
} vtpglut_event_type;

/* ---------------------------------------- */
/* Device interface abstract base class */

# define EXTRA_VTPGLUT_OBJ

/* vtpg/v3dlut interface base object */
/* Note that some methods work after creation, while many */
/* will return an error if communications hasn't been established and */
/* the device initialised. Some may change their response before and */
/* after initialisation. */
#define VTPGLUT_OBJ_BASE														\
																				\
	DEV_OBJ_BASE																\
																				\
	EXTRA_VTPGLUT_OBJ															\
																				\
	vtpglut_code (*uicallback)(void *cntx, vtpglut_ui_purp purp);				\
	void *uic_cntx;		/* User interaction callback function */				\
	void (*eventcallback)(void *cntx, vtpglut_event_type event);				\
	void *event_cntx;	/* Asynchronous event callback function */				\
																				\
	/* Virtual delete. Cleans up things done by new_vtpglut(). */				\
	vtpglut_code (*vdel)(														\
        struct _vtpglut *p);													\
																				\
	/* Establish communications at the indicated baud rate. */					\
	/* (Serial parameters are ignored for USB/Network device) */				\
	/* Timout in to seconds, and return non-zero error code */					\
	vtpglut_code (*init_coms)(													\
        struct _vtpglut *p);													\
																				\
	/* Initialise or re-initialise the vtpglut. */								\
	/* return non-zero on an error, with dev error code */						\
	vtpglut_code (*init_vtpglut)(  												\
        struct _vtpglut *p);													\
																				\
	/* Return the device type */												\
	/* (this could concievably change after init_vtpglut()) */					\
	/* Can be called before init */												\
	devType (*get_dtype)(  														\
        struct _vtpglut *p);													\
																				\
	/* Return the device serial number. */										\
	/* (This will be an empty string if there is no serial no) */               \
	char *(*get_serial_no)(  													\
        struct _vtpglut *p);													\
																				\
	/* Return the avilable devices modes and capabilities. */					\
	/* Can be called before init, but may be different to */					\
	/* what's returned after initilisation. */									\
	/* Note that these may change with the mode. */								\
	/* Arguments may be NULL */													\
	void (*capabilities)(struct _vtpglut *p,									\
	        vtpglut_mode *cap1,													\
	        vtpglut_capability *cap2);											\
																				\
    /* Check that the particular device measurement mode is valid, */           \
	/* since it's not possible to be 100% sure from capabilities */				\
    vtpglut_code (*check_mode)(													\
        struct _vtpglut *p,														\
        vtpglut_mode m);		/* Requested mode */							\
																				\
    /* Set the device mode */													\
	/* Note that this may change the capabilities. */							\
    vtpglut_code (*set_mode)(													\
        struct _vtpglut *p,														\
        vtpglut_mode m);		/* Requested mode */							\
																				\
    /* Get a status or get or set an option */                                  \
	/* option state. */															\
	/* Some options can be set before init */									\
	/* See vtpglut_opt_type typedef for list of mode types */					\
    vtpglut_code (*get_set_opt)(												\
        struct _vtpglut *p,														\
        vtpglut_opt_type m,	/* Requested option mode */							\
		...);				/* Option parameters */                             \
																				\
	/* Supply a user interaction callback function.								\
	 * (Nothing currentlt defined) 												\
	 *																			\
	 * NULL can be set to disable the callback.									\
	 */																			\
	void (*set_uicallback)(struct _vtpglut *p,										\
		vtpglut_code (*uicallback)(void *cntx, vtpglut_ui_purp purp), 			\
		void *cntx);															\
																				\
	/* Supply an aynchronous event callback function.							\
	 * This is called from a different thread with the following possible events:	\
	 *																			\
     * inst_event_XXX: (placeholder)											\
	 *																			\
	 * NULL can be set to disable the callback.									\
	 */																			\
	void (*set_event_callback)(struct _vtpglut *p,									\
		void (*eventcallback)(void *cntx, vtpglut_event_type event),			\
		void *cntx);															\
																				\
	/* Generic device error codes interpretation */								\
	char * (*vtpglut_interp_error)(struct _vtpglut *p, vtpglut_code ec);		\
																				\
	/* Instrument specific error codes interpretation */						\
	char * (*interp_error)(struct _vtpglut *p, int ec);							\
																				\
	/* Return the last serial communication error code */						\
	/* (This is used for deciding fallback/retry strategies) */					\
	int (*last_scomerr)(struct _vtpglut *p);									\
																				\
	/* Destroy ourselves */														\
	void (*del)(struct _vtpglut *p);											\


/* The base object type */
struct _vtpglut {
	VTPGLUT_OBJ_BASE
	}; typedef struct _vtpglut vtpglut;

/* Virtual constructor. */
/* Return NULL for unknown device, */
/* or serial device if nocoms == 0. */
/* (Doesn't copy icompaths log!) */
extern vtpglut *new_vtpglut(
	icompath *path,		/* Device path for this device */
	int nocoms,			/* Don't open if communications are needed to establish device type */
	a1log *log,			/* Log to use */
	vtpglut_code (*uicallback)(void *cntx, vtpglut_ui_purp purp),
	                    /* optional uicallback for abort */
	void *cntx			/* Context for callback */
);

/* - - - - - - - - - - - - - - - - - - -- */

#ifdef __cplusplus
	}
#endif

#define VTPGLUT_H
#endif /* VTPGLUT_H */