

/**
 * This is the TANGO interface defined in IDL.
 * TANGO is an extension of old TACO.
 * The fundamental idea of a device as a network object which
 * has methods and data has been retained. However
 * in TANGO objects will be real C++/Java objects which can be instantiated
 * and accessed via their methods and data by the client as if they were local
 * objects.
 * Certain aspects of the old DSAPI application programmer's
 * interface have been suppressed in order to simplify the client (e.g. import,
 * free, data collector api).
 * Features which have been considered missing in old TACO have been added
 * e.g. signals, events and groups.
 * Asynchronism and groups have been foreseen right from the beginning
 * this time.
 * This interface is defined in CORBA IDL.
 * The fundamental interface is Device.
 * All TANGO control objects will be of this type i.e. they will implement and
 * offer the Device interface.
 * New classes of control objects e.g. PowerSupply, will be created by
 * wrapping the Device class appropriately.
 * The wrapper class will hide the calls to the Device interface from
 * the client so that the client will only see the wrapper class.
 * All CORBA details will be hidden from the client as far as possible.
**/

module Tango
{

//-------------------------------------------------------------------------
//
// 		Basic types to transport command data
//
//-------------------------------------------------------------------------

typedef boolean 				DevBoolean;
typedef double 					DevDouble;
typedef float 					DevFloat;
typedef short 					DevShort;
typedef	long 					DevLong;
typedef long long				DevLong64;
typedef string 					DevString;
typedef octet					DevUChar;
typedef unsigned short 			DevUShort;
typedef unsigned long 			DevULong;
typedef unsigned long long		DevULong64;

typedef sequence<boolean>		DevVarBooleanArray;
typedef sequence<double> 		DevVarDoubleArray;
typedef sequence<float> 		DevVarFloatArray;
typedef sequence<short> 		DevVarShortArray;
typedef sequence<long> 			DevVarLongArray;
typedef sequence<long long>		DevVarLong64Array;
typedef sequence<octet> 		DevVarCharArray;
typedef sequence<string> 		DevVarStringArray;
typedef sequence<unsigned short> 	DevVarUShortArray;
typedef sequence<unsigned long> 	DevVarULongArray;
typedef sequence<unsigned long long>	DevVarULong64Array;


struct DevVarLongStringArray
{
	DevVarLongArray 	lvalue;
	DevVarStringArray 	svalue;
};

struct DevVarDoubleStringArray
{
	DevVarDoubleArray 	dvalue;
	DevVarStringArray 	svalue;
};

struct DevEncoded
{
	DevString			encoded_format;
	DevVarCharArray		encoded_data;
};

typedef sequence<DevEncoded>	DevVarEncodedArray;


//-------------------------------------------------------------------------
//
// 		Data types for trace context propagation (obervability service)
//
//-------------------------------------------------------------------------
// We do adpot the 'W3C Trace Context' standard which define how tracing
// information is propagated along the stack in a distributed call in terms
// of content and format. It does however says nothing regarding the protocol. 
// see details on https://www.w3.org/TR/trace-context/.
//-------------------------------------------------------------------------
// The W3C standard is mainly based on two headers: traceparent & tracestate.
// As of implementing IDLv6, both headers are hex encoded strings. A binary
// encoding might be proposed in a future version. 
//-------------------------------------------------------------------------
// The tracestate header is intended to deal with multi vendor microservices 
// architecture. We (Tango) do not recommend to use it in order to avoid it 
// to be used to transfer (meta)data through the observability service. 
// However, we make it available for a (potential) future use - e.g., in case 
// the W3C gives it a new role (the tracestate being a simple set of key/value 
// pairs). Till then, we will transfer an empty string along the call stack.
//-------------------------------------------------------------------------
struct W3CTraceContextV0
{
	// the trace parent header
	//------------------------
	// a hex encoded string of the form: <version>-<trace-id>-<parent-id>-<trace-flags>
	// example: 00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
	string trace_parent;

