<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.smpte-ra.org/schemas/433/2008/dcmlTypes/" version="1.0"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
        xmlns:dcml="http://www.smpte-ra.org/schemas/433/2008/dcmlTypes/"
        elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"/>

<!-- UUID Type -->
<xs:simpleType name="UUIDType">
   <xs:restriction base="xs:anyURI">
      <xs:pattern value="urn:uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"/>
   </xs:restriction>
</xs:simpleType>

<!-- UserText Type -->
<xs:complexType name="UserTextType">
    <xs:simpleContent>
        <xs:extension base="xs:string">
           <xs:attribute name="language" type="xs:language" use="optional" default="en"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

<!-- Rational Type -->
<xs:simpleType name="RationalType">
   <xs:restriction>
      <xs:simpleType>
         <xs:list itemType="xs:long"/>
      </xs:simpleType>
      <xs:length value="2"/>
	  <xs:pattern value="[-+]?[0-9]+ 0*[1-9][0-9]*"/>
   </xs:restriction>
</xs:simpleType>

<!-- Temperature Units Tokens -->
<xs:simpleType name="temperatureUnitsToken">
   <xs:restriction base="xs:token">
      <xs:enumeration value="celsius"/>
      <xs:enumeration value="fahrenheit"/>
      <xs:enumeration value="kelvin"/>
   </xs:restriction>
</xs:simpleType>

<!-- Voltage Units Tokens -->
<xs:simpleType name="voltageUnitsToken">
   <xs:restriction base="xs:token">
      <xs:enumeration value="volts"/>
      <xs:enumeration value="millivolts"/>
      <xs:enumeration value="microvolts"/>
   </xs:restriction>
</xs:simpleType>

<!-- Current Units Tokens -->
<xs:simpleType name="currentUnitsToken">
   <xs:restriction base="xs:token">
      <xs:enumeration value="amps"/>
      <xs:enumeration value="milliamps"/>
   </xs:restriction>
</xs:simpleType>

<!-- Current Mode Tokens -->
<xs:simpleType name="currentModeToken">
   <xs:restriction base="xs:token">
      <xs:enumeration value="AC"/>
      <xs:enumeration value="DC"/>
   </xs:restriction>
</xs:simpleType>

<!-- Time Units Tokens -->
<xs:simpleType name="timeUnitToken">
   <xs:restriction base="xs:token">
      <xs:enumeration value="week"/>
      <xs:enumeration value="day"/>
      <xs:enumeration value="hour"/>
      <xs:enumeration value="minute"/>
      <xs:enumeration value="second"/>
      <xs:enumeration value="millisecond"/>
      <xs:enumeration value="microsecond"/>      
   </xs:restriction>
</xs:simpleType>

<!-- Temperature Type -->
<xs:complexType name="temperatureType">
   <xs:simpleContent>
      <xs:extension base="xs:decimal">
         <xs:attribute name="units" type="dcml:temperatureUnitsToken" use="required"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Voltage Type -->
<xs:complexType name="voltageType">
   <xs:simpleContent>
      <xs:extension base="xs:decimal">
         <xs:attribute name="units" type="dcml:voltageUnitsToken" use="required"/>
         <xs:attribute name="mode" type="dcml:currentModeToken" use="required"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Current Type -->
<xs:complexType name="currentType">
   <xs:simpleContent>
      <xs:extension base="xs:decimal">
         <xs:attribute name="units" type="dcml:currentUnitsToken" use="required"/>
         <xs:attribute name="mode" type="dcml:currentModeToken" use="required"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Duration (Time) Type -->
<xs:complexType name="durationType">
   <xs:simpleContent>
      <xs:extension base="xs:decimal">
         <xs:attribute name="units" type="dcml:timeUnitToken" use="required"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Rate Type (Events per unit time) -->
<xs:complexType name="rateType">
   <xs:simpleContent>
      <xs:extension base="dcml:RationalType">
         <xs:attribute name="eventscope" type="xs:anyURI" use="optional" default="http://www.smpte-ra.org/schemas/433/2008/dcmlTypes#rate-scope-tokens"/>
         <xs:attribute name="event" type="xs:token" use="optional"/>
         <xs:attribute name="period" type="dcml:timeUnitToken" use="required"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Device Identifier Types Union -->
<xs:simpleType name="deviceIdentifierUnion">
   <xs:union memberTypes="dcml:UUIDType ds:DigestValueType"/>
</xs:simpleType>

<!-- Device Identifier Type (polymorphic) -->
<xs:complexType name="deviceIdentifierPolyType">
   <xs:simpleContent>
      <xs:extension base="dcml:deviceIdentifierUnion">
         <xs:attribute name="idtype" use="required">
            <xs:simpleType>
               <xs:restriction base="xs:token">
                  <xs:enumeration value="DeviceUID"/>
                  <xs:enumeration value="CertThumbprint"/>
               </xs:restriction>
            </xs:simpleType>
         </xs:attribute>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Device Identifier List Wrapper Type -->
<xs:complexType name="deviceIdentifierListType">
   <xs:sequence>
      <xs:element name="PrimaryID" type="dcml:deviceIdentifierPolyType"/>
      <xs:element name="SecondaryID" type="dcml:deviceIdentifierPolyType" minOccurs="0"/>
   </xs:sequence>
</xs:complexType>

<!-- Device Type Identifier Type -->
<xs:complexType name="deviceTypeType">
   <xs:simpleContent>
      <xs:extension base="xs:token">
         <xs:attribute name="scope" type="xs:anyURI" use="optional" default="http://www.smpte-ra.org/schemas/433/2008/dcmlTypes/#device-type-tokens"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Scoped Token Type -->
<xs:complexType name="scopedTokenType">
   <xs:simpleContent>
      <xs:extension base="xs:token">
         <xs:attribute name="scope" type="xs:anyURI" use="optional"/>
      </xs:extension>
   </xs:simpleContent>
</xs:complexType>

<!-- Named Parameter Type -->
<xs:complexType name="namedParmType">
   <xs:sequence>
      <xs:element name="Name" type="dcml:scopedTokenType"/>
	  <xs:element name="Value" type="xs:anyType"/>
<!--      <xs:any namespace="##any" processContents="lax"/> -->
   </xs:sequence>
</xs:complexType>

<!-- Parameter List Type -->
<xs:complexType name="parameterListType">
   <xs:sequence>
      <xs:element name="Parameter" type="dcml:namedParmType" minOccurs="1" maxOccurs="unbounded"/>
   </xs:sequence>
</xs:complexType>

<!-- Name/Value Group for Strings naming Strings -->
<xs:group name="strstrNameValueGroup">
   <xs:sequence>
      <xs:element name="Name" type="xs:string"/>
      <xs:element name="Value" type="xs:string"/>
   </xs:sequence>
</xs:group>

<!-- Version List Type (name/value) -->
<xs:complexType name="versionInfoListType">
   <xs:sequence>
      <xs:group ref="dcml:strstrNameValueGroup" minOccurs="1" maxOccurs="unbounded"/>
   </xs:sequence>
</xs:complexType>

<!-- Device Description Type -->
<xs:complexType name="deviceDescriptionType">
  <xs:sequence>
    <xs:element name="DeviceIdentifier" type="dcml:deviceIdentifierPolyType"/>
    <xs:element name="DeviceTypeID" type="dcml:deviceTypeType"/>
    <xs:element name="DeviceSubsystemTypeID" type="dcml:deviceTypeType" minOccurs="0"/>
	<xs:element name="AdditionalID" type="xs:anyType" minOccurs="0"/>
    <xs:element name="DeviceSerial" type="xs:string"/>
    <xs:element name="ManufacturerID" type="xs:anyURI" minOccurs="0"/>
    <xs:element name="ManufacturerCertID" type="ds:DigestValueType" minOccurs="0"/>
    <xs:element name="DeviceCertID" type="ds:DigestValueType" minOccurs="0"/>
    <xs:element name="ManufacturerName" type="xs:string" minOccurs="0"/>
    <xs:element name="DeviceName" type="xs:string" minOccurs="0"/>
    <xs:element name="ModelNumber" type="xs:string" minOccurs="0"/>
    <xs:element name="VersionInfo" type="dcml:versionInfoListType"/>
    <xs:element name="DeviceComment" type="dcml:UserTextType" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>

<!-- Test Elements - remove before publication -->
<xs:element name="DeviceIdentifierList" type="dcml:deviceIdentifierListType"/>
<xs:element name="DeviceDescription" type="dcml:deviceDescriptionType"/>

</xs:schema>