<?xml version="1.0" encoding="UTF-8" ?> 
<!--
================================================================================
   [ORiN2] CRD (Controller Resource Definition) Schema ver. 1.0
   Copyright(C) 2003-  DENSO WAVE
================================================================================
-->

<xs:schema targetNamespace="http://www.orin.jp/CRD/CRDSchema"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:crd="http://www.orin.jp/CRD/CRDSchema">

	<xs:annotation>
		<xs:documentation xmlns="http://www.w3.org/1999/xhtml">
			<p>[ORiN2] CRD Schema ver. 1.0</p> 
		</xs:documentation>
	</xs:annotation>

<!-- 
================================================================================
   CRD primitives (Variant, Array, and common elements)
================================================================================
-->
	<!-- ********** CRD Variant ********** -->

	<!-- VariantType -->
	<xs:simpleType name="varType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="VT_BOOL"/>
			<xs:enumeration value="VT_I1"/>
			<xs:enumeration value="VT_UI1"/>
			<xs:enumeration value="VT_I2"/>
			<xs:enumeration value="VT_UI2"/>
			<xs:enumeration value="VT_I4"/>
			<xs:enumeration value="VT_UI4"/>
			<xs:enumeration value="VT_R4"/>
			<xs:enumeration value="VT_R8"/>
			<xs:enumeration value="VT_DATE"/>
			<xs:enumeration value="VT_BSTR"/>
			<xs:enumeration value="VT_VARIANT"/>
			<xs:enumeration value="VT_ARRAY"/>
		</xs:restriction>
	</xs:simpleType>

	<!-- VariantData -->	
	<xs:element name="boolVal" type="xs:boolean"/>
	<xs:element name="cVal" type="xs:byte"/>
	<xs:element name="bVal" type="xs:unsignedByte"/>
	<xs:element name="iVal" type="xs:short"/>
	<xs:element name="uiVal" type ="xs:unsignedShort"/>
	<xs:element name="lVal" type="xs:int"/>
	<xs:element name="ulVal" type="xs:unsignedInt"/>
	<xs:element name="fltVal" type="xs:float"/>
	<xs:element name="dblVal" type="xs:double"/>
	<xs:element name="date" type="xs:dateTime"/>
	<xs:element name="bstrVal" type="xs:string"/>

	<!-- Variant -->
	<xs:element name="varVal" type="crd:Variant"/>

	<xs:complexType name="Variant">
		<xs:choice>
			<xs:element ref="crd:boolVal"/>
			<xs:element ref="crd:cVal"/>
			<xs:element ref="crd:bVal"/>
			<xs:element ref="crd:iVal"/>
			<xs:element ref="crd:uiVal"/>
			<xs:element ref="crd:lVal"/>
			<xs:element ref="crd:ulVal"/>
			<xs:element ref="crd:fltVal"/>
			<xs:element ref="crd:dblVal"/>
			<xs:element ref="crd:date"/>
			<xs:element ref="crd:bstrVal"/>
			<xs:element ref="crd:varVal"/>
			<xs:element ref="crd:array"/>
		</xs:choice>
		<xs:attribute name="type" type="crd:varType" use="required"/>
	</xs:complexType>

	<!-- ********** CRD Array ********** -->

	<!-- ArrayBound -->
	<xs:element name="dimension" type="xs:int" default="1"/>
	<xs:element name="lBound" type="xs:int" default="0"/>
	<xs:element name="elements" type="xs:int"/>
	
	<xs:element name="arrayBound">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="crd:lBound"/>
				<xs:element ref="crd:elements"/>
			</xs:sequence>
		</xs:complexType>
	</xs:element>

	<!-- ArrayData -->
	<xs:element name="arrayData">
		<xs:complexType>
			<xs:choice>
				<xs:element ref="crd:boolVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:cVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:bVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:iVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:uiVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:lVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:ulVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:fltVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:dblVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:date" maxOccurs="unbounded"/>
				<xs:element ref="crd:bstrVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:varVal" maxOccurs="unbounded"/>
				<xs:element ref="crd:arrayData" maxOccurs="unbounded"/>
			</xs:choice>
		</xs:complexType>
	</xs:element>
	
	<!-- Array -->
	<xs:element name="array">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="crd:dimension"/>
				<xs:element ref="crd:arrayBound" maxOccurs="unbounded"/>
				<xs:element ref="crd:arrayData"/>
			</xs:sequence>
			<xs:attribute name="type" type="crd:varType" use="required"/>
		</xs:complexType>
	</xs:element>

	<!-- ********** Common Elements ********** -->

	<xs:attributeGroup name="comAttributes">
		<xs:attribute name="name" type="xs:string" use="required"/>
		<xs:attribute name="option" type="xs:string"/>
	</xs:attributeGroup>

	<xs:element name="Value" type="crd:Variant"/>
	<xs:element name="Attribute" type="xs:int"/>
	<xs:element name="Help" type="xs:string"/>
	<xs:element name="ID" type="crd:Variant"/>
  <xs:element name="DateTime" type="xs:dateTime"/>

  <!-- 
================================================================================
   CRD Structure (Object model)