	// the trace state header
	//------------------------
	// a string containing comma separated 'key=value' pairs
	// example: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE
	string trace_state;
};

//-------------------------------------------------------------------------
// the W3CTraceContextFormat enum 
//-------------------------------------------------------------------------
enum TraceContextFormat {W3C_TC_V0};

//-------------------------------------------------------------------------
// the TraceContext union propagated along the ditributed call stack
// using a union will ease the maintenance of Tango IDL
//-------------------------------------------------------------------------
union TraceContext switch (TraceContextFormat)
{
// W3C trace context version 0
case W3C_TC_V0:
	W3CTraceContextV0 data;
};

//-------------------------------------------------------------------------
// About ClntIdent & trace context propagation (obervability service)
//-------------------------------------------------------------------------
// The simplest way to add support for obervability is to extend the existing
// "ClntIdent" (i.e., client identification) struct. The main advantage of 
// this approach is to limit the modifications of the Tango IDL to the ClntIdent 
// struct itself while maintaining the rest of the CORBA interface unchanged. 
// Moreover, since the trace context is propagated by the client (i.e., the 
// caller), it makes sense to inject it into the ClntIdent struct.
//-------------------------------------------------------------------------

//-------------------------------------------------------------------------
//
// 		Data types for client identification
//
//-------------------------------------------------------------------------

typedef	unsigned long long  	JavaUUID[2];
typedef unsigned long			CppClntIdent;

struct JavaClntIdent
{
	string			MainClass;
	JavaUUID		uuid;
};

//-------------------------------------------------------------------------
// CppClntIdent extension for IDL 6
//-------------------------------------------------------------------------
struct CppClntIdent_6
{
	// the data structure introduced in IDL 4 for C++ clients identification
	CppClntIdent cpp_clnt;
	// the W3C trace context headers (obervability service)
	TraceContext trace_context;
};

//-------------------------------------------------------------------------
// JavaClntIdent extension git for IDL 6
//-------------------------------------------------------------------------
struct JavaClntIdent_6
{
	// the data structure introduced in IDL 4 for Java clients identification
	JavaClntIdent java_clnt;
	// the W3C trace context headers (obervability service)
	TraceContext trace_context;
};

//-------------------------------------------------------------------------
// the LockerLanguage enum (badly named for historical reasons)
//-------------------------------------------------------------------------
// a selector for the marshalling/demarshalling of the ClntIdent union
// - CPP: pre-IDL6 data structure for C++ clients
// - JAVA: pre-IDL6 data structure for Java clients
// - CPP_6: IDL6 data structure for C++ clients
// - JAVA_6: IDL6 data structure for Java clients
//-------------------------------------------------------------------------
enum LockerLanguage { CPP, JAVA, CPP_6, JAVA_6};

//-------------------------------------------------------------------------
// ClntIdent: a CORBA union providing the client identification
//-------------------------------------------------------------------------
union ClntIdent switch (LockerLanguage)
{
// pre-IDL6 data structure for C++ clients
case CPP:
	CppClntIdent cpp_clnt;
// pre-IDL6 data structure for Java clients
case JAVA:
	JavaClntIdent java_clnt;
// IDL6 data structure for C++ clients
case CPP_6:
	CppClntIdent_6 cpp_clnt_6;
// IDL6 data structure for Java clients
case JAVA_6:
	JavaClntIdent_6 java_clnt_6;
};

//-------------------------------------------------------------------------
//
// 		Some enumerations
//
//-------------------------------------------------------------------------


enum AttrQuality
{
	ATTR_VALID,
	ATTR_INVALID,
	ATTR_ALARM,
	ATTR_CHANGING,
	ATTR_WARNING
};

enum AttrWriteType
{
	READ,
	READ_WITH_WRITE,
	WRITE,
	READ_WRITE,
    WT_UNKNOWN
};

enum AttrDataFormat
{
	SCALAR,
	SPECTRUM,
	IMAGE,
	FMT_UNKNOWN
};

enum DevSource
{
	DEV,
	CACHE,
	CACHE_DEV
};

enum ErrSeverity
{
	WARN,
	ERR,
	PANIC
};

enum DevState
{
	ON,
	OFF,
	CLOSE,
	OPEN,
	INSERT,
	EXTRACT,
	MOVING,
	STANDBY,
	FAULT,
	INIT,
	RUNNING,
	ALARM,
	DISABLE,
	UNKNOWN
};

enum DispLevel
{
	OPERATOR,
	EXPERT,
	DL_UNKNOWN
};

typedef sequence<DevState>	DevVarStateArray;

//-------------------------------------------------------------------------
//
//		 Some  miscellaneous structures definitions
//
//-------------------------------------------------------------------------

struct TimeVal
{
	long 	tv_sec;
	long 	tv_usec;
	long 	tv_nsec;
};


//-------------------------------------------------------------------------
//
//		For the command query device operation
//
//-------------------------------------------------------------------------


struct DevCmdInfo
{
	string 	cmd_name;
	long 	cmd_tag;
	long 	in_type;
	long 	out_type;
	string	in_type_desc;
	string 	out_type_desc;
};

struct DevCmdInfo_2
{
	string 		cmd_name;
	DispLevel 	level;
	long		cmd_tag;
	long 		in_type;
	long 		out_type;
	string		in_type_desc;
	string 		out_type_desc;
};

typedef sequence<DevCmdInfo> DevCmdInfoList;
typedef sequence<DevCmdInfo_2> DevCmdInfoList_2;


//-------------------------------------------------------------------------
//
// 		For the DevFailed exceptions
//
//-------------------------------------------------------------------------

struct DevError
{
	string 			reason;
	ErrSeverity 	severity;
	string 			desc;
	string 			origin;
};

typedef sequence<DevError> DevErrorList;

struct NamedDevError
{
	string			name;
	long			index_in_call;
	DevErrorList	err_list;
};

typedef sequence<NamedDevError> NamedDevErrorList;


exception DevFailed
{
	DevErrorList errors;
};

exception MultiDevFailed
{
	NamedDevErrorList errors;
};


//-------------------------------------------------------------------------
//
//		For attribute management
//
//-------------------------------------------------------------------------


struct AttributeConfig
{
	string				name;
	AttrWriteType		writable;
	AttrDataFormat		data_format;
	long				data_type;
	long				max_dim_x;
	long				max_dim_y;
	string 				description;
	string 				label;
	string 				unit;
	string 				standard_unit;
	string				display_unit;
	string 				format;
	string   			min_value;
	string    			max_value;
	string   			min_alarm;
	string   			max_alarm;
	string				writable_attr_name;
	DevVarStringArray	extensions;
};

struct AttributeConfig_2
{
	string				name;
	AttrWriteType		writable;
	AttrDataFormat		data_format;
	long				data_type;
	long				max_dim_x;
	long				max_dim_y;
	string 				description;
	string 				label;
	string 				unit;
	string 				standard_unit;
	string				display_unit;
	string 				format;
	string   			min_value;
	string    			max_value;
	string   			min_alarm;
	string   			max_alarm;
	string				writable_attr_name;
	DispLevel			level;
	DevVarStringArray	extensions;
};

struct AttributeValue
{
	any 			value;
	AttrQuality 	quality;
	TimeVal 		time;
	string			name;
	long			dim_x;
	long 			dim_y;
};

struct AttributeDim
{
	long 			dim_x;
	long 			dim_y;
};

struct AttributeValue_3
{
	any 			value;
	AttrQuality 	quality;
	TimeVal 		time;
	string			name;
	AttributeDim	r_dim;
	AttributeDim	w_dim;
	DevErrorList	err_list;
};

enum AttributeDataType
{
	ATT_BOOL,
	ATT_SHORT,
	ATT_LONG,
	ATT_LONG64,
	ATT_FLOAT,
	ATT_DOUBLE,
	ATT_UCHAR,
	ATT_USHORT,
	ATT_ULONG,
	ATT_ULONG64,
	ATT_STRING,
	ATT_STATE,
	DEVICE_STATE,
	ATT_ENCODED,
	ATT_NO_DATA
};

union AttrValUnion switch (AttributeDataType)
{
case ATT_BOOL:
	DevVarBooleanArray		bool_att_value;
case ATT_SHORT:
	DevVarShortArray		short_att_value;
case ATT_LONG:
	DevVarLongArray			long_att_value;
case ATT_LONG64:
	DevVarLong64Array		long64_att_value;
case ATT_FLOAT:
	DevVarFloatArray		float_att_value;
case ATT_DOUBLE:
	DevVarDoubleArray		double_att_value;
case ATT_UCHAR:
	DevVarCharArray			uchar_att_value;
case ATT_USHORT:
	DevVarUShortArray		ushort_att_value;
case ATT_ULONG:
	DevVarULongArray		ulong_att_value;
case ATT_ULONG64:
	DevVarULong64Array		ulong64_att_value;
case ATT_STRING:
	DevVarStringArray		string_att_value;
case ATT_STATE:
	DevVarStateArray		state_att_value;
case DEVICE_STATE:
	DevState				dev_state_att;
case ATT_ENCODED:
	DevVarEncodedArray		encoded_att_value;
case ATT_NO_DATA:
	DevBoolean				union_no_data;
};

struct AttributeValue_4
{
	AttrValUnion		value;
	AttrQuality 		quality;
	AttrDataFormat		data_format;
	TimeVal 			time;
	string				name;
	AttributeDim		r_dim;
	AttributeDim		w_dim;
	DevErrorList		err_list;
};

struct AttributeValue_5
{
	AttrValUnion		value;
	AttrQuality 		quality;
	AttrDataFormat		data_format;
	long				data_type;
	TimeVal 			time;
	string				name;
	AttributeDim		r_dim;
	AttributeDim		w_dim;
	DevErrorList		err_list;
};

struct ChangeEventProp
{
	string				rel_change;
	string				abs_change;
	DevVarStringArray	extensions;
};

struct PeriodicEventProp
{
	string				period;
	DevVarStringArray	extensions;
};

struct ArchiveEventProp
{
	string				rel_change;
	string				abs_change;
	string				period;
	DevVarStringArray	extensions;
};

struct EventProperties
{
	ChangeEventProp		ch_event;
	PeriodicEventProp	per_event;
	ArchiveEventProp	arch_event;
};

struct AttributeAlarm
{
	string				min_alarm;
	string				max_alarm;
	string 				min_warning;
	string				max_warning;
	string				delta_t;
	string				delta_val;
	DevVarStringArray	extensions;
};

struct AttributeConfig_3
{
	string				name;
	AttrWriteType		writable;
	AttrDataFormat		data_format;
	long				data_type;
	long				max_dim_x;
	long				max_dim_y;
	string 				description;
	string 				label;
	string 				unit;
	string 				standard_unit;
	string				display_unit;
	string 				format;
	string   			min_value;
	string    			max_value;
	string				writable_attr_name;
	DispLevel			level;
	AttributeAlarm		att_alarm;
	EventProperties		event_prop;
	DevVarStringArray	extensions;
	DevVarStringArray	sys_extensions;
};

struct AttributeConfig_5
{
	string				name;
	AttrWriteType		writable;
	AttrDataFormat		data_format;
	long				data_type;
	boolean				memorized;
	boolean				mem_init;
	long				max_dim_x;
	long				max_dim_y;
	string 				description;
	string 				label;
	string 				unit;
	string 				standard_unit;
	string				display_unit;
	string 				format;
	string   			min_value;
	string    			max_value;
	string				writable_attr_name;
	DispLevel			level;
	string				root_attr_name;
	DevVarStringArray	enum_labels;
	AttributeAlarm		att_alarm;
	EventProperties		event_prop;
	DevVarStringArray	extensions;
	DevVarStringArray	sys_extensions;
};

typedef sequence<AttributeConfig> 	AttributeConfigList;
typedef sequence<AttributeConfig_2> AttributeConfigList_2;
typedef sequence<AttributeConfig_3> AttributeConfigList_3;
typedef sequence<AttributeConfig_5> AttributeConfigList_5;
typedef sequence<AttributeValue> 	AttributeValueList;
typedef sequence<AttributeValue_3> 	AttributeValueList_3;
typedef sequence<AttributeValue_4>	AttributeValueList_4;
typedef sequence<AttributeValue_5>	AttributeValueList_5;

//-------------------------------------------------------------------------
//
//		For pipe management
//
//-------------------------------------------------------------------------

enum PipeWriteType
{
	PIPE_READ,
	PIPE_READ_WRITE,
    PIPE_WT_UNKNOWN
};

struct PipeConfig
{
	string				name;
	string 				description;
	string 				label;
	DispLevel			level;
	PipeWriteType		writable;
	DevVarStringArray	extensions;
};

typedef sequence<PipeConfig> PipeConfigList;

struct DevPipeDataElt;
typedef sequence<DevPipeDataElt>	DevVarPipeDataEltArray;

struct DevPipeDataElt
{
	string					name;
	AttrValUnion			value;
	DevVarPipeDataEltArray	inner_blob;
	string					inner_blob_name;
};

struct DevPipeBlob
{
	string 					name;
	DevVarPipeDataEltArray	blob_data;
};

struct DevPipeData
{
	string					name;
	TimeVal					time;
	DevPipeBlob				data_blob;
};

//-------------------------------------------------------------------------
//
//		For data ready event
//
//-------------------------------------------------------------------------

struct AttDataReady
{
	string 	name;
	long 	data_type;
	long 	ctr;
};


//-------------------------------------------------------------------------
//
//		For device interface change event
//
//-------------------------------------------------------------------------

struct DevIntrChange
{
	boolean					dev_started;
	DevCmdInfoList_2 		cmds;
	AttributeConfigList_5 	atts;
};

//-------------------------------------------------------------------------
//
//		For device interface info operation
//
//-------------------------------------------------------------------------

struct DevInfo
{
	string 	dev_class;
	string 	server_id;
	string 	server_host;
	long 	server_version;
	string 	doc_url;
};

struct DevInfo_3
{
	string 	dev_class;
	string 	server_id;
	string 	server_host;
	long 	server_version;
	string 	doc_url;
	string 	dev_type;
};


struct DevInfoVersion
{
    string key;
    string value;
};

typedef sequence<DevInfoVersion> DevInfoVersionList;

struct DevInfo_6
{
	string 	dev_class;
	string 	server_id;
	string 	server_host;
	long 	server_version;
	string 	doc_url;
	string 	dev_type;
	DevInfoVersionList 	version_info;
};

//-------------------------------------------------------------------------
//
//		For command and attribute history
//
//-------------------------------------------------------------------------

struct DevCmdHistory
{
	TimeVal			time;
	boolean			cmd_failed;
	any				value;
	DevErrorList	errors;
};

typedef sequence<DevCmdHistory> DevCmdHistoryList;

struct DevAttrHistory
{
	boolean			attr_failed;
	AttributeValue	value;
	DevErrorList	errors;
};

struct DevAttrHistory_3
{
	boolean				attr_failed;
	AttributeValue_3	value;
};

struct EltInArray
{
	long			start;
	long			nb_elt;
};

typedef sequence<EltInArray> EltInArrayList;
typedef sequence<TimeVal> TimeValList;
typedef sequence<AttrQuality> AttrQualityList;
typedef sequence<AttributeDim> AttributeDimList;
typedef sequence<DevErrorList> DevErrorListList;

struct DevAttrHistory_4
{
	string					name;
	TimeValList				dates;
	any						value;
	AttrQualityList			quals;
	EltInArrayList			quals_array;
	AttributeDimList		r_dims;
	EltInArrayList			r_dims_array;
	AttributeDimList		w_dims;
	EltInArrayList			w_dims_array;
	DevErrorListList		errors;
	EltInArrayList			errors_array;
};

struct DevAttrHistory_5
{
	string					name;
	AttrDataFormat			data_format;
	long					data_type;
	TimeValList				dates;
	any						value;
	AttrQualityList			quals;
	EltInArrayList			quals_array;
	AttributeDimList		r_dims;
	EltInArrayList			r_dims_array;
	AttributeDimList		w_dims;
	EltInArrayList			w_dims_array;
	DevErrorListList		errors;
	EltInArrayList			errors_array;
};

struct DevCmdHistory_4
{
	TimeValList				dates;
	any						value;
	AttributeDimList		dims;
	EltInArrayList			dims_array;
	DevErrorListList		errors;
	EltInArrayList			errors_array;
	long 					cmd_type;
};

typedef sequence<DevAttrHistory> 	DevAttrHistoryList;
typedef sequence<DevAttrHistory_3> 	DevAttrHistoryList_3;

//-------------------------------------------------------------------------
//
//		For ZMQ event system
//
//-------------------------------------------------------------------------

struct ZmqCallInfo
{
	long					version;
	unsigned long 			ctr;
	string					method_name;
	DevVarCharArray			oid;
	boolean					call_is_except;
};

//-------------------------------------------------------------------------
//
//		Include the device interface
//
//-------------------------------------------------------------------------





/**
 * The fundamental interface for all TANGO objects.
 * Each Device is a network object which can be accessed locally or via
 * network.
 * The network protocol on the wire will be IIOP.
 * The Device interface implements all the basic functions needed for doing
 * generic synchronous and asynchronous I/O on a device.
 * A Device object has data and actions.
 * Data are represented in the form of Attributes.
 * Actions are represented in the form of Commands.
 * The CORBA Device interface offers attributes and methods to access
 * the attributes and commands.
 * A client will either use these methods directly from C++ or Java or access
 * them via a wrapper class.
 * The Device interface describes only the remote network interface.
 * Implementation features like threads, command security, priority
 * etc. are dealt with in server side of the device server model.
 **/

interface Device
{

/**
 * name (readonly) - unique ascii identifier
 **/
	readonly attribute string name;
/**
 * description (readonly) - general description of device
 **/
	readonly attribute string description;
/**
 * state (readonly) - device state
 **/
	readonly attribute DevState state;
/**
 * status (readonly) - device state as ascii string
 **/
	readonly attribute string status;
/**
 * adm_name (readonly) - administrator device unique ascii identifier
 **/
	readonly attribute string adm_name;

/**
 * execute a command on a device synchronously with
 * one input parameter and one output parameter
@param command ascii string e.g. "On"
@param argin command input parameter e.g. float
@return command result.
 **/
	any command_inout(in string command, in any argin) raises(DevFailed);


/**
 * read the configuration for a variable list of attributes from a device
@param name list of attribute names to read
@return list of attribute configurations read
 **/
	AttributeConfigList get_attribute_config(in DevVarStringArray names) raises(DevFailed);


/**
 * set the configuration for a variable list of attributes from the device
@param new_conf list of attribute configuration to be set
@return nothing
 **/
	void set_attribute_config(in AttributeConfigList new_conf) raises(DevFailed);


/**
 * read a variable list of attributes from a device
@param name list of attribute names to read
@return list of attribute values read
 **/
	AttributeValueList read_attributes(in DevVarStringArray names) raises(DevFailed);



/**
 * write a variable list of attributes to a device
@param values list of attribute values to write
@return nothing
 **/
	void write_attributes(in AttributeValueList values) raises(DevFailed);

/**
 * ping a device to see if it alive
 **/
	void ping() raises(DevFailed);

/**
 * read list of last N commands executed by clients
@param number of commands to return
@return list of command and clients
 **/
	DevVarStringArray black_box(in long n) raises(DevFailed);


/**
 * return general information about object e.g. class, type, ...
@return device info
 **/
	DevInfo info() raises(DevFailed);


/**
 * query device to see what commands it supports
@return list of commands and their types
 **/
	DevCmdInfoList command_list_query() raises(DevFailed);


/**
 * query device to see command argument
@return command and its types
@param command name
 **/
	DevCmdInfo command_query(in string command) raises(DevFailed);

};

//-------------------------------------------------------------------------
//
//		The Device_2 interface
//
//-------------------------------------------------------------------------


/**
 * A new release of the basic Device interface.
 * This new release has been introduced mainly to support Tango device server
 * internal polling. Inheritance is used between this new release and the
 * old one. This release mainly defines a new release of the command_inout and
 * read_attributes calls with a new parameter. It also add a new call to read
 * command or attributes result history.
 **/

interface Device_2: Device
{
/**
 * Execute a command on a device synchronously with
 * one input parameter and one output parameter
@param command ascii string e.g. "On"
@param argin command input parameter e.g. float
@param source The data source. Used to specify if the command result must be
read from the polling cache buffer or from the device itself
@return command result.
 **/
	any command_inout_2(in string command,
			    in any argin,
			    in DevSource source) raises(DevFailed);

/**
 * Read a variable list of attributes from a device
@param name list of attribute names to read
@param source The data source. Used to specify if the command result must be
read from the polling cache buffer or from the device itself
@return list of attribute values read
 **/
	AttributeValueList read_attributes_2(in DevVarStringArray names,
					     in DevSource source) raises(DevFailed);

/**
 * Read the configuration for a variable list of attributes from a device.
 * Compared to the Device interface, the attribute configuration has one more
 * field (The display level)
@param name list of attribute names to read
@return list of attribute configurations read
 **/
	AttributeConfigList_2 get_attribute_config_2(in DevVarStringArray names) raises(DevFailed);

/**
 * Query device to see what commands it supports.
 * Compared to the Device interface, the command configuration has one more
 * field (The display level)
@return list of commands and their types
 **/
	DevCmdInfoList_2 command_list_query_2() raises(DevFailed);

/**
 * Query device to see command argument.
 * Compared to the Device interface, the command configuration has one more
 * field (The display level)
@return command and its types
@param command name
 **/
	DevCmdInfo_2 command_query_2(in string command) raises(DevFailed);

/**
 * Get command history buffer.
 * Return command result history for polled command
@param command ascii string e.g. "On"
@param n The history depth
@return command history.
 **/
	DevCmdHistoryList command_inout_history_2(in string command,
						  in long n) raises (DevFailed);

/**
 * Get attribute value history buffer.
 * Return attribute value history for polled attribute
@param name ascii string
@param n The history depth
@return attribute value history.
 **/
	DevAttrHistoryList read_attribute_history_2(in string name,
						    in long n) raises (DevFailed);
};

//-------------------------------------------------------------------------
//
//		The Device_3 interface (corresponding to Tango V5)
//
//-------------------------------------------------------------------------

interface Device_3: Device_2
{

/**
 * Read a variable list of attributes from a device
@param name list of attribute names to read
@param source The data source. Used to specify if the command result must be
read from the polling cache buffer or from the device itself
@return list of attribute values read
 **/
	AttributeValueList_3 read_attributes_3(in DevVarStringArray names,
					       in DevSource source) raises(DevFailed);

/**
 * write a variable list of attributes to a device
@param values list of attribute values to write
@return nothing
 **/
	void write_attributes_3(in AttributeValueList values) raises(DevFailed,MultiDevFailed);
/**
 * Get attribute value history buffer.
 * Return attribute value history for polled attribute
@param name ascii string
@param n The history depth
@return attribute value history.
 **/
	DevAttrHistoryList_3 read_attribute_history_3(in string name,
						      in long n) raises (DevFailed);

/**
 * return general information about object e.g. class, type, ...
@return device info
 **/
	DevInfo_3 info_3() raises(DevFailed);

/**
 * Read the configuration for a variable list of attributes from a device.
 * Compared to the Device interface, the attribute configuration has one more
 * field (The display level)
@param name list of attribute names to read
@return list of attribute configurations read
 **/
	AttributeConfigList_3 get_attribute_config_3(in DevVarStringArray names) raises(DevFailed);

/**
 * set the configuration for a variable list of attributes from the device
@param new_conf list of attribute configuration to be set
@return nothing
 **/
	void set_attribute_config_3(in AttributeConfigList_3 new_conf) raises(DevFailed);
};

//-------------------------------------------------------------------------
//
//		The Device_4 interface (corresponding to Tango V7)
//
//-------------------------------------------------------------------------

interface Device_4: Device_3
{
/**
 * Get attribute value history buffer.
 * Return attribute value history for polled attribute
@param name ascii string
@param n The history depth
@return attribute value history.
 **/
	DevAttrHistory_4 read_attribute_history_4(in string name,
						      in long n) raises (DevFailed);

/**
 * Get command history buffer.
 * Return command result history for polled command
@param command ascii string e.g. "On"
@param n The history depth
@return command history.
 **/
	DevCmdHistory_4 command_inout_history_4(in string command,
						  in long n) raises (DevFailed);

/**
 * Execute a command on a device synchronously with
 * one input parameter and one output parameter
@param command ascii string e.g. "On"
@param argin command input parameter e.g. float
@param source The data source. Used to specify if the command result must be
read from the polling cache buffer or from the device itself
@param cl_ident The client identificator
@return command result.
 **/
	any command_inout_4(in string command,
			    in any argin,
			    in DevSource source,
				in ClntIdent cl_ident) raises(DevFailed);

/**
 * Read a variable list of attributes from a device
@param name list of attribute names to read
@param source The data source. Used to specify if the command result must be
read from the polling cache buffer or from the device itself
@return list of attribute values read
 **/
	AttributeValueList_4 read_attributes_4(in DevVarStringArray names,
					       in DevSource source,in ClntIdent cl_ident) raises(DevFailed);

/**
 * write a variable list of attributes to a device
@param values list of attribute values to write
@return nothing
 **/
	void write_attributes_4(in AttributeValueList_4 values,in ClntIdent cl_ident) raises(DevFailed,MultiDevFailed);

/**
 * set the configuration for a variable list of attributes from the device
@param new_conf list of attribute configuration to be set
@return nothing
 **/
	void set_attribute_config_4(in AttributeConfigList_3 new_conf,in ClntIdent cl_ident) raises(DevFailed);

/**
 * Write then Read device attribute(s)
@param values List of attribute values to be written
@param cl_ident The client identificator
@return Attributes value read
 **/
	AttributeValueList_4 write_read_attributes_4(in AttributeValueList_4 values,in ClntIdent cl_ident)
	raises(DevFailed,MultiDevFailed);
};

//-------------------------------------------------------------------------
//
//		The Device_5 interface (corresponding to Tango V9)
//
//-------------------------------------------------------------------------

interface Device_5: Device_4
{
/**
 * Read the configuration for a variable list of attributes from a device.
 * Compared to the Device interface, the attribute configuration has one more
 * field (The display level)
@param name list of attribute names to read
@return list of attribute configurations read
 **/
	AttributeConfigList_5 get_attribute_config_5(in DevVarStringArray names) raises(DevFailed);

/**
 * set the configuration for a variable list of attributes from the device
@param new_conf list of attribute configuration to be set
@return nothing
 **/
	void set_attribute_config_5(in AttributeConfigList_5 new_conf,in ClntIdent cl_ident) raises(DevFailed);

/**
 * Read a variable list of attributes from a device
@param name list of attribute names to read
@param source The data source. Used to specify if the command result must be
read from the polling cache buffer or from the device itself
@return list of attribute values read
 **/
	AttributeValueList_5 read_attributes_5(in DevVarStringArray names,
					       in DevSource source,in ClntIdent cl_ident) raises(DevFailed);

/**
 * Write then Read device attribute(s)
@param values List of attribute values to be written
@param cl_ident The client identificator
@return Attributes value read
 **/
	AttributeValueList_5 write_read_attributes_5(in AttributeValueList_4 values,in DevVarStringArray r_names,in ClntIdent cl_ident)
	raises(DevFailed,MultiDevFailed);

/**
 * Get attribute value history buffer.
 * Return attribute value history for polled attribute
@param name ascii string
@param n The history depth
@return attribute value history.
 **/
	DevAttrHistory_5 read_attribute_history_5(in string name,
						      in long n) raises (DevFailed);

/**
 * Read the configuration for a variable list of pipes from a device.
@param names list of pipe names to read
@return list of pipe configurations read
 **/
	PipeConfigList get_pipe_config_5(in DevVarStringArray names) raises(DevFailed);

/**
 * set the configuration for a variable list of pipes from the device
@param new_conf list of pipe configuration to be set
@return nothing
 **/
	void set_pipe_config_5(in PipeConfigList new_conf,in ClntIdent cl_ident) raises(DevFailed);

/**
 * Read a pipe from a device
@param name pipe name
@param cl_ident client identifier
@return pipe value
 **/
	DevPipeData read_pipe_5(in string name,in ClntIdent cl_ident) raises(DevFailed);

/**
 * write a pipe to a device
@param value new pipe value
@param cl_ident client identifier
@return nothing
 **/
	void write_pipe_5(in DevPipeData value,in ClntIdent cl_ident) raises(DevFailed);

/**
 * write then read a pipe to a device
@param value new pipe value
@param cl_ident client identifier
@return pipe value
 **/
	DevPipeData write_read_pipe_5(in DevPipeData value,in ClntIdent cl_ident) raises(DevFailed);

};

//-------------------------------------------------------------------------
//
//		The Device_6 interface (corresponding to Tango V10)
//
//-------------------------------------------------------------------------

interface Device_6: Device_5
{

/**
 * return general information about object e.g. class, type, ...
@return device info
 **/
	DevInfo_6 info_6() raises(DevFailed);

};

};  /* module tango */
