
#ifndef SS_H

/* 
 * Argyll Color Management System
 *
 * Gretag Spectrolino and Spectroscan related
 * defines and declarations.
 *
 * Author: Graeme W. Gill
 * Date:   13/7/2005
 *
 * Copyright 2005 - 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.
 *
 * Derived from DTP41.h
 *
 * This is an alternative driver to spm/gretag.
 */

/* 
   If you make use of the instrument driver code here, please note
   that it is the author(s) of the code who are responsibility
   for its operation. Any problems or queries regarding driving
   instruments with the Argyll drivers, should be directed to
   the Argyll's author(s), and not to any other party.

   If there is some instrument feature or function that you
   would like supported here, it is recommended that you
   contact Argyll's author(s) first, rather than attempt to
   modify the software yourself, if you don't have firm knowledge
   of the instrument communicate protocols. There is a chance
   that an instrument could be damaged by an incautious command
   sequence, and the instrument companies generally cannot and
   will not support developers that they have not qualified
   and agreed to support.
 */

#undef EMSST		/* Debug - emulate a SpectroScanT with a SpectroScan */

#include "inst.h"
#include "ss_imp.h"

#ifdef __cplusplus
	extern "C" {
#endif

#define SS_MAX_WR_SIZE 1000	/* Assumed maximum normal message query size */
#define SS_MAX_RD_SIZE 1000	/* Assumed maximum normal messagle answer size */

/* Gretag Spectrolino/Spectroscan communication object */
struct _ss {
	/* **** base instrument class **** */
	INST_OBJ_BASE

	/* *** Spectroscan/lino private data **** */
	inst_mode cap;				/* Instrument mode capability */
	inst2_capability cap2;		/* Instrument capability 2 */
	inst3_capability cap3;		/* Instrument capability 3 */
	inst_mode	nextmode;		/* Next requested mode */
	inst_mode	mode;			/* Currently instrument mode */

	char serno[20];				/* Serial number */

	/* Desired measurement configuration */
	ss_aft     filt;			/* Filter type (None/UV/D65/Pol etc.) */
	ss_dst     dstd;			/* Density standard (ANSI A/ANSI T/DIN etc.) */
	ss_ilt     illum;			/* Illuminant type (A/C/D50 etc.) */
	ss_ot      obsv;			/* Observer type (2deg/10deg) */
	ss_wbt     wbase;			/* White base type (Paper/Abs>) */
	ss_ctt     phmode;			/* Photometric mode (Absolute/Relative) */
	double     phref;			/* Photometric reference (cd/m^2) */

	int		calcount;			/* Calibration needed counter */
	int     pisrow;             /* patches in a reading direction serpentine rows */
	int		need_wd_cal;		/* White/dark calibration needed flag */
	int		need_t_cal;			/* Transmission calibration needed flag */
	int     noinitcalib;		/* Don't mode change or do initilal calibrate */
	int     forcecalib;			/* Force a calibration even if not near white tile */
	inst_opt_type trig;			/* Reading trigger mode */
	int     offline;			/* nz if we're off line */

	/* Emulated manual transmission mode support */
	double tref[36];			/* White reference spectrum */
	double cill[36];			/* Colorimetry illuminant */

	/* Custom compensation filter */
	int custfilt_en;			/* Custom filter enabled */
	xspect custfilt;			/* Custom filter */

	xcalstd native_calstd;		/* Instrument native calibration standard */
	xcalstd target_calstd;		/* Returned calibration standard */

#ifdef EMSST
	int tmode;					/* Transmission mode */
	ss_rt sbr;					/* Standby reference */
	double sbx, sby;			/* Standby location */
#endif

	/* Serialisation support: */

	/* Send buffer */
	char _sbuf[SS_MAX_WR_SIZE];	/* Buffer allocation */
	char *sbufe;				/* Pointer to last valid location in _sbuf[] */
	char *sbuf;					/* Next character output */

	/* Receive buffer */
	char _rbuf[SS_MAX_RD_SIZE];	/* Buffer allocation */
	char *rbufe;				/* Pointer to last valid location in _rbuf[] */
	char *rbuf;					/* Next character output */

	/* Accumulated device error */
	ss_et snerr;

	}; typedef struct _ss ss;

/* Constructor */
extern ss *new_ss(icoms *icom, instType itype);

#ifdef __cplusplus
	}
#endif

#define SS_H
#endif /* SS_H */
