<?xml version='1.0' encoding='windows-1252'?>

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.omg.org/gems" xmlns="http://www.omg.org/gems" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <!-- GEMS Parameter Type Definitions -->

    <xsd:complexType name="StringParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute fixed="string" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="BooleanParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:boolean">
                <xsd:attribute fixed="boolean" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="ByteParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:byte">
                <xsd:attribute fixed="byte" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="UnsignedByteParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:unsignedByte">
                <xsd:attribute fixed="ubyte" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="HexParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:hexBinary">
                <xsd:attribute fixed="hex_value" name="ParameterType" type="xsd:string"/>
                <xsd:attribute name="bit_length" type="xsd:int" use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="DoubleParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:double">
                <xsd:attribute fixed="double" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="LongParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:long">
                <xsd:attribute fixed="long" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="UnsignedLongParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:unsignedLong">
                <xsd:attribute fixed="ulong" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="IntParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:int">
                <xsd:attribute fixed="int" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="UnsignedIntParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:unsignedInt">
                <xsd:attribute fixed="uint" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="ShortParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:short">
                <xsd:attribute fixed="short" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="UnsignedShortParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:unsignedShort">
                <xsd:attribute fixed="ushort" name="ParameterType" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

   <xsd:complexType name="TimeParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:anySimpleType">
                <xsd:attribute name="ParameterType" fixed="time" type="xsd:string"/>
                <xsd:attribute name="seconds" type="xsd:int" use="required"/>
                <xsd:attribute name="nanoseconds" type="xsd:int" use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:complexType name="UtimeParameter">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="ParameterType" fixed="utime" type="xsd:string"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <!-- 
        GEMS Parameter definition. GEMS Parameters are basically containers that have 
        the following attributes and elements

        Attributes
            name:           The name of the parameter
            multiplicity:   The number of values (used for arrays)

        Elements:
            Type/Value:     The internal element defines the type and value of the parameter
     -->
    <xsd:complexType name="Parameter">
        <xsd:sequence>
            <xsd:choice maxOccurs="unbounded" minOccurs="0">
                <xsd:element name="string" type="StringParameter"/>
                <xsd:element name="boolean" type="BooleanParameter"/>
                <xsd:element name="byte" type="ByteParameter"/>
                <xsd:element name="ubyte" type="UnsignedByteParameter"/>
                <xsd:element name="hex_value" type="HexParameter"/>
                <xsd:element name="double" type="DoubleParameter"/>
                <xsd:element name="long" type="LongParameter"/>
                <xsd:element name="ulong" type="UnsignedLongParameter"/>
                <xsd:element name="int" type="IntParameter"/>
                <xsd:element name="uint" type="UnsignedIntParameter"/>
                <xsd:element name="short" type="ShortParameter"/>
                <xsd:element name="ushort" type="UnsignedShortParameter"/>
                <xsd:element name="time" type="TimeParameter" />
                <xsd:element name="utime" type="UtimeParameter" />
            </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
        <xsd:attribute name="type" type="xsd:string" use="optional"/>
        <xsd:attribute name="multiplicity" type="xsd:int" use="optional" default="1"/>
    </xsd:complexType>

    <!--
        GEMS ParameterSet definition. ParameterSets provide a way to define complex data structures.
        They contain a set of internal Parameters and/or ParameterSets.
     -->
    <xsd:complexType name="ParameterSet">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="Parameter"/>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="ParameterSet" type="ParameterSet"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="optional"/>
        <xsd:attribute name="type" type="xsd:string" use="optional"/>
        <xsd:attribute default="false" name="array" type="xsd:boolean"/>
    </xsd:complexType>

    <!--
        GEMS MessageType maps to the base GEMS message class.
     -->
    <xsd:complexType name="MessageType">
        <xsd:attribute name="gems_version" type="xsd:decimal" use="required"/>
        <xsd:attribute name="token" type="xsd:string" use="optional"/>
        <xsd:attribute name="target" type="xsd:string" use="optional"/>
        <xsd:attribute name="transaction_id" type="xsd:long" use="optional"/>
        <xsd:attribute name="timestamp" type="xsd:string" use="optional"/>
    </xsd:complexType>

    <!-- 
        GEMS MessageSequenceType maps to the base GEMS MessageSequence
     -->
    <xsd:complexType name="MessageSequenceType">
        <xsd:complexContent>
            <xsd:restriction base="MessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="SetConfigMessage" type="SetConfigMessageType"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="GetConfigMessage" type="GetConfigMessageType"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="LoadConfigMessage" type="LoadConfigMessageType"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="SaveConfigMessage" type="SaveConfigMessageType"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="SetConfigResponse" type="SetConfigResponseType"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="LoadConfigResponse" type="LoadConfigResponseType"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="SaveConfigResponse" type="SaveConfigResponseType"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="MessageSequence" type="MessageSequenceType"/>

    <!-- 
        GEMS ResultCodes are passed with every GEMS response message. The ResultCode indicates the
        result of the associated message.
     -->
    <xsd:simpleType name="ResultCode">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="SUCCESS"/>
            <xsd:enumeration value="INVALID_RANGE"/>
            <xsd:enumeration value="INVALID_PARAMETER"/>
            <xsd:enumeration value="INVALID_STATE"/>
            <xsd:enumeration value="INVALID_VERSION"/>
            <xsd:enumeration value="INVALID_TARGET"/>
            <xsd:enumeration value="CONFLICTING_PARAMETER"/>
            <xsd:enumeration value="UNSUPPORTED_MESSAGE"/>
            <xsd:enumeration value="MALFORMED_MESSAGE"/>
            <xsd:enumeration value="COMMUNICATION_ERROR"/>
            <xsd:enumeration value="INTERNAL_ERROR"/>
            <xsd:enumeration value="ACCESS_DENIED"/>
            <xsd:enumeration value="OTHER"/>
        </xsd:restriction>
    </xsd:simpleType>


    <!-- 
        GEMS ResponseMessageType definition. This is the base type for all response messages.
        This maps to the GEMS ResponseMessage and represents the result as an element.
     -->
    <xsd:complexType name="ResponseMessageType">
        <xsd:complexContent>
            <xsd:restriction base="MessageType">
                <xsd:sequence>
                    <xsd:element minOccurs="1" maxOccurs="1" name="Result" type="ResultCode"/>
                    <xsd:element minOccurs="0" maxOccurs="1" name="description" type="xsd:string"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <!-- 
        GEMS SetConfigMessageType maps to the GEMS SetConfigMessage class
     -->
    <xsd:complexType name="SetConfigMessageType">
        <xsd:complexContent>
            <xsd:restriction base="MessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="Parameter"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="ParameterSet" type="ParameterSet"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="SetConfigMessage" type="SetConfigMessageType"/>


    <!-- 
        GEMS SetConfigResponseType definition. This defines the type for the SetConfigResponse message.
     -->
    <xsd:complexType name="SetConfigResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="1" minOccurs="1" name="parameters_set" type="xsd:int"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="SetConfigResponse" type="SetConfigResponseType"/>

    <!-- 
        GEMS GetConfigMessageType maps to the GEMS GetConfigMessage class
     -->
    <xsd:complexType name="GetConfigMessageType">
        <xsd:complexContent>
            <xsd:restriction base="MessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="Parameter"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="ParameterSet" type="ParameterSet"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="GetConfigMessage" type="GetConfigMessageType"/>


    <!-- 
        GEMS GetConfigResponseType definition. This defines the type for the GetconfigResponse message.
     -->
    <xsd:complexType name="GetConfigResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="Parameter"/>
                    <xsd:element maxOccurs="unbounded" minOccurs="0" name="ParameterSet" type="ParameterSet"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="GetConfigResponse" type="GetConfigResponseType"/>

    <!-- 
        GEMS SaveConfigMessagetype maps to the GEMS SaveConfigMessage
     -->
    <xsd:complexType name="SaveConfigMessageType">
        <xsd:complexContent>
            <xsd:extension base="MessageType">
                <xsd:sequence>
                    <xsd:element name="name" type="StringParameter"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="SaveConfigMessage" type="SaveConfigMessageType"/>


    <!-- 
        GEMS SaveConfigResponseType definition. This defines the type for the SaveConfigResponse message.
     -->
    <xsd:complexType name="SaveConfigResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="1" minOccurs="1" name="parameters_saved" type="xsd:int"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="SaveConfigResponse" type="SaveConfigResponseType"/>

    <!-- 
        GEMS LoadConfigMessageType maps to the GEMS LoadConfigMessage
     -->
    <xsd:complexType name="LoadConfigMessageType">
        <xsd:complexContent>
            <xsd:restriction base="MessageType">
                <xsd:sequence>
                    <xsd:element name="name" type="StringParameter"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="LoadConfigMessage" type="LoadConfigMessageType"/>


    <!-- 
        GEMS LoadConfigResponseType definition. This defines the type for the LoadConfigResponse message.
     -->
    <xsd:complexType name="LoadConfigResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="1" minOccurs="1" name="parameters_loaded" type="xsd:int"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="LoadConfigResponse" type="LoadConfigResponseType"/>

    <!-- 
        GEMS GetConfigListMessageType definition. This defines the type for the GetConfigListMessage message.
     -->
    <xsd:complexType name="GetConfigListMessageType">
        <xsd:complexContent>
            <xsd:extension base="MessageType">
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="GetConfigListMessage" type="GetConfigListMessageType"/>

    <!-- 
        GEMS GetConfigListResponseType definition. This defines the type for the GetConfigListResponse message.
     -->
    <xsd:complexType name="GetConfigListResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType">
                <xsd:sequence>
                    <xsd:element minOccurs="0" maxOccurs="unbounded" name="ConfigurationName" type="xsd:string"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="GetConfigListResponse" type="GetConfigListResponseType"/>

    <!-- 
        GEMS ConnectionType values are passed with the connection request and indicate
        the type of connection desired.
     -->
    <xsd:simpleType name="ConnectionType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="CONTROL_ONLY"/>
            <xsd:enumeration value="STATUS_ONLY"/>
            <xsd:enumeration value="CONTROL_AND_STATUS"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!-- 
        GEMS ConnectionRequestMessageType defines the type used for connection request
        messages. This maps to the GEMS ConnectionRequestMessage.
     -->
    <xsd:complexType name="ConnectionRequestMessageType">
        <xsd:complexContent>
            <xsd:extension base="MessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="1" minOccurs="1" name="type" type="ConnectionType"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="ConnectionRequestMessage" type="ConnectionRequestMessageType"/>

    <!-- 
        GEMS ConnectionRequestResponseType defines the type used for connection request
        response. This maps to the GEMS ConnectionRequestResponse.
     -->
    <xsd:complexType name="ConnectionRequestResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType"/>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="ConnectionRequestResponse" type="ConnectionRequestResponseType"/>

    <!-- 
        GEMS ConnectionType values are passed with the connection request and indicate
        the type of connection desired.
     -->
    <xsd:simpleType name="DisconnectReason">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="NORMAL_TERMINATION"/>
            <xsd:enumeration value="CONTROL_LOST"/>
            <xsd:enumeration value="SERVICE_TERMINATED"/>
            <xsd:enumeration value="OTHER"/>
        </xsd:restriction>
    </xsd:simpleType>

    <!-- 
        GEMS Disconnect Message
     -->
    <xsd:complexType name="DisconnectMessageType">
        <xsd:complexContent>
            <xsd:extension base="MessageType">
                <xsd:sequence>
                    <xsd:element maxOccurs="1" minOccurs="1" name="reason" type="DisconnectReason"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="DisconnectMessage" type="DisconnectMessageType"/>

    <!-- 
        GEMS Directive
     -->
    <xsd:complexType name="ArgumentsType">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="Parameter"/>
        </xsd:sequence>
        <xsd:attribute name="directive_name" type="xsd:string" use="optional"/>
    </xsd:complexType>

    <xsd:complexType name="ReturnValuesType">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="Parameter" type="Parameter"/>
            <xsd:element maxOccurs="unbounded" minOccurs="0" name="ParameterSet" type="ParameterSet"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="DirectiveMessageType">
        <xsd:complexContent>
            <xsd:restriction base="MessageType">
                <xsd:sequence>
                    <xsd:element minOccurs="1" maxOccurs="1" name="directive_name" type="xsd:string"/>
                    <xsd:element minOccurs="0" maxOccurs="1" name="arguments" type="ArgumentsType"/>
                </xsd:sequence>
            </xsd:restriction>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="DirectiveResponseType">
        <xsd:complexContent>
            <xsd:extension base="ResponseMessageType">
                <xsd:sequence>
                    <xsd:element minOccurs="1" maxOccurs="1" name="directive_name" type="xsd:string"/>
                    <xsd:element minOccurs="0" maxOccurs="1" name="return_values" type="ReturnValuesType"/>
                </xsd:sequence>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="DirectiveMessage" type="DirectiveMessageType"/>

    <xsd:element name="DirectiveResponse" type="DirectiveResponseType"/>

</xsd:schema>