================================================================================
-->

  <!-- ********** CRD [Root] ********** -->
  <xs:element name="CRD" type="crd:CRDType"/>
  <xs:complexType name="CRDType">
    <xs:sequence>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:Version" minOccurs="0"/>
      <xs:element ref="crd:Controller" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Version" type="xs:string"/>


  <!-- ********** CRD Controller ********** -->
  <xs:element name="Controller" type ="crd:ControllerType"/>
  <xs:complexType name="ControllerType">
    <xs:sequence>
      <xs:element ref="crd:Attribute" minOccurs="0"/>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:ID" minOccurs="0"/>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="crd:Extension"/>
        <xs:element ref="crd:File"/>
        <xs:element ref="crd:Robot"/>
        <xs:element ref="crd:Task"/>
        <xs:element ref="crd:Variable"/>
        <xs:element ref="crd:Command"/>
        <xs:element ref="crd:Message"/>
      </xs:choice>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
    <xs:attribute name="provider" type="xs:string"/>
    <xs:attribute name="machine" type="xs:string"/>
  </xs:complexType>

  <!-- ********** CRD Extension ********** -->
  <xs:element name="Extension" type ="crd:ExtensionType"/>
  <xs:complexType name="ExtensionType">
    <xs:sequence>
      <xs:element ref="crd:Attribute" minOccurs="0"/>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:ID" minOccurs="0"/>
      <xs:element ref="crd:Variable" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
  </xs:complexType>

  <!-- ********** CRD File ********** -->
  <xs:element name="File" type="crd:FileType"/>
  <xs:complexType name ="FileType">
    <xs:sequence>
      <xs:element ref="crd:Attribute" minOccurs="0"/>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:ID" minOccurs="0"/>
      <xs:element ref="crd:DateCreated" minOccurs="0"/>
      <xs:element ref="crd:DateLastAccessed" minOccurs="0"/>
      <xs:element ref="crd:DateLastModified" minOccurs="0"/>
      <xs:element ref="crd:Path" minOccurs="0"/>
      <xs:element ref="crd:Size" minOccurs="0"/>
      <xs:element ref="crd:Type" minOccurs="0"/>
      <xs:element ref="crd:Value" minOccurs="0"/>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="crd:File"/>
        <xs:element ref="crd:Variable"/>
      </xs:choice>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
  </xs:complexType>
  <xs:element name="DateCreated" type="xs:dateTime"/>
  <xs:element name="DateLastAccessed" type="xs:dateTime"/>
  <xs:element name="DateLastModified" type="xs:dateTime"/>
  <xs:element name="Path" type="xs:string"/>
  <xs:element name="Size" type="xs:int"/>
  <xs:element name="Type" type="xs:string"/>

  <!-- ********** CRD Robot ********** -->
  <xs:element name="Robot" type="crd:RobotType"/>
  <xs:complexType name="RobotType">
    <xs:sequence>
      <xs:element ref="crd:Attribute" minOccurs="0"/>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:ID" minOccurs="0"/>
      <xs:element ref="crd:Variable" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
  </xs:complexType>

  <!-- ********** CRD Task ********** -->
  <xs:element name="Task" type="crd:TaskType"/>
  <xs:complexType name="TaskType">
    <xs:sequence>
      <xs:element ref="crd:Attribute" minOccurs="0"/>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:ID" minOccurs="0"/>
      <xs:element ref="crd:FileName" minOccurs="0"/>
      <xs:element ref="crd:Variable" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
  </xs:complexType>
  <xs:element name="FileName" type="xs:string"/>

  <!-- ********** CRD Variable ********** -->
  <xs:element name="Variable" type="crd:VariableType"/>
  <xs:complexType name="VariableType">
    <xs:sequence>
      <xs:element ref="crd:Attribute" minOccurs="0"/>
      <xs:element ref="crd:Help" minOccurs="0"/>
      <xs:element ref="crd:ID" minOccurs="0"/>
      <xs:element ref="crd:DateTime" minOccurs="0"/>
      <xs:element ref="crd:Microsecond" minOccurs="0"/>
      <xs:element ref="crd:Value" minOccurs="0"/>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
  </xs:complexType>
  <xs:element name="Microsecond" type="xs:int"/>

  <!-- ********** CRD Command ********** -->
	<xs:element name="Command" type="crd:CommandType"/>
	<xs:complexType name="CommandType">
		<xs:sequence>
			<xs:element ref="crd:Attribute" minOccurs="0"/>
			<xs:element ref="crd:Help" minOccurs="0"/>
			<xs:element ref="crd:ID" minOccurs="0"/>
      <xs:element ref="crd:Timeout" minOccurs="0"/>
      <xs:element ref="crd:State" minOccurs="0"/>
      <xs:element ref="crd:Parameters" minOccurs="0"/>
    </xs:sequence>
    <xs:attributeGroup ref="crd:comAttributes"/>
  </xs:complexType>
  <xs:element name="Timeout" type="xs:int"/>
  <xs:element name="State" type="xs:int"/>
  <xs:element name="Parameters" type="crd:Variant"/>

  <!-- ********** CRD Message ********** -->
	<xs:element name="Message" type="crd:MessageType"/>
	<xs:complexType name="MessageType">
		<xs:sequence>
			<xs:element ref="crd:DateTime" minOccurs="0"/>
			<xs:element ref="crd:Description" minOccurs="0"/>
			<xs:element ref="crd:Destination" minOccurs="0"/>
			<xs:element ref="crd:Source" minOccurs="0"/>
			<xs:element ref="crd:Value" minOccurs="0"/>
		</xs:sequence>
    <xs:attribute name="number" type="xs:int" use="required"/>
  </xs:complexType>
  <xs:element name="Description" type="xs:string"/>
  <xs:element name="Destination" type="xs:string"/>
  <xs:element name="Source" type="xs:string"/>

</xs:schema>

