<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.ORiN.co.jp/ISO20242-4/DCD1" targetNamespace="http://www.ORiN.co.jp/ISO20242-4/DCD1" elementFormDefault="qualified">
  <xsd:annotation>
    <xsd:appinfo source="http://www.ORiN.jp/ISO20242-4/DCPTHeader.xsd">
      <DCPTHeader>
        <DCPTIdentification>DCD1</DCPTIdentification>
        <DCPTRevision>1.0</DCPTRevision>
        <DCPTName>DCD1</DCPTName>
        <DCPTSource>DCD1.xsd</DCPTSource>
        <DCPTClassID>DCD1</DCPTClassID>
        <DCPTDate>2010-05-26</DCPTDate>
        <ISO20242Reference>
          <ISO20242Edition>1</ISO20242Edition>
          <Technology>ORiN</Technology>
        </ISO20242Reference>
      </DCPTHeader>
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:include schemaLocation="ORiNcommon.xsd" />
  <!-- Main type is ORiN_DCD with contained Virtual Device Types. 
       There may be many different Virtual Device Types contained. -->
  <xsd:element name="DCD1" type="DCDType" />
  <xsd:complexType name="DCDType">
    <xsd:complexContent>
      <xsd:extension base="ORiN_DCD">
        <xsd:sequence>
          <xsd:element ref="Provider" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- Virtual Device Types have fixed numbers for identification in moduleID.
       This is a restriction of type VDInstance. If You want to avoid
       restriction, move attribute moduleId from type ORiN_Module with a fixed
       number to type ProviderType below, which than is an extension of ORiN_Module
       and type ProviderBaseType will be obsolete. -->
  <xsd:complexType name="ProviderBaseType">
    <xsd:complexContent>
      <xsd:restriction base="ORiN_Module">
        <xsd:attribute name="provider" type="xsd:string" use="required" fixed="CaoProv.DCD1" />
        <xsd:attribute name="moduleId" type="xsd:unsignedShort" use="required" fixed="0" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- This Virtual Device Type examplary only contains one Function Object
       type without restricting the number of instances. -->
  <xsd:element name="Provider" type="ProviderType" />
  <xsd:complexType name="ProviderType">
    <xsd:complexContent>
      <xsd:extension base="ProviderBaseType">
        <xsd:sequence>
          <xsd:element ref="CaoProvController" maxOccurs="unbounded" />
          <xsd:element ref="CaoProvRobot" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- Function Object Types have fixed numbers for identification in funcID.
       This is a restriction of type ORiN_Object. If You want to avoid
       restriction, move attribute funcId from type ORiN_Object with a fixed
       number to type ControllerBaseType below, which than is an extension of
       ORiN_Object and type ControllerBaseType will be obsolete. -->
  <xsd:complexType name="ControllerBaseType">
    <xsd:complexContent>
      <xsd:restriction base="ORiN_Object">
        <xsd:attribute name="funcId" type="xsd:unsignedShort" use="required" fixed="101" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="RobotBaseType">
    <xsd:complexContent>
      <xsd:restriction base="ORiN_Object">
        <xsd:attribute name="funcId" type="xsd:unsignedShort" use="required" fixed="104" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- This Function Object type exemplary contains several Operations. -->
  <xsd:element name="CaoProvController" type="ControllerType" />
  <xsd:complexType name="ControllerType">
    <xsd:complexContent>
      <xsd:extension base="ControllerBaseType">
        <xsd:sequence>
          <xsd:element name="Connect" type="CtrlConnectType" />
          <xsd:element name="Disconnect" type="CtrlDisconnectType" />
          <xsd:element name="GetRobot" type="CtrlGetRobotType" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- This Function Object type exemplary contains one Operation. -->
  <xsd:element name="CaoProvRobot" type="RobotType" />
  <xsd:complexType name="RobotType">
    <xsd:complexContent>
      <xsd:extension base="RobotBaseType">
        <xsd:sequence>
          <xsd:element name="Move" type="RobotMoveType" minOccurs="0" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- This Operation has optional input and output values. -->
  <xsd:complexType name="CtrlConnectBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">
        <xsd:attribute name="operationId" type="xsd:unsignedShort" use="required" fixed="3" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="CtrlConnectType">
    <xsd:complexContent>
      <xsd:extension base="CtrlConnectBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter" type="MethodInGetObjectType" />
          <xsd:element name="Result" type="MethodOutVoidType" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="CtrlDisconnectBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">
        <xsd:attribute name="operationId" type="xsd:unsignedShort" use="required" fixed="4" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="CtrlDisconnectType">
    <xsd:complexContent>
      <xsd:extension base="CtrlDisconnectBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter" type="MethodInVoidType" />
          <xsd:element name="Result" type="MethodOutVoidType" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="CtrlGetRobotBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">
        <xsd:attribute name="operationId" type="xsd:unsignedShort" use="required" fixed="7" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="CtrlGetRobotType">
    <xsd:complexContent>
      <xsd:extension base="CtrlGetRobotBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter" type="MethodInGetObjectType" />
          <xsd:element name="Result" type="MethodOUTGetObject" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="RobotMoveBaseType">
    <xsd:complexContent>
      <xsd:restriction base="Method">
        <xsd:attribute name="operationId" type="xsd:unsignedShort" use="required" fixed="72" />
      </xsd:restriction>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="RobotMoveType">
    <xsd:complexContent>
      <xsd:extension base="RobotMoveBaseType">
        <xsd:sequence>
          <xsd:element name="Parameter" type="MethodInRobotMove" />
          <xsd:element name="Result" type="MethodOutVoidType" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- The input parameters for this operation may be a sequence of values. -->
  <xsd:complexType name="MethodInVoidType">
    <xsd:complexContent>
      <xsd:extension base="MethodInParameter">
        <xsd:sequence>
          <xsd:element name="Value" type="void" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="MethodInGetObjectType">
    <xsd:complexContent>
      <xsd:extension base="MethodInParameter">
        <xsd:sequence>
          <xsd:element name="Value">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="Name" type="xsd:string" />
                <xsd:element name="Option" type="xsd:string" />
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="MethodInRobotMove">
    <xsd:complexContent>
      <xsd:extension base="MethodInParameter">
        <xsd:sequence>
          <xsd:element name="Value">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="Interpolation" type="xsd:integer" />
                <xsd:element name="Pose" type="xsd:anyType" />
                <xsd:element name="Option" type="xsd:string" />
              </xsd:sequence>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- The output parameters for this operation is a special type "void",
       which defines, that the accordingly XML element has to be empty. -->
  <xsd:complexType name="MethodOutVoidType">
    <xsd:complexContent>
      <xsd:extension base="MethodOutParameter">
        <xsd:sequence>
          <xsd:element name="Value" type="void" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:complexType name="MethodOUTGetObject">
    <xsd:complexContent>
      <xsd:extension base="MethodOutParameter">
        <xsd:sequence>
          <xsd:element name="Value" type="xsd:unsignedInt" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
  <!-- empty type -->
  <xsd:complexType name="void" />
</xsd:schema>