[
    uuid(90969BD6-0866-4E47-B5C8-A7C49D2E7C5E),
    version(2.00),
    helpstring("STD 2.0 Type Library (IEEE Std 1641)")
]
library STDBSC
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    //helper to forward declare interfaces and provide typedefs
    #define INTDECL( i )    interface I##i; typedef I##i* i

    INTDECL( Quantity );
	INTDECL( Physical );
    INTDECL( Signal );
    INTDECL( SignalFunction );
    INTDECL( PulseDefn );
    INTDECL( PulseDefns );

	//Base or Derived Physical Types
    typedef Physical Admittance;
    typedef Physical AmountOfInformation;
    typedef Physical AmountOfSubstance;
    typedef Physical Capacitance;
    typedef Physical Charge;
    typedef Physical Conductance;
    typedef Physical Current;
    typedef Physical Voltage;
    typedef Physical Resistance;
    typedef Physical Energy;
    typedef Physical Force;
    typedef Physical Frequency;
    typedef Physical Heat;
    typedef Physical Illuminance;
    typedef Physical Impedance;
    typedef Physical Inductance;
    typedef Physical Distance;
    typedef Physical LuminousFlux;
    typedef Physical LuminousIntensity;
    typedef Physical MagneticFlux;
    typedef Physical MagneticFluxDensity;
    typedef Physical Mass;
    typedef Physical PlaneAngle;
    typedef Physical Power;
    typedef Physical Pressure;
    typedef Physical Ratio;
    typedef Physical Reactance;
    typedef Physical SolidAngle;
    typedef Physical Susceptance;
    typedef Physical Temperature;
    typedef Physical Time;

    //Compound Types
    typedef Physical Acceleration;
    typedef Physical AngularAcceleration;
    typedef Physical AngularSpeed;
    typedef Physical Area;
    typedef Physical Concentration;
    typedef Physical CurrentDensity;
    typedef Physical DynamicViscosity;
    typedef Physical ElectricChargeDensity;
    typedef Physical ElectricFieldStrength;
    typedef Physical ElectricFluxDensity;
    typedef Physical EnergyDensity;
    typedef Physical Entropy;
    typedef Physical Exposure;
    typedef Physical HeatCapacity;
    typedef Physical HeatFluxDensity;
    typedef Physical Irradiance;
    typedef Physical KinematicViscosity;
    typedef Physical Luminance;
    typedef Physical MagneticFieldStrength;
    typedef Physical MassDensity;
    typedef Physical MassFlow;
    typedef Physical MolarEnergy;
    typedef Physical MolarEntropy;
    typedef Physical MolarHeatCapacity;
    typedef Physical MomentOfForce;
    typedef Physical MomentOfInertia;
    typedef Physical Momentum;
    typedef Physical Permeability;
    typedef Physical Permittivity;
    typedef Physical PowerDensity;
    typedef Physical Radiance;
    typedef Physical RadiantIntensity;
    typedef Physical SpecificEnergy;
    typedef Physical SpecificEntropy;
    typedef Physical SpecificHeatCapacity;
    typedef Physical SpecificVolume;
    typedef Physical Speed;
    typedef Physical SurfaceTension;
    typedef Physical ThermalConductivity;
    typedef Physical Volume;
    typedef Physical VolumeFlow;

    //custom attribute to represent default value of this property
    #define GUID_DEFAULTVALUE    F1905738-CBA3-4B2F-B27B-3632725CD303


//Quantity
    [
        object,
        uuid(E787B42B-6EF4-4A56-B905-29AB94EB42B2),
        dual,
        helpstring("IQuantity Interface"),
        pointer_default(unique)
    ]
    interface IQuantity : IDispatch
    {
        [id(DISPID_VALUE), propget, helpstring("Complete value of the Quantity.")]
            HRESULT value( [out, retval] VARIANT *pVal);
        [id(DISPID_VALUE), propput, helpstring("Complete value of the Quantity.")] 
            HRESULT value( [in] VARIANT newVal);
        [id(1), propget, helpstring("Magnitude of the Quantity.")] 
            HRESULT magnitude( [out,retval] double *pVal) ;
        [id(1), propput, helpstring("Magnitude of the Quantity.")] 
            HRESULT magnitude( [in] double newVal) ;
        [id(2), propget, helpstring("Unit of the Quantity.")] 
            HRESULT unit( [out,retval] BSTR *pVal);
		[id(3), propget, helpstring("Returns a Quantity, with the specified unit, that may be used to control this Quantity.")]
			HRESULT withUnit([in] BSTR unit, [out, retval] Quantity *pVal);
    };

//Physical
    [
        object,
        uuid(0EE927EB-D718-4FFB-88F5-BD055BDA9B56),
        dual,
        helpstring("IPhysical Interface"),
        pointer_default(unique)
    ]
    interface IPhysical : IQuantity
    {
        enum {PHYSICAL_BASE=16};

		typedef enum _ERRLMT_TYPE {UL=0, LL} ERRLMT_TYPE;
		typedef enum _RANGE_TYPE {MAX=0, MIN} RANGE_TYPE;
        typedef enum _QUALIFIER_TYPE {trms=0, pk_pk, pk, pk_pos=pk, pk_neg, av, inst, inst_max, inst_min } QUALIFIER_TYPE;

        [id(PHYSICAL_BASE+0), propget, helpstring("Value qualifier")] 
            HRESULT qualifier([out,retval] QUALIFIER_TYPE *pRel);
        [id(PHYSICAL_BASE+0), propput, helpstring("Value qualifier")] 
            HRESULT qualifier([in] QUALIFIER_TYPE newVal);
		[id(PHYSICAL_BASE+1), propget, helpstring("Range of values that this Physical is expected to take.")] 
            HRESULT range([in, defaultvalue(MAX)] RANGE_TYPE index, [out,retval] Quantity *pVal);
        [id(PHYSICAL_BASE+2), propget, helpstring("Error limit (or uncertainty) of the value.")] 
            HRESULT errlmt([in, defaultvalue(UL)] ERRLMT_TYPE index, [out,retval] Quantity *pVal);
		[id(PHYSICAL_BASE+3), propget, helpstring("Level of confidence associated with the error limit (or uncertainty) of the value.")] 
            HRESULT confidence([out,retval] Quantity *pVal);
		[id(PHYSICAL_BASE+4), propget, helpstring("Resolution (or granularity) of this Physical.")] 
            HRESULT resolution([out,retval] Quantity *pVal);
        [id(PHYSICAL_BASE+5), propget, helpstring("Load value applied when converting between different units (e.g. voltage and power).")] 
            HRESULT load_([out,retval] Quantity *pVal);
    };

//ISignal
    [
        object,
        uuid(CD3C2116-5FAB-4972-93CC-C05A766C9347),
        dual,
        helpstring("Signal Interface"),
        pointer_default(unique)
    ]
    interface ISignal : IDispatch
    {
        typedef enum _SIGNAL_STATE {STOPPED=0, PAUSED, RUNNING, ACTIVE=RUNNING} SIGNAL_STATE;

        [propget, id(DISPID_NEWENUM), restricted, helpstring("Enumerator")]
            HRESULT _NewEnum([out, retval] IUnknown** ppUnk);
        [propget, id(DISPID_VALUE), helpstring("property SignalFunction")]
            HRESULT SignalFunction([out, retval] SignalFunction* pVal);
        [propget, id(1), helpstring("property State"), bindable, requestedit]
            HRESULT state([out, retval] SIGNAL_STATE *pVal);
        [id(2), helpstring("method Stop")] HRESULT Stop([in, defaultvalue(0)]long timeOut);
        [id(3), helpstring("method Run")] HRESULT Run([in, defaultvalue(0)]long timeOut);
        [id(4), helpstring("method Change")] HRESULT Change([in, defaultvalue(0)]long timeOut);
    };

	
//ISFCollection
    [
        object,
        uuid(FAFB0CFA-2EEE-4d81-A84F-4B9F6AD0FEA7),
        dual,
        helpstring("ISFCollection Interface"),
        pointer_default(unique)
    ]
    interface ISFCollection : IDispatch
    {
        [propget, id(DISPID_NEWENUM), restricted, helpstring("Enumerator")]
            HRESULT _NewEnum([out, retval] IUnknown** ppUnk);
		[id(DISPID_VALUE), helpstring("Returns the specified sub-item of the SignalFunction.")]
			HRESULT Item([in] VARIANT varItem, [out, retval] SignalFunction* pVal);
		[propget, id(1), helpstring("Returns the number of sub-items of the SignalFunction.")]
			HRESULT count([out, retval] long* pVal);
	}


//ISignalFunction
    [
        object,
        uuid(A29E2136-E439-4A76-B505-6C4F8DD61095),
        dual,
        helpstring("ISignalFunction Interface"),
        pointer_default(unique)
    ]
    interface ISignalFunction : IDispatch
    {
        enum {SIGNALFUNCTION_BASE=0};

		[propget, id(DISPID_VALUE), helpstring("Returns a collection of sub-items of this SignalFunction.")]
			HRESULT SignalFunctions([out, retval] ISFCollection** pVal);
        [propget, id(1), helpstring("property name")]
            HRESULT name([out, retval] BSTR *pVal);
        [propget, id(2), helpstring("property Out")]
            HRESULT Out([in, defaultvalue(0)] long at, [out, retval] Signal *pVal);
        [propget, id(3), helpstring("property In")]
            HRESULT In([in, defaultvalue(0)] long at, [out, retval] Signal *pVal);
        [propputref, id(3), helpstring("property In")]
            HRESULT In([in, defaultvalue(0)] long at, [in] Signal newVal);
        [propget, id(4), helpstring("property Sync")]
            HRESULT Sync([out, retval] Signal *pVal);
        [propputref, id(4), helpstring("property Sync")]
            HRESULT Sync([in] Signal newVal);
        [propget, id(5), helpstring("property Gate")]
            HRESULT Gate([out, retval] Signal *pVal);
        [propputref, id(5), helpstring("property Gate")]
            HRESULT Gate([in] Signal newVal);
        [propget, id(6), helpstring("property Conn")]
            HRESULT Conn([in, defaultvalue(0)] long at, [out, retval] Signal *pVal);
        [propputref, id(6), helpstring("property Conn")]
            HRESULT Conn([in, defaultvalue(0)] long at, [in] Signal newVal);
		[propget, id(7), helpstring("Named attribute of the SignalFunction.")]
			HRESULT attribute([in] BSTR name, [out, retval] VARIANT *pVal);
        [propget, id(8), helpstring("property pinsIn")]
            HRESULT pinsIn([out, retval] BSTR *pVal);
        [propput, id(8), helpstring("property pinsIn")]
            HRESULT pinsIn([in] BSTR newVal);
        [propget, id(9), helpstring("property pinsOut")]
            HRESULT pinsOut([out, retval] BSTR *pVal);
        [propput, id(9), helpstring("property pinsOut")]
            HRESULT pinsOut([in] BSTR newVal);
        [propget, id(10), helpstring("property pinsSync")]
            HRESULT pinsSync([out, retval] BSTR *pVal);
        [propput, id(10), helpstring("property pinsSync")]
            HRESULT pinsSync([in] BSTR newVal);
        [propget, id(11), helpstring("property pinsGate")]
            HRESULT pinsGate([out, retval] BSTR *pVal);
        [propput, id(11), helpstring("property pinsGate")]
            HRESULT pinsGate([in] BSTR newVal);
    };


//PulseDefn
    [
        object,
        uuid(4699C2FD-4A8C-4636-8883-1C21AE9D9D7D),
        dual,
        helpstring("IPulseDefn Interface"),
        pointer_default(unique)
    ]
    interface IPulseDefn : IDispatch
    {
        [propget, id(DISPID_VALUE), helpstring("pulse data")]
            HRESULT value([out, retval] BSTR *pVal);
        [propput, id(DISPID_VALUE), helpstring("pulse data")]
            HRESULT value([in] BSTR newVal);
        [propget, id(1), helpstring("start of pulse")]
            HRESULT start([out, retval, custom(GUID_DEFAULTVALUE, "0s")] Physical *pVal);
        [propget, id(2), helpstring("width of pulse")]
            HRESULT pulseWidth([out, retval, custom(GUID_DEFAULTVALUE, "0s")] Physical *pVal);
        [propput, id(3), helpstring("level multiplication factor of pulse")]
            HRESULT levelFactor([in] double newVal);
        [propget, id(3), helpstring("level multiplication factor of pulse")]
            HRESULT levelFactor([out, retval] double *pVal);
        [propget, id(4), helpstring("name of pulse")]
            HRESULT name([out, retval] BSTR *pVal);
        [propput, id(4), helpstring("name of pulse")]
            HRESULT name([in] BSTR newVal);
    };


//PulseDefns
    [
        object,
        uuid(FB13334A-4977-4F41-BFDD-927AD343DDCF),
        dual,
        helpstring("IPulseDefns Interface"),
        pointer_default(unique)
    ]
    interface IPulseDefns : IDispatch
    {
        [propget, id(DISPID_NEWENUM), restricted, helpstring("Enumerator")]
            HRESULT _NewEnum([out, retval] IUnknown** ppUnk);
        [propget, id(DISPID_VALUE), helpstring("Get item from collection")]
            HRESULT item([in] VARIANT varItem, [out, retval] PulseDefn* pVal);
        [propget, id(1), helpstring("Get count of items in collection")]
            HRESULT count([out, retval] long* pVal);
        [propget, id(2), helpstring("All pulses")]
            HRESULT value([out, retval] BSTR* pVal);
        [propput, id(2), helpstring("All pulses")]
            HRESULT value([in] BSTR newVal);
        [id(3), helpstring("Add a new pulse to collection")]
            HRESULT Add([in, defaultvalue("")] BSTR bstrName, [out, retval] PulseDefn* pVal);
        [id(4), helpstring("Remove a pulse from collection")]
            HRESULT Remove([in] VARIANT varItem);
    };


//ResourceManager
    [
        uuid(ECEFEC25-E7F5-4A2C-8F23-2345E613254D),
        helpstring("ResourceManager Class")
    ]
    coclass ResourceManager
    {
        [default] interface IResourceManager;
    };
    [
        object,
        uuid(8D64DAFF-02E9-4607-BCE3-CA706DB9FF94),
        dual,
        helpstring("ResourceManager Interface"),
        pointer_default(unique)
    ]
    interface IResourceManager : IDispatch
    {
        [id(1), helpstring("method Require - obtains a SignalFunction Interface")]
            HRESULT Require([in] BSTR SignalDescriptor, 
                [in, defaultvalue(0)] VARIANT UniqueId,
                [out, retval] SignalFunction *pVal);
    };

//Source
    [
        uuid(51BDD5C9-E2BC-4A2E-9B3E-464B0086CA8D),
        helpstring("Source class"),
        noncreatable
    ]
    coclass Source
    {
        [default] interface ISource;
    };
    [
        object,
        uuid(430C3ADB-DEDF-494B-ABCC-C84CAB7AF127),
        dual,
        helpstring("ISource Interface"),
        pointer_default(unique)
    ]
    interface ISource : ISignalFunction 
    {
        enum {SOURCE_BASE=(SIGNALFUNCTION_BASE+256)};
    };


//NonPeriodic
    [
        uuid(8DA3B6E3-1602-467F-AA58-36A95B918E93),
        helpstring("NonPeriodic class"),
        noncreatable
    ]
    coclass NonPeriodic
    {
        [default] interface INonPeriodic;
    };
    [
        object,
        uuid(970C5951-3766-4F02-A62E-3BE10557C69E),
        dual,
        helpstring("INonPeriodic Interface"),
        pointer_default(unique)
    ]
    interface INonPeriodic : ISource 
    {
        enum {NONPERIODIC_BASE=(SOURCE_BASE+256)};
    };


//Constant<type>
    [
        uuid(27B7EA2F-EB66-44C1-AAC4-2965294E87D0),
        helpstring("Constant class"),
        noncreatable
    ]
    coclass Constant
    {
        [default] interface IConstant;
    };
    [
        object,
        uuid(F258C437-8372-4857-8066-540A93734D01),
        dual,
        helpstring("IConstant Interface"),
        pointer_default(unique)
    ]
    interface IConstant : INonPeriodic 
    {
        enum {CONSTANT_BASE=(NONPERIODIC_BASE+256)};

        [propget, id(CONSTANT_BASE+1), helpstring("the level of the signal.")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(CONSTANT_BASE+1), helpstring("the level of the signal.")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
    };


//Step<type>
    [
        uuid(239404D6-5822-4DF4-9A10-E58E73941DCD),
        helpstring("Step class"),
        noncreatable
    ]
    coclass Step
    {
        [default] interface IStep;
    };
    [
        object,
        uuid(C54E2283-D6C7-4DFA-842F-E432D5E193BC),
        dual,
        helpstring("IStep Interface"),
        pointer_default(unique)
    ]
    interface IStep : INonPeriodic 
    {
        enum {STEP_BASE=(NONPERIODIC_BASE+256)};

        [propget, id(STEP_BASE+1), helpstring("final value of step signal")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(STEP_BASE+1), helpstring("final value of step signal")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(STEP_BASE+2), helpstring("defines when the step transition starts")] 
            HRESULT startTime([out, retval, custom(GUID_DEFAULTVALUE, "0.5s")] Time *pVal);
        [propputref, id(STEP_BASE+2), helpstring("defines when the step transition starts")] 
            HRESULT startTime([in, custom(GUID_DEFAULTVALUE, "0.5s")] Time newVal);
    };


//SingleTrapezoid<type>
    [
        uuid(0175402A-06FB-478E-B488-C04F909DE8DE),
        helpstring("SingleTrapezoid class"),
        noncreatable
    ]
    coclass SingleTrapezoid
    {
        [default] interface ISingleTrapezoid;
    };
    [
        object,
        uuid(F8DAE7E4-6907-4376-89D8-49034D6F107B),
        dual,
        helpstring("ISingleTrapezoid Interface"),
        pointer_default(unique)
    ]
    interface ISingleTrapezoid : INonPeriodic 
    {
        enum {SINGLETRAPEZOID_BASE=(NONPERIODIC_BASE+256)};

        [propget, id(SINGLETRAPEZOID_BASE+1), helpstring("value of pulse amplitude")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SINGLETRAPEZOID_BASE+1), helpstring("value of pulse amplitude")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SINGLETRAPEZOID_BASE+2), helpstring("time at which trapezoid starts relative to it initialization")] 
            HRESULT startTime([out, retval, custom(GUID_DEFAULTVALUE, "0s")] Time *pVal);
        [propputref, id(SINGLETRAPEZOID_BASE+2), helpstring("time at which trapezoid starts relative to it initialization")] 
            HRESULT startTime([in, custom(GUID_DEFAULTVALUE, "0s")] Time newVal);
        [propget, id(SINGLETRAPEZOID_BASE+3), helpstring("time taken to reach amplitude")] 
            HRESULT riseTime([out, retval, custom(GUID_DEFAULTVALUE, "0.25s")] Time *pVal);
        [propputref, id(SINGLETRAPEZOID_BASE+3), helpstring("time taken to reach amplitude")] 
            HRESULT riseTime([in, custom(GUID_DEFAULTVALUE, "0.25s")] Time newVal);
        [propget, id(SINGLETRAPEZOID_BASE+4), helpstring("time that trapezoid is stable at amplitude")] 
            HRESULT pulseWidth([out, retval, custom(GUID_DEFAULTVALUE, "0.5s")] Time *pVal);
        [propputref, id(SINGLETRAPEZOID_BASE+4), helpstring("time that trapezoid is stable at amplitude")] 
            HRESULT pulseWidth([in, custom(GUID_DEFAULTVALUE, "0.5s")] Time newVal);
        [propget, id(SINGLETRAPEZOID_BASE+5), helpstring("Time taken to fall back to transient state")] 
            HRESULT fallTime([out, retval, custom(GUID_DEFAULTVALUE, "0.25s")] Time *pVal);
        [propputref, id(SINGLETRAPEZOID_BASE+5), helpstring("Time taken to fall back to transient state")] 
            HRESULT fallTime([in, custom(GUID_DEFAULTVALUE, "0.25s")] Time newVal);
    };


//Noise<type>
    [
        uuid(D2E83452-3A38-4F26-BB2A-7A821EA641C5),
        helpstring("Noise class"),
        noncreatable
    ]
    coclass Noise
    {
        [default] interface INoise;
    };
    [
        object,
        uuid(D398D3B5-8338-4523-A321-AC5A4858C9B4),
        dual,
        helpstring("INoise Interface"),
        pointer_default(unique)
    ]
    interface INoise : INonPeriodic 
    {
        enum {NOISE_BASE=(NONPERIODIC_BASE+256)};

        [propget, id(NOISE_BASE+1), helpstring("property amplitude")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(NOISE_BASE+1), helpstring("property amplitude")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(NOISE_BASE+2), helpstring("used for pseudo-random noise")] 
            HRESULT seed([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(NOISE_BASE+2), helpstring("used for pseudo-random noise")] 
            HRESULT seed([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
        [propget, id(NOISE_BASE+3), helpstring("upper bound frequency bandwidth for transient disturbances")] 
            HRESULT frequency([out, retval, custom(GUID_DEFAULTVALUE, "50 Hz")] Frequency *pVal);
        [propputref, id(NOISE_BASE+3), helpstring("upper bound frequency bandwidth for transient disturbances")] 
            HRESULT frequency([in, custom(GUID_DEFAULTVALUE, "50 Hz")] Frequency newVal);
    };


//SingleRamp<type>
    [
        uuid(14C6299E-392A-410E-B40B-DAD8FFE267D4),
        helpstring("SingleRamp class"),
        noncreatable
    ]
    coclass SingleRamp
    {
        [default] interface ISingleRamp;
    };
    [
        object,
        uuid(CB72B784-0955-40AF-B1B6-064635F747CA),
        dual,
        helpstring("ISingleRamp Interface"),
        pointer_default(unique)
    ]
    interface ISingleRamp : INonPeriodic 
    {
        enum {SINGLERAMP_BASE=(NONPERIODIC_BASE+256)};

        [propget, id(SINGLERAMP_BASE+1), helpstring("final value of ramp signal")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SINGLERAMP_BASE+1), helpstring("final value of ramp signal")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SINGLERAMP_BASE+2), helpstring("time for signal to reach final value")] 
            HRESULT riseTime([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(SINGLERAMP_BASE+2), helpstring("time for signal to reach final value")] 
            HRESULT riseTime([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(SINGLERAMP_BASE+3), helpstring("defines when the step transition starts")] 
            HRESULT startTime([out, retval, custom(GUID_DEFAULTVALUE, "0s")] Time *pVal);
        [propputref, id(SINGLERAMP_BASE+3), helpstring("defines when the step transition starts")] 
            HRESULT startTime([in, custom(GUID_DEFAULTVALUE, "0s")] Time newVal);
    };


//Periodic
    [
        uuid(9EBA4C48-5272-4262-87D4-7248882104C3),
        helpstring("Periodic class"),
        noncreatable
    ]
    coclass Periodic
    {
        [default] interface IPeriodic;
    };
    [
        object,
        uuid(018A6BC8-4976-4F3B-8BE1-6FAC0B3CB859),
        dual,
        helpstring("IPeriodic Interface"),
        pointer_default(unique)
    ]
    interface IPeriodic : ISource 
    {
        enum {PERIODIC_BASE=(SOURCE_BASE+256)};
    };


//Sinusoid<type>
    [
        uuid(466D69F4-6703-44D7-A398-4CE0311B0230),
        helpstring("Sinusoid class"),
        noncreatable
    ]
    coclass Sinusoid
    {
        [default] interface ISinusoid;
    };
    [
        object,
        uuid(9A99E6C6-33CF-4314-83F3-C4F719AD9191),
        dual,
        helpstring("ISinusoid Interface"),
        pointer_default(unique)
    ]
    interface ISinusoid : IPeriodic 
    {
        enum {SINUSOID_BASE=(PERIODIC_BASE+256)};

        [propget, id(SINUSOID_BASE+1), helpstring("Amplitude")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SINUSOID_BASE+1), helpstring("Amplitude")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SINUSOID_BASE+2), helpstring("Frequency")] 
            HRESULT frequency([out, retval, custom(GUID_DEFAULTVALUE, "1Hz")] Frequency *pVal);
        [propputref, id(SINUSOID_BASE+2), helpstring("Frequency")] 
            HRESULT frequency([in, custom(GUID_DEFAULTVALUE, "1Hz")] Frequency newVal);
        [propget, id(SINUSOID_BASE+3), helpstring("initial phase angle")] 
            HRESULT phase([out, retval, custom(GUID_DEFAULTVALUE, "0 rad")] PlaneAngle *pVal);
        [propputref, id(SINUSOID_BASE+3), helpstring("initial phase angle")] 
            HRESULT phase([in, custom(GUID_DEFAULTVALUE, "0 rad")] PlaneAngle newVal);
    };


//Trapezoid<type>
    [
        uuid(DE85D766-2B24-49F8-904A-D5EB00C0B9A7),
        helpstring("Trapezoid class"),
        noncreatable
    ]
    coclass Trapezoid
    {
        [default] interface ITrapezoid;
    };
    [
        object,
        uuid(6D74050C-1472-4E2B-ABD6-924CC40BD7D7),
        dual,
        helpstring("ITrapezoid Interface"),
        pointer_default(unique)
    ]
    interface ITrapezoid : IPeriodic 
    {
        enum {TRAPEZOID_BASE=(PERIODIC_BASE+256)};

        [propget, id(TRAPEZOID_BASE+1), helpstring("value of pulse amplitude")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(TRAPEZOID_BASE+1), helpstring("value of pulse amplitude")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(TRAPEZOID_BASE+2), helpstring("time in which the signal repeats itself")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1 s")] Time *pVal);
        [propputref, id(TRAPEZOID_BASE+2), helpstring("time in which the signal repeats itself")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1 s")] Time newVal);
        [propget, id(TRAPEZOID_BASE+3), helpstring("time taken to reach amplitude")] 
            HRESULT riseTime([out, retval, custom(GUID_DEFAULTVALUE, "0.25 s")] Time *pVal);
        [propputref, id(TRAPEZOID_BASE+3), helpstring("time taken to reach amplitude")] 
            HRESULT riseTime([in, custom(GUID_DEFAULTVALUE, "0.25 s")] Time newVal);
        [propget, id(TRAPEZOID_BASE+4), helpstring("time that trapezoid is stable at amplitude")] 
            HRESULT pulseWidth([out, retval, custom(GUID_DEFAULTVALUE, "0.5 s")] Time *pVal);
        [propputref, id(TRAPEZOID_BASE+4), helpstring("time that trapezoid is stable at amplitude")] 
            HRESULT pulseWidth([in, custom(GUID_DEFAULTVALUE, "0.5 s")] Time newVal);
        [propget, id(TRAPEZOID_BASE+5), helpstring("Time taken to fall back to transiant state")] 
            HRESULT fallTime([out, retval, custom(GUID_DEFAULTVALUE, "0.25 s")] Time *pVal);
        [propputref, id(TRAPEZOID_BASE+5), helpstring("Time taken to fall back to transiant state")] 
            HRESULT fallTime([in, custom(GUID_DEFAULTVALUE, "0.25 s")] Time newVal);
    };


//Ramp<type>
    [
        uuid(ACB520CA-832B-46B0-AE65-26345D31D97F),
        helpstring("Ramp class"),
        noncreatable
    ]
    coclass Ramp
    {
        [default] interface IRamp;
    };
    [
        object,
        uuid(DF0F26DF-F76B-4FA3-99EC-8F1960E90C8D),
        dual,
        helpstring("IRamp Interface"),
        pointer_default(unique)
    ]
    interface IRamp : IPeriodic 
    {
        enum {RAMP_BASE=(PERIODIC_BASE+256)};

        [propget, id(RAMP_BASE+1), helpstring("final level of the signal")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(RAMP_BASE+1), helpstring("final level of the signal")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(RAMP_BASE+2), helpstring("time is which signal repeats itself")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(RAMP_BASE+2), helpstring("time is which signal repeats itself")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(RAMP_BASE+3), helpstring("Rise Time of ramp signal")] 
            HRESULT riseTime([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(RAMP_BASE+3), helpstring("Rise Time of ramp signal")] 
            HRESULT riseTime([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
    };


//Triangle<type>
    [
        uuid(47AA39EA-C951-49C1-8750-63648804FEB5),
        helpstring("Triangle class"),
        noncreatable
    ]
    coclass Triangle
    {
        [default] interface ITriangle;
    };
    [
        object,
        uuid(957DF91B-25C4-4DF9-B4D4-25949F4A9A79),
        dual,
        helpstring("ITriangle Interface"),
        pointer_default(unique)
    ]
    interface ITriangle : IPeriodic 
    {
        enum {TRIANGLE_BASE=(PERIODIC_BASE+256)};

        [propget, id(TRIANGLE_BASE+1), helpstring("maximum amplitude level of the signal")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(TRIANGLE_BASE+1), helpstring("maximum amplitude level of the signal")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(TRIANGLE_BASE+2), helpstring("time in which signal repeats itself")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(TRIANGLE_BASE+2), helpstring("time in which signal repeats itself")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(TRIANGLE_BASE+3), helpstring("ratio between time taken to increase from its minimum to its maximum value and the time for one period    ")] 
            HRESULT dutyCycle([out, retval, custom(GUID_DEFAULTVALUE, "50%")] Ratio *pVal);
        [propputref, id(TRIANGLE_BASE+3), helpstring("ratio between time taken to increase from its minimum to its maximum value and the time for one period    ")] 
            HRESULT dutyCycle([in, custom(GUID_DEFAULTVALUE, "50%")] Ratio newVal);
    };


//SquareWave<type>
    [
        uuid(76CCA77F-060E-4887-BD1C-DEE30CD417D6),
        helpstring("SquareWave class"),
        noncreatable
    ]
    coclass SquareWave
    {
        [default] interface ISquareWave;
    };
    [
        object,
        uuid(EFA62305-4B90-4695-9359-CD8EB7CE01E0),
        dual,
        helpstring("ISquareWave Interface"),
        pointer_default(unique)
    ]
    interface ISquareWave : IPeriodic 
    {
        enum {SQUAREWAVE_BASE=(PERIODIC_BASE+256)};

        [propget, id(SQUAREWAVE_BASE+1), helpstring("Amplitude of signal")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SQUAREWAVE_BASE+1), helpstring("Amplitude of signal")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SQUAREWAVE_BASE+2), helpstring("period of signal")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(SQUAREWAVE_BASE+2), helpstring("period of signal")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(SQUAREWAVE_BASE+3), helpstring("duty cycle of the wave")] 
            HRESULT dutyCycle([out, retval, custom(GUID_DEFAULTVALUE, "50%")] Ratio *pVal);
        [propputref, id(SQUAREWAVE_BASE+3), helpstring("duty cycle of the wave")] 
            HRESULT dutyCycle([in, custom(GUID_DEFAULTVALUE, "50%")] Ratio newVal);
    };


//WaveformRamp<type>
    [
        uuid(76789676-E946-442D-8010-1BD05A55A979),
        helpstring("WaveformRamp class"),
        noncreatable
    ]
    coclass WaveformRamp
    {
        [default] interface IWaveformRamp;
    };
    [
        object,
        uuid(207CBDD1-C77A-4052-9D4A-77B80E8483C1),
        dual,
        helpstring("IWaveformRamp Interface"),
        pointer_default(unique)
    ]
    interface IWaveformRamp : IPeriodic 
    {
        enum {WAVEFORMRAMP_BASE=(PERIODIC_BASE+256)};

        [propget, id(WAVEFORMRAMP_BASE+1), helpstring("amplitude of the output signal where the level factor (in points) ")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "1")] Physical *pVal);
        [propputref, id(WAVEFORMRAMP_BASE+1), helpstring("amplitude of the output signal where the level factor (in points) ")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "1")] Physical newVal);
        [propget, id(WAVEFORMRAMP_BASE+2), helpstring("the time between each sequence    ")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(WAVEFORMRAMP_BASE+2), helpstring("the time between each sequence    ")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(WAVEFORMRAMP_BASE+3), helpstring("the time between successive (points) outputs    ")] 
            HRESULT samplingInterval([out, retval, custom(GUID_DEFAULTVALUE, "0")] Time *pVal);
        [propputref, id(WAVEFORMRAMP_BASE+3), helpstring("the time between successive (points) outputs    ")] 
            HRESULT samplingInterval([in, custom(GUID_DEFAULTVALUE, "0")] Time newVal);
        [propget, id(WAVEFORMRAMP_BASE+4), helpstring("level factor of each waveform sample")] 
            HRESULT points([out, retval] SAFEARRAY(VARIANT) *pVal);
        [propput, id(WAVEFORMRAMP_BASE+4), helpstring("level factor of each waveform sample")] 
            HRESULT points([in] SAFEARRAY(VARIANT) newVal);
    };


//WaveformStep<type>
    [
        uuid(3F1D0EB2-A686-4A14-89DB-FA1DD22DE9A3),
        helpstring("WaveformStep class"),
        noncreatable
    ]
    coclass WaveformStep
    {
        [default] interface IWaveformStep;
    };
    [
        object,
        uuid(4E95D811-E80C-46AF-8EE8-1F539C55E961),
        dual,
        helpstring("IWaveformStep Interface"),
        pointer_default(unique)
    ]
    interface IWaveformStep : IPeriodic 
    {
        enum {WAVEFORMSTEP_BASE=(PERIODIC_BASE+256)};

        [propget, id(WAVEFORMSTEP_BASE+1), helpstring("amplitude of the output signal where the level factor (in points) ")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "1")] Physical *pVal);
        [propputref, id(WAVEFORMSTEP_BASE+1), helpstring("amplitude of the output signal where the level factor (in points) ")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "1")] Physical newVal);
        [propget, id(WAVEFORMSTEP_BASE+2), helpstring("the time between each sequence")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(WAVEFORMSTEP_BASE+2), helpstring("the time between each sequence")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(WAVEFORMSTEP_BASE+3), helpstring("the time between successive (points) outputs    ")] 
            HRESULT samplingInterval([out, retval, custom(GUID_DEFAULTVALUE, "0")] Time *pVal);
        [propputref, id(WAVEFORMSTEP_BASE+3), helpstring("the time between successive (points) outputs    ")] 
            HRESULT samplingInterval([in, custom(GUID_DEFAULTVALUE, "0")] Time newVal);
        [propget, id(WAVEFORMSTEP_BASE+4), helpstring("level factor of each waveform sample    ")] 
            HRESULT points([out, retval] SAFEARRAY(VARIANT) *pVal);
        [propput, id(WAVEFORMSTEP_BASE+4), helpstring("level factor of each waveform sample    ")] 
            HRESULT points([in] SAFEARRAY(VARIANT) newVal);
    };


//Conditioner
    [
        uuid(C9C4F780-E747-4C4E-9E62-3B57AA3C6A27),
        helpstring("Conditioner class"),
        noncreatable
    ]
    coclass Conditioner
    {
        [default] interface IConditioner;
    };
    [
        object,
        uuid(F68AE946-0F6F-4848-AFED-24A1BE9B0DD9),
        dual,
        helpstring("IConditioner Interface"),
        pointer_default(unique)
    ]
    interface IConditioner : ISignalFunction 
    {
        enum {CONDITIONER_BASE=(SIGNALFUNCTION_BASE+256)};
    };


//Filter
    [
        uuid(B72442DD-2C24-4466-AC4D-BB5AB980DF5F),
        helpstring("Filter class"),
        noncreatable
    ]
    coclass Filter
    {
        [default] interface IFilter;
    };
    [
        object,
        uuid(187379E4-F6B6-4534-A43F-0898670992E4),
        dual,
        helpstring("IFilter Interface"),
        pointer_default(unique)
    ]
    interface IFilter : IConditioner 
    {
        enum {FILTER_BASE=(CONDITIONER_BASE+256)};
    };


//BandPass
    [
        uuid(A046CB02-6104-43D7-BB1E-0F739E92F72D),
        helpstring("BandPass class"),
        noncreatable
    ]
    coclass BandPass
    {
        [default] interface IBandPass;
    };
    [
        object,
        uuid(645F5EA9-EF2F-4E85-8C3E-BE391E0AED55),
        dual,
        helpstring("IBandPass Interface"),
        pointer_default(unique)
    ]
    interface IBandPass : IFilter 
    {
        enum {BANDPASS_BASE=(FILTER_BASE+256)};

        [propget, id(BANDPASS_BASE+1), helpstring("Center frequency of the filter's band")] 
            HRESULT centerFrequency([out, retval, custom(GUID_DEFAULTVALUE, "0")] Frequency *pVal);
        [propputref, id(BANDPASS_BASE+1), helpstring("Center frequency of the filter's band")] 
            HRESULT centerFrequency([in, custom(GUID_DEFAULTVALUE, "0")] Frequency newVal);
        [propget, id(BANDPASS_BASE+2), helpstring("Bandwidth of filter. Zero implies narrowest band ")] 
            HRESULT frequencyBand([out, retval, custom(GUID_DEFAULTVALUE, "0")] Frequency *pVal);
        [propputref, id(BANDPASS_BASE+2), helpstring("Bandwidth of filter. Zero implies narrowest band ")] 
            HRESULT frequencyBand([in, custom(GUID_DEFAULTVALUE, "0")] Frequency newVal);
    	[propget, id(BANDPASS_BASE+3), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(BANDPASS_BASE+3), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(BANDPASS_BASE+4), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(BANDPASS_BASE+4), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(BANDPASS_BASE+5), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(BANDPASS_BASE+5), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(BANDPASS_BASE+6), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(BANDPASS_BASE+6), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
	};


//LowPass
    [
        uuid(1A91B537-175D-4CB6-8D74-19BCCF06C7D6),
        helpstring("LowPass class"),
        noncreatable
    ]
    coclass LowPass
    {
        [default] interface ILowPass;
    };
    [
        object,
        uuid(81E93D0F-4B9C-47D2-9EA8-EA37F4A29108),
        dual,
        helpstring("ILowPass Interface"),
        pointer_default(unique)
    ]
    interface ILowPass : IFilter 
    {
        enum {LOWPASS_BASE=(FILTER_BASE+256)};

        [propget, id(LOWPASS_BASE+1), helpstring("Cut off frequency filter. Zero implies DC offset")] 
            HRESULT cutoff([out, retval, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency *pVal);
        [propputref, id(LOWPASS_BASE+1), helpstring("Cut off frequency filter. Zero implies DC offset")] 
            HRESULT cutoff([in, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency newVal);
    	[propget, id(LOWPASS_BASE+2), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(LOWPASS_BASE+2), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(LOWPASS_BASE+3), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(BANDPASS_BASE+3), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(LOWPASS_BASE+4), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(LOWPASS_BASE+4), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(LOWPASS_BASE+5), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(LOWPASS_BASE+5), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
	};


//HighPass
    [
        uuid(4CF9B1F3-ECF4-4D1E-AC45-7D2693206C69),
        helpstring("HighPass class"),
        noncreatable
    ]
    coclass HighPass
    {
        [default] interface IHighPass;
    };
    [
        object,
        uuid(C8D44D6F-D709-4D36-973E-1EA19FCE407D),
        dual,
        helpstring("IHighPass Interface"),
        pointer_default(unique)
    ]
    interface IHighPass : IFilter 
    {
        enum {HIGHPASS_BASE=(FILTER_BASE+256)};

        [propget, id(HIGHPASS_BASE+1), helpstring("Start frequency of filter. Zero implies AC Coupled")] 
            HRESULT cutoff([out, retval, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency *pVal);
        [propputref, id(HIGHPASS_BASE+1), helpstring("Start frequency of filter. Zero implies AC Coupled")] 
            HRESULT cutoff([in, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency newVal);
		[propget, id(HIGHPASS_BASE+2), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(HIGHPASS_BASE+2), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(HIGHPASS_BASE+3), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(BANDPASS_BASE+3), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(HIGHPASS_BASE+4), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(HIGHPASS_BASE+4), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(HIGHPASS_BASE+5), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(HIGHPASS_BASE+5), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
    };


//Notch
    [
        uuid(2ACBB30F-E7B1-42CF-AD84-70406AE35A13),
        helpstring("Notch class"),
        noncreatable
    ]
    coclass Notch
    {
        [default] interface INotch;
    };
    [
        object,
        uuid(4D829DE3-1F1F-42F2-8459-45B39225E725),
        dual,
        helpstring("INotch Interface"),
        pointer_default(unique)
    ]
    interface INotch : IFilter 
    {
        enum {NOTCH_BASE=(FILTER_BASE+256)};

        [propget, id(NOTCH_BASE+1), helpstring("Center frrequency of the filter's notch")] 
            HRESULT centerFrequency([out, retval, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency *pVal);
        [propputref, id(NOTCH_BASE+1), helpstring("Center frrequency of the filter's notch")] 
            HRESULT centerFrequency([in, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency newVal);
        [propget, id(NOTCH_BASE+2), helpstring("Frequency band of filter. Zero implies minimum band")] 
            HRESULT frequencyBand([out, retval, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency *pVal);
        [propputref, id(NOTCH_BASE+2), helpstring("Frequency band of filter. Zero implies minimum band")] 
            HRESULT frequencyBand([in, custom(GUID_DEFAULTVALUE, "0Hz")] Frequency newVal);
    	[propget, id(NOTCH_BASE+3), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(NOTCH_BASE+3), helpstring("Ratio defining the scaling factor for the signal in the pass band")] 
			HRESULT gain([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(NOTCH_BASE+4), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(NOTCH_BASE+4), helpstring("Rate at which the amplitude of the output signal will alter over frequency")] 
			HRESULT rollOff([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(NOTCH_BASE+5), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(NOTCH_BASE+5), helpstring("Maximum allowable variation in the amplitude of the passband signal")] 
			HRESULT passBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
		[propget, id(NOTCH_BASE+6), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
		[propputref, id(NOTCH_BASE+6), helpstring("Maximum allowable variation in the amplitude of the stopband signal")] 
			HRESULT stopBandRipple([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
	};


//Combiner
    [
        uuid(41ACF99D-37DE-4BFD-B1BE-C2E403829B92),
        helpstring("Combiner class"),
        noncreatable
    ]
    coclass Combiner
    {
        [default] interface ICombiner;
    };
    [
        object,
        uuid(24875EB1-9947-41F2-BB67-EFA21C73B82B),
        dual,
        helpstring("ICombiner Interface"),
        pointer_default(unique)
    ]
    interface ICombiner : IConditioner 
    {
        enum {COMBINER_BASE=(CONDITIONER_BASE+256)};
    };


//Sum
    [
        uuid(EC659EF0-E468-4920-AFD1-8634AC9ECE74),
        helpstring("Sum class"),
        noncreatable
    ]
    coclass Sum
    {
        [default] interface ISum;
    };
    [
        object,
        uuid(52FEAAFD-FD43-4D03-810E-869CC13F8169),
        dual,
        helpstring("ISum Interface"),
        pointer_default(unique)
    ]
    interface ISum : ICombiner 
    {
        enum {SUM_BASE=(COMBINER_BASE+256)};
    };


//Product
    [
        uuid(AD7F7630-1BB7-4ABA-91EF-8461D854FDEE),
        helpstring("Product class"),
        noncreatable
    ]
    coclass Product
    {
        [default] interface IProduct;
    };
    [
        object,
        uuid(1BE6446E-5F0D-4E71-B149-D2132B57520D),
        dual,
        helpstring("IProduct Interface"),
        pointer_default(unique)
    ]
    interface IProduct : ICombiner 
    {
        enum {PRODUCT_BASE=(COMBINER_BASE+256)};
    };


//Diff
    [
        uuid(D866BF99-85F2-443E-B4D3-71C3FDE32982),
        helpstring("Diff class"),
        noncreatable
    ]
    coclass Diff
    {
        [default] interface IDiff;
    };
    [
        object,
        uuid(0B697D2E-58F0-41CD-A16E-AD666ABD80AB),
        dual,
        helpstring("IDiff Interface"),
        pointer_default(unique)
    ]
    interface IDiff : ICombiner 
    {
        enum {DIFF_BASE=(COMBINER_BASE+256)};
    };


//Modulator
    [
        uuid(DFEDDD69-3ED5-41A4-A82A-1500FDB129C0),
        helpstring("Modulator class"),
        noncreatable
    ]
    coclass Modulator
    {
        [default] interface IModulator;
    };
    [
        object,
        uuid(1F5153DC-DE44-4503-9FA3-5932646B10A2),
        dual,
        helpstring("IModulator Interface"),
        pointer_default(unique)
    ]
    interface IModulator : IConditioner 
    {
        enum {MODULATOR_BASE=(CONDITIONER_BASE+256)};
    };


//FM
    [
        uuid(813F884A-A791-453F-B072-BC8B73CDA8D2),
        helpstring("FM class"),
        noncreatable
    ]
    coclass FM
    {
        [default] interface IFM;
    };
    [
        object,
        uuid(DAC2D929-A82F-4936-A06E-115C1A57ABFF),
        dual,
        helpstring("IFM Interface"),
        pointer_default(unique)
    ]
    interface IFM : IModulator 
    {
        enum {FM_BASE=(MODULATOR_BASE+256)};

        [propget, id(FM_BASE+1), helpstring("Amplitude of  Sinusoidal Carrier wave")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "1")] Physical *pVal);
        [propputref, id(FM_BASE+1), helpstring("Amplitude of  Sinusoidal Carrier wave")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "1")] Physical newVal);
        [propget, id(FM_BASE+2), helpstring("Frequency of Sinusoidal Carrier Wave")] 
            HRESULT carrierFrequency([out, retval, custom(GUID_DEFAULTVALUE, "1kHz")] Frequency *pVal);
        [propputref, id(FM_BASE+2), helpstring("Frequency of Sinusoidal Carrier Wave")] 
            HRESULT carrierFrequency([in, custom(GUID_DEFAULTVALUE, "1kHz")] Frequency newVal);
        [propget, id(FM_BASE+3), helpstring("Frequency deviation")] 
            HRESULT frequencyDeviation([out, retval, custom(GUID_DEFAULTVALUE, "100Hz")] Frequency *pVal);
        [propputref, id(FM_BASE+3), helpstring("Frequency deviation")] 
            HRESULT frequencyDeviation([in, custom(GUID_DEFAULTVALUE, "100Hz")] Frequency newVal);
    };


//AM
    [
        uuid(9652C800-A003-4F23-A4FE-4A024E3273C6),
        helpstring("AM class"),
        noncreatable
    ]
    coclass AM
    {
        [default] interface IAM;
    };
    [
        object,
        uuid(63959805-88EF-4D60-87BE-EEDE6E7B70B6),
        dual,
        helpstring("IAM Interface"),
        pointer_default(unique)
    ]
    interface IAM : IModulator 
    {
        enum {AM_BASE=(MODULATOR_BASE+256)};

        [propget, id(AM_BASE+1), helpstring("Modulation Index")] 
            HRESULT modIndex([out, retval, custom(GUID_DEFAULTVALUE, "0.3")] Ratio *pVal);
        [propputref, id(AM_BASE+1), helpstring("Modulation Index")] 
            HRESULT modIndex([in, custom(GUID_DEFAULTVALUE, "0.3")] Ratio newVal);
        [propget, id(AM_BASE+2), helpstring("property Carrier")] 
            HRESULT Carrier([out, retval] Signal *pVal);
        [propputref, id(AM_BASE+2), helpstring("property Carrier")] 
            HRESULT Carrier([in] Signal newVal);
    };


//PM
    [
        uuid(69F65F41-1727-40A4-B77D-41BBAB634A31),
        helpstring("PM class"),
        noncreatable
    ]
    coclass PM
    {
        [default] interface IPM;
    };
    [
        object,
        uuid(B8030445-8978-4A17-9AE9-28E1091461EF),
        dual,
        helpstring("IPM Interface"),
        pointer_default(unique)
    ]
    interface IPM : IModulator 
    {
        enum {PM_BASE=(MODULATOR_BASE+256)};

        [propget, id(PM_BASE+1), helpstring("Amplitude of  Sinusoidal Carrier wave")] 
            HRESULT amplitude([out, retval, custom(GUID_DEFAULTVALUE, "1")] Physical *pVal);
        [propputref, id(PM_BASE+1), helpstring("Amplitude of  Sinusoidal Carrier wave")] 
            HRESULT amplitude([in, custom(GUID_DEFAULTVALUE, "1")] Physical newVal);
        [propget, id(PM_BASE+2), helpstring("Frequency of Sinusoidal Carrier Wave")] 
            HRESULT carrierFrequency([out, retval, custom(GUID_DEFAULTVALUE, "1kHz")] Frequency *pVal);
        [propputref, id(PM_BASE+2), helpstring("Frequency of Sinusoidal Carrier Wave")] 
            HRESULT carrierFrequency([in, custom(GUID_DEFAULTVALUE, "1kHz")] Frequency newVal);
        [propget, id(PM_BASE+3), helpstring("Phase deviation")] 
            HRESULT phaseDeviation([out, retval, custom(GUID_DEFAULTVALUE, "{pi/4}")] PlaneAngle *pVal);
        [propputref, id(PM_BASE+3), helpstring("Phase deviation")] 
            HRESULT phaseDeviation([in, custom(GUID_DEFAULTVALUE, "{pi/4}")] PlaneAngle newVal);
    };


//Transformation
    [
        uuid(8A8E834F-32A4-40F6-9D45-9271E109643F),
        helpstring("Transformation class"),
        noncreatable
    ]
    coclass Transformation
    {
        [default] interface ITransformation;
    };
    [
        object,
        uuid(E48926BA-3EEE-4E3A-BACD-26464D10971A),
        dual,
        helpstring("ITransformation Interface"),
        pointer_default(unique)
    ]
    interface ITransformation : IConditioner 
    {
        enum {TRANSFORMATION_BASE=(CONDITIONER_BASE+256)};
    };


//SignalDelay
    [
        uuid(322336CF-77CC-4787-80CD-1CA81F237969),
        helpstring("SignalDelay class"),
        noncreatable
    ]
    coclass SignalDelay
    {
        [default] interface ISignalDelay;
    };
    [
        object,
        uuid(6B160BFD-D599-455A-B39B-DB744980E55C),
        dual,
        helpstring("ISignalDelay Interface"),
        pointer_default(unique)
    ]
    interface ISignalDelay : ITransformation 
    {
        enum {SIGNALDELAY_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(SIGNALDELAY_BASE+1), helpstring("the rate at which the Rate will alter over time (Acceleration)")] 
            HRESULT acceleration([out, retval, custom(GUID_DEFAULTVALUE, "0")] Frequency *pVal);
        [propputref, id(SIGNALDELAY_BASE+1), helpstring("the rate at which the Rate will alter over time (Acceleration)")] 
            HRESULT acceleration([in, custom(GUID_DEFAULTVALUE, "0")] Frequency newVal);
        [propget, id(SIGNALDELAY_BASE+2), helpstring("Fixed delay that signal will be delayed (Distance)")] 
            HRESULT delay([out, retval, custom(GUID_DEFAULTVALUE, "0")] Time *pVal);
        [propputref, id(SIGNALDELAY_BASE+2), helpstring("Fixed delay that signal will be delayed (Distance)")] 
            HRESULT delay([in, custom(GUID_DEFAULTVALUE, "0")] Time newVal);
        [propget, id(SIGNALDELAY_BASE+3), helpstring("the rate at which the Delay will alter over time (Speed)")] 
            HRESULT rate([out, retval, custom(GUID_DEFAULTVALUE, "0")] Ratio *pVal);
        [propputref, id(SIGNALDELAY_BASE+3), helpstring("the rate at which the Delay will alter over time (Speed)")] 
            HRESULT rate([in, custom(GUID_DEFAULTVALUE, "0")] Ratio newVal);
    };


//Exponential
    [
        uuid(1D29FBD0-2CF5-4CA8-9A3B-C4790617077C),
        helpstring("Exponential class"),
        noncreatable
    ]
    coclass Exponential
    {
        [default] interface IExponential;
    };
    [
        object,
        uuid(A855AF90-7DA5-459B-BDE0-70F740F73FED),
        dual,
        helpstring("IExponential Interface"),
        pointer_default(unique)
    ]
    interface IExponential : ITransformation 
    {
        enum {EXPONENTIAL_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(EXPONENTIAL_BASE+1), helpstring("value of damping factor")] 
            HRESULT dampingFactor([out, retval, custom(GUID_DEFAULTVALUE, "1.0")] double *pVal);
        [propput, id(EXPONENTIAL_BASE+1), helpstring("value of damping factor")] 
            HRESULT dampingFactor([in, custom(GUID_DEFAULTVALUE, "1.0")] double newVal);
    };


//E
    [
        uuid(75B70A84-F62C-4A17-853C-8204E7FDA00F),
        helpstring("E class"),
        noncreatable
    ]
    coclass E
    {
        [default] interface IE;
    };
    [
        object,
        uuid(9BDE6CC3-2A48-4CCC-9CA3-85CAF21902DD),
        dual,
        helpstring("IE Interface"),
        pointer_default(unique)
    ]
    interface IE : ITransformation 
    {
        enum {E_BASE=(TRANSFORMATION_BASE+256)};
    };

//Ln
    [
        uuid(078D5FCA-BE76-498A-A8B1-B47278F675D4),
        helpstring("Ln class"),
        noncreatable
    ]
    coclass Ln
    {
        [default] interface ILn;
    };
    [
        object,
        uuid(0F40ACC1-1DE6-498C-A41C-983A7004238F),
        dual,
        helpstring("ILn Interface"),
        pointer_default(unique)
    ]
    interface ILn : ITransformation 
    {
        enum {LN_BASE=(TRANSFORMATION_BASE+256)};
    };


//Negate
    [
        uuid(37732CEA-8BB3-4400-9BD0-5336657AEE3E),
        helpstring("Negate class"),
        noncreatable
    ]
    coclass Negate
    {
        [default] interface INegate;
    };
    [
        object,
        uuid(1D32FD1F-D13A-48C8-AE2D-F0414DAC6DA5),
        dual,
        helpstring("INegate Interface"),
        pointer_default(unique)
    ]
    interface INegate : ITransformation 
    {
        enum {NEGATE_BASE=(TRANSFORMATION_BASE+256)};
    };


//Inverse
    [
        uuid(DA02AD63-5CF1-4C91-9FA7-7B7B37D65C65),
        helpstring("Inverse class"),
        noncreatable
    ]
    coclass Inverse
    {
        [default] interface IInverse;
    };
    [
        object,
        uuid(85B085D2-7384-48E8-AE19-BF1D00D38F06),
        dual,
        helpstring("IInverse Interface"),
        pointer_default(unique)
    ]
    interface IInverse : ITransformation 
    {
        enum {INVERSE_BASE=(TRANSFORMATION_BASE+256)};
    };


//PulseTrain
    [
        uuid(5D0AA35A-0678-400E-A52D-F6D7CA698988),
        helpstring("PulseTrain class"),
        noncreatable
    ]
    coclass PulseTrain
    {
        [default] interface IPulseTrain;
    };
    [
        object,
        uuid(90C2D34B-AB17-4D75-B2A2-C8EB80FDB4EE),
        dual,
        helpstring("IPulseTrain Interface"),
        pointer_default(unique)
    ]
    interface IPulseTrain : ITransformation 
    {
        enum {PULSETRAIN_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(PULSETRAIN_BASE+1), helpstring("list of pulses")] 
            HRESULT pulses([out, retval] PulseDefns *pVal);
        [propputref, id(PULSETRAIN_BASE+1), helpstring("list of pulses")] 
            HRESULT pulses([in] PulseDefns newVal);
        [propget, id(PULSETRAIN_BASE+2), helpstring("property repetition")] 
            HRESULT repetition([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(PULSETRAIN_BASE+2), helpstring("property repetition")] 
            HRESULT repetition([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
    };


//Attenuator
    [
        uuid(0248C2B3-CEAD-4210-A4A2-7AA4FF6D9988),
        helpstring("Attenuator class"),
        noncreatable
    ]
    coclass Attenuator
    {
        [default] interface IAttenuator;
    };
    [
        object,
        uuid(041A288A-1CF4-4922-AADE-5CEBCE6AE394),
        dual,
        helpstring("IAttenuator Interface"),
        pointer_default(unique)
    ]
    interface IAttenuator : ITransformation 
    {
        enum {ATTENUATOR_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(ATTENUATOR_BASE+1), helpstring("property gain")] 
            HRESULT gain([out, retval, custom(GUID_DEFAULTVALUE, "1.0")] Ratio *pVal);
        [propputref, id(ATTENUATOR_BASE+1), helpstring("property gain")] 
            HRESULT gain([in, custom(GUID_DEFAULTVALUE, "1.0")] Ratio newVal);
    };


//Load
    [
        uuid(0AA20249-382E-4835-A717-269C06EC9829),
        helpstring("Load class"),
        noncreatable
    ]
    coclass Load
    {
        [default] interface ILoad;
    };
    [
        object,
        uuid(E783D973-CAE3-4A72-94E1-F40C4AF38878),
        dual,
        helpstring("ILoad Interface"),
        pointer_default(unique)
    ]
    interface ILoad : ITransformation 
    {
        enum {LOAD_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(LOAD_BASE+1), helpstring("property resistance")] 
            HRESULT resistance([out, retval, custom(GUID_DEFAULTVALUE, "0 Ohm")] Resistance *pVal);
        [propputref, id(LOAD_BASE+1), helpstring("property resistance")] 
            HRESULT resistance([in, custom(GUID_DEFAULTVALUE, "0 Ohm")] Resistance newVal);
        [propget, id(LOAD_BASE+2), helpstring("property reactance")] 
            HRESULT reactance([out, retval, custom(GUID_DEFAULTVALUE, "0 Ohm")] Reactance *pVal);
        [propputref, id(LOAD_BASE+2), helpstring("property reactance")] 
            HRESULT reactance([in, custom(GUID_DEFAULTVALUE, "0 Ohm")] Reactance newVal);
    };


//Limit<type>
    [
        uuid(251DEF48-C965-44B3-B75B-113C3C4B9E58),
        helpstring("Limit class"),
        noncreatable
    ]
    coclass Limit
    {
        [default] interface ILimit;
    };
    [
        object,
        uuid(B2F2F869-83A3-47CF-B015-132D79F830B3),
        dual,
        helpstring("ILimit Interface"),
        pointer_default(unique)
    ]
    interface ILimit : ITransformation 
    {
        enum {LIMIT_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(LIMIT_BASE+1), helpstring("limits the absolute value of the signal to +/- limit value")] 
            HRESULT limit([out, retval, custom(GUID_DEFAULTVALUE, "1")] Physical *pVal);
        [propputref, id(LIMIT_BASE+1), helpstring("limits the absolute value of the signal to +/- limit value")] 
            HRESULT limit([in, custom(GUID_DEFAULTVALUE, "1")] Physical newVal);
    };


//FFT
    [
        uuid(0179EA10-E1D8-44C5-B4AE-DA1CEA723FA5),
        helpstring("FFT class"),
        noncreatable
    ]
    coclass FFT
    {
        [default] interface IFFT;
    };
    [
        object,
        uuid(D9B47889-5743-4A32-B422-0BF7E3678C9D),
        dual,
        helpstring("IFFT Interface"),
        pointer_default(unique)
    ]
    interface IFFT : ITransformation 
    {
        enum {FFT_BASE=(TRANSFORMATION_BASE+256)};

        [propget, id(FFT_BASE+1), helpstring("property samples")] 
            HRESULT samples([out, retval, custom(GUID_DEFAULTVALUE, "1023")] long *pVal);
        [propput, id(FFT_BASE+1), helpstring("property samples")] 
            HRESULT samples([in, custom(GUID_DEFAULTVALUE, "1023")] long newVal);
        [propget, id(FFT_BASE+2), helpstring("property interval")] 
            HRESULT interval([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(FFT_BASE+2), helpstring("property interval")] 
            HRESULT interval([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
    };


//EventFunction
    [
        uuid(5A65B7A0-11C9-4472-BF3B-965BE19147F6),
        helpstring("EventFunction class"),
        noncreatable
    ]
    coclass EventFunction
    {
        [default] interface IEventFunction;
    };
    [
        object,
        uuid(A0714DE2-DE8C-4ED2-93D8-82E890981EA1),
        dual,
        helpstring("IEventFunction Interface"),
        pointer_default(unique)
    ]
    interface IEventFunction : ISignalFunction 
    {
        enum {EVENTFUNCTION_BASE=(SIGNALFUNCTION_BASE+256)};
    };


//EventSource
    [
        uuid(2BAE6A90-B1FB-4351-9FEE-F03C037847BE),
        helpstring("EventSource class"),
        noncreatable
    ]
    coclass EventSource
    {
        [default] interface IEventSource;
    };
    [
        object,
        uuid(E6FE80D4-6D44-4035-8E30-016E13C220F6),
        dual,
        helpstring("IEventSource Interface"),
        pointer_default(unique)
    ]
    interface IEventSource : IEventFunction 
    {
        enum {EVENTSOURCE_BASE=(EVENTFUNCTION_BASE+256)};
    };


//Clock
    [
        uuid(1D974CA6-BC97-465A-9B89-A5B5FCE8BE19),
        helpstring("Clock class"),
        noncreatable
    ]
    coclass Clock
    {
        [default] interface IClock;
    };
    [
        object,
        uuid(1AD78152-7802-48A7-98EB-0ACA8C390E96),
        dual,
        helpstring("IClock Interface"),
        pointer_default(unique)
    ]
    interface IClock : IEventSource 
    {
        enum {CLOCK_BASE=(EVENTSOURCE_BASE+256)};

        [propget, id(CLOCK_BASE+1), helpstring("Frequency of the clock.")] 
            HRESULT clockRate([out, retval, custom(GUID_DEFAULTVALUE, "1Hz")] Frequency *pVal);
        [propputref, id(CLOCK_BASE+1), helpstring("Frequency of the clock.")] 
            HRESULT clockRate([in, custom(GUID_DEFAULTVALUE, "1Hz")] Frequency newVal);
    };


//TimedEvent
    [
        uuid(6E5BD69F-3BFD-45F4-9D04-974A610400A4),
        helpstring("TimedEvent class"),
        noncreatable
    ]
    coclass TimedEvent
    {
        [default] interface ITimedEvent;
    };
    [
        object,
        uuid(D0B1FCBA-56BF-4D5D-848F-0BB560F88DDF),
        dual,
        helpstring("ITimedEvent Interface"),
        pointer_default(unique)
    ]
    interface ITimedEvent : IEventSource 
    {
        enum {TIMEDEVENT_BASE=(EVENTSOURCE_BASE+256)};

        [propget, id(TIMEDEVENT_BASE+1), helpstring("the delay time before the first event will be start")] 
            HRESULT delay([out, retval, custom(GUID_DEFAULTVALUE, "0s")] Time *pVal);
        [propputref, id(TIMEDEVENT_BASE+1), helpstring("the delay time before the first event will be start")] 
            HRESULT delay([in, custom(GUID_DEFAULTVALUE, "0s")] Time newVal);
        [propget, id(TIMEDEVENT_BASE+2), helpstring("the duration that each event is active")] 
            HRESULT duration([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(TIMEDEVENT_BASE+2), helpstring("the duration that each event is active")] 
            HRESULT duration([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(TIMEDEVENT_BASE+3), helpstring("the time interval for each event")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1s")] Time *pVal);
        [propputref, id(TIMEDEVENT_BASE+3), helpstring("the time interval for each event")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1s")] Time newVal);
        [propget, id(TIMEDEVENT_BASE+4), helpstring("property repetition")] 
            HRESULT repetition([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(TIMEDEVENT_BASE+4), helpstring("property repetition")] 
            HRESULT repetition([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
    };


//PulsedEvent
    [
        uuid(B7184435-E35B-45E9-AA9F-2BB80CC28CFA),
        helpstring("PulsedEvent class"),
        noncreatable
    ]
    coclass PulsedEvent
    {
        [default] interface IPulsedEvent;
    };
    [
        object,
        uuid(138AD2A6-A54B-4A9B-BA74-2705D91117C0),
        dual,
        helpstring("IPulsedEvent Interface"),
        pointer_default(unique)
    ]
    interface IPulsedEvent : IEventSource 
    {
        enum {PULSEDEVENT_BASE=(EVENTSOURCE_BASE+256)};

        [propget, id(PULSEDEVENT_BASE+1), helpstring("list of pulses")] 
            HRESULT pulses([out, retval] PulseDefns *pVal);
        [propputref, id(PULSEDEVENT_BASE+1), helpstring("list of pulses")] 
            HRESULT pulses([in] PulseDefns newVal);
        [propget, id(PULSEDEVENT_BASE+2), helpstring("property repetition")] 
            HRESULT repetition([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(PULSEDEVENT_BASE+2), helpstring("property repetition")] 
            HRESULT repetition([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
    };


//EventConditioner
    [
        uuid(D209B811-92D0-45D7-8F68-7E1EF3A58384),
        helpstring("EventConditioner class"),
        noncreatable
    ]
    coclass EventConditioner
    {
        [default] interface IEventConditioner;
    };
    [
        object,
        uuid(9BC8ED23-E45C-4E74-8DF3-FF6329B6DD17),
        dual,
        helpstring("IEventConditioner Interface"),
        pointer_default(unique)
    ]
    interface IEventConditioner : IEventFunction 
    {
        enum {EVENTCONDITIONER_BASE=(EVENTFUNCTION_BASE+256)};
    };


//EventedEvent
    [
        uuid(2257D588-D123-49BC-8C09-015918A574E9),
        helpstring("EventedEvent class"),
        noncreatable
    ]
    coclass EventedEvent
    {
        [default] interface IEventedEvent;
    };
    [
        object,
        uuid(1E55B0EB-4566-4271-8BEB-6107D138F625),
        dual,
        helpstring("IEventedEvent Interface"),
        pointer_default(unique)
    ]
    interface IEventedEvent : IEventConditioner 
    {
        enum {EVENTEDEVENT_BASE=(EVENTCONDITIONER_BASE+256)};
    };


//EventCount
    [
        uuid(69734737-51FD-4876-BD26-EA90E507272D),
        helpstring("EventCount class"),
        noncreatable
    ]
    coclass EventCount
    {
        [default] interface IEventCount;
    };
    [
        object,
        uuid(8C687935-F61A-4DDC-AE05-6362FEBD3A47),
        dual,
        helpstring("IEventCount Interface"),
        pointer_default(unique)
    ]
    interface IEventCount : IEventConditioner 
    {
        enum {EVENTCOUNT_BASE=(EVENTCONDITIONER_BASE+256)};

        [propget, id(EVENTCOUNT_BASE+1), helpstring("Identifies the number of events that must happen before a event is generated")] 
            HRESULT count([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(EVENTCOUNT_BASE+1), helpstring("Identifies the number of events that must happen before a event is generated")] 
            HRESULT count([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
    };


//ProbabilityEvent
    [
        uuid(2FB53307-9222-4149-9DF0-0468BBE2939E),
        helpstring("ProbabilityEvent class"),
        noncreatable
    ]
    coclass ProbabilityEvent
    {
        [default] interface IProbabilityEvent;
    };
    [
        object,
        uuid(5CF6C9F8-2569-4C23-86C2-46D69C1731A3),
        dual,
        helpstring("IProbabilityEvent Interface"),
        pointer_default(unique)
    ]
    interface IProbabilityEvent : IEventConditioner 
    {
        enum {PROBABILITYEVENT_BASE=(EVENTCONDITIONER_BASE+256)};

        [propget, id(PROBABILITYEVENT_BASE+1), helpstring("property seed")] 
            HRESULT seed([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(PROBABILITYEVENT_BASE+1), helpstring("property seed")] 
            HRESULT seed([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
        [propget, id(PROBABILITYEVENT_BASE+2), helpstring("property probability")] 
            HRESULT probability([out, retval, custom(GUID_DEFAULTVALUE, "50")] Ratio *pVal);
        [propputref, id(PROBABILITYEVENT_BASE+2), helpstring("property probability")] 
            HRESULT probability([in, custom(GUID_DEFAULTVALUE, "50")] Ratio newVal);
    };


//NotEvent
    [
        uuid(B4560976-3004-40CC-890F-B622B8CDC4A7),
        helpstring("NotEvent class"),
        noncreatable
    ]
    coclass NotEvent
    {
        [default] interface INotEvent;
    };
    [
        object,
        uuid(C059936D-E177-4285-A96E-0DC39A469D93),
        dual,
        helpstring("INotEvent Interface"),
        pointer_default(unique)
    ]
    interface INotEvent : IEventConditioner 
    {
        enum {NOTEVENT_BASE=(EVENTCONDITIONER_BASE+256)};
    };


//Logical
    [
        uuid(DA3863D8-BD7B-4E64-A017-8256725324C9),
        helpstring("Logical class"),
        noncreatable
    ]
    coclass Logical
    {
        [default] interface ILogical;
    };
    [
        object,
        uuid(E4B1ABE2-197B-48C3-9CAC-63EE9A9A2FB9),
        dual,
        helpstring("ILogical Interface"),
        pointer_default(unique)
    ]
    interface ILogical : IEventConditioner 
    {
        enum {LOGICAL_BASE=(EVENTCONDITIONER_BASE+256)};
    };


//OrEvent
    [
        uuid(53619EBA-00DD-41A2-9A9B-28003EA89801),
        helpstring("OrEvent class"),
        noncreatable
    ]
    coclass OrEvent
    {
        [default] interface IOrEvent;
    };
    [
        object,
        uuid(BE261E8E-24DB-4C84-82EA-1317A8C888B7),
        dual,
        helpstring("IOrEvent Interface"),
        pointer_default(unique)
    ]
    interface IOrEvent : ILogical 
    {
        enum {OREVENT_BASE=(LOGICAL_BASE+256)};
    };


//XOrEvent
    [
        uuid(2DDF115F-8C0C-490C-948C-3FD8804C3B4C),
        helpstring("XOrEvent class"),
        noncreatable
    ]
    coclass XOrEvent
    {
        [default] interface IXOrEvent;
    };
    [
        object,
        uuid(36BFD7EF-2EEA-4A0F-B56A-807065567095),
        dual,
        helpstring("IXOrEvent Interface"),
        pointer_default(unique)
    ]
    interface IXOrEvent : ILogical 
    {
        enum {XOREVENT_BASE=(LOGICAL_BASE+256)};
    };


//AndEvent
    [
        uuid(98AE06C2-97D1-49AE-8DE7-4CEB2E075283),
        helpstring("AndEvent class"),
        noncreatable
    ]
    coclass AndEvent
    {
        [default] interface IAndEvent;
    };
    [
        object,
        uuid(E3D0F6A2-F38D-46D7-8096-EF6BDE0994A9),
        dual,
        helpstring("IAndEvent Interface"),
        pointer_default(unique)
    ]
    interface IAndEvent : ILogical 
    {
        enum {ANDEVENT_BASE=(LOGICAL_BASE+256)};
    };


//Sensor
    [
        uuid(328CB756-1BFD-41C1-A386-46B43AE95EDC),
        helpstring("Sensor class"),
        noncreatable
    ]
    coclass Sensor
    {
        [default] interface ISensor;
    };
    [
        object,
        uuid(F0F86DDB-18B0-4DD2-A891-946E4C28D2AF),
        dual,
        helpstring("ISensor Interface"),
        pointer_default(unique)
    ]
    interface ISensor : ISignalFunction 
    {
        enum {SENSOR_BASE=(SIGNALFUNCTION_BASE+256)};

        typedef enum _enumMeasuredVariable {DEPENDENT=0,INDEPENDENT} enumMeasuredVariable;
        typedef enum _enumCondition {NONE=0,GT,GE,LE,LT,EQ,NE} enumCondition;

        [propget, id(SENSOR_BASE+1), helpstring("Whether the measurement made is of the dependent or independent variable. ")] 
            HRESULT measuredVariable([out, retval, custom(GUID_DEFAULTVALUE, "DEPENDENT")] enumMeasuredVariable *pVal);
        [propput, id(SENSOR_BASE+1), helpstring("Whether the measurement made is of the dependent or independent variable. ")] 
            HRESULT measuredVariable([in, custom(GUID_DEFAULTVALUE, "DEPENDENT")] enumMeasuredVariable newVal);
        [propget, id(SENSOR_BASE+2), helpstring("Current value measured")] 
            HRESULT measurement([out, retval, custom(GUID_DEFAULTVALUE, "0")] VARIANT *pVal);
        [propget, id(SENSOR_BASE+3), helpstring("Array of measurements made")] 
            HRESULT measurements([out, retval] SAFEARRAY(VARIANT) *pVal);
        [propget, id(SENSOR_BASE+4), helpstring("Number of consecutive measurement to be made. Zero indicates no measurement to be taken and indicates the Sensor is acting as a monitor only")] 
            HRESULT samples([out, retval, custom(GUID_DEFAULTVALUE, "1")] long *pVal);
        [propput, id(SENSOR_BASE+4), helpstring("Number of consecutive measurement to be made. Zero indicates no measurement to be taken and indicates the Sensor is acting as a monitor only")] 
            HRESULT samples([in, custom(GUID_DEFAULTVALUE, "1")] long newVal);
        [propget, id(SENSOR_BASE+5), helpstring("Readonly number of measurements currently made")] 
            HRESULT count([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propget, id(SENSOR_BASE+6), helpstring("Continuous range of independent variable (Time) over which measurement is made.")] 
            HRESULT gateTime([out, retval, custom(GUID_DEFAULTVALUE, "1")] double *pVal);
        [propput, id(SENSOR_BASE+6), helpstring("Continuous range of independent variable (Time) over which measurement is made.")] 
            HRESULT gateTime([in, custom(GUID_DEFAULTVALUE, "1")] double newVal);
        [propget, id(SENSOR_BASE+7), helpstring("Value against which any condition is checked. This can be either an absolute value (5V) or a ratio value (50%) representing the percentage value between the low-peak and high-peak values.")] 
            HRESULT nominal([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SENSOR_BASE+7), helpstring("Value against which any condition is checked. This can be either an absolute value (5V) or a ratio value (50%) representing the percentage value between the low-peak and high-peak values.")] 
            HRESULT nominal([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SENSOR_BASE+8), helpstring("Test made between measurement and nominal value")] 
            HRESULT condition([out, retval, custom(GUID_DEFAULTVALUE, "NONE")] enumCondition *pVal);
        [propput, id(SENSOR_BASE+8), helpstring("Test made between measurement and nominal value")] 
            HRESULT condition([in, custom(GUID_DEFAULTVALUE, "NONE")] enumCondition newVal);
        [propget, id(SENSOR_BASE+9), helpstring("Read Only flag indicating last measurement Pass/Fail Status. If no measurement is taken GO is False")] 
            HRESULT GO([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propget, id(SENSOR_BASE+10), helpstring("Read Only flag indicating last measurement Pass/Fail Status If no measurement is taken GO is False.")] 
            HRESULT NOGO([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propget, id(SENSOR_BASE+11), helpstring("Read Only flag indicating the last measurement High/Low Status.  If no measurement is taken HI is False")] 
            HRESULT HI([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propget, id(SENSOR_BASE+12), helpstring("Read Only flag indicating the last measurement High/Low Status.  If no measurement is taken LO is False")] 
            HRESULT LO([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propget, id(SENSOR_BASE+13), helpstring("Upper Limit value against which condition is checked")] 
            HRESULT UL([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SENSOR_BASE+13), helpstring("Upper Limit value against which condition is checked")] 
            HRESULT UL([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SENSOR_BASE+14), helpstring("Lower Limit value against which condition is checked")] 
            HRESULT LL([out, retval, custom(GUID_DEFAULTVALUE, "0")] Physical *pVal);
        [propputref, id(SENSOR_BASE+14), helpstring("Lower Limit value against which condition is checked")] 
            HRESULT LL([in, custom(GUID_DEFAULTVALUE, "0")] Physical newVal);
        [propget, id(SENSOR_BASE+15), helpstring("reference to a Signal representing signal model of input signal")] 
            HRESULT As([out, retval] Signal *pVal);
        [propputref, id(SENSOR_BASE+15), helpstring("reference to a Signal representing signal model of input signal")] 
            HRESULT As([in] Signal newVal);
    };


//Counter
    [
        uuid(CBACEB0E-49DF-4042-88EB-74A60F845819),
        helpstring("Counter class"),
        noncreatable
    ]
    coclass Counter
    {
        [default] interface ICounter;
    };
    [
        object,
        uuid(8EAC1440-B248-4861-9338-4E7E941F01DF),
        dual,
        helpstring("ICounter Interface"),
        pointer_default(unique)
    ]
    interface ICounter : ISensor 
    {
        enum {COUNTER_BASE=(SENSOR_BASE+256)};
    };


//Interval
    [
        uuid(2FB3E6EB-190A-42DC-8EDD-9BE1254FC2E3),
        helpstring("Interval class"),
        noncreatable
    ]
    coclass Interval
    {
        [default] interface IInterval;
    };
    [
        object,
        uuid(7FF07F4B-8273-4BF6-94DB-F90BE94FC8BF),
        dual,
        helpstring("IInterval Interface"),
        pointer_default(unique)
    ]
    interface IInterval : ISensor 
    {
        enum {INTERVAL_BASE=(SENSOR_BASE+256)};
    };


//Instantaneous<type>
    [
        uuid(D6143D22-29F5-4D15-BB14-89002DED7E8C),
        helpstring("Instantaneous class"),
        noncreatable
    ]
    coclass Instantaneous
    {
        [default] interface IInstantaneous;
    };
    [
        object,
        uuid(D303C5BB-C973-4295-B8A3-91FB364A3815),
        dual,
        helpstring("IInstantaneous Interface"),
        pointer_default(unique)
    ]
    interface IInstantaneous : ISensor 
    {
        enum {INSTANTANEOUS_BASE=(SENSOR_BASE+256)};
    };


//RMS<type>
    [
        uuid(6C0DBF71-A06F-4C7B-A489-AE02E992A197),
        helpstring("RMS class"),
        noncreatable
    ]
    coclass RMS
    {
        [default] interface IRMS;
    };
    [
        object,
        uuid(528720D7-088E-4365-9BAC-69A0E9D31C25),
        dual,
        helpstring("IRMS Interface"),
        pointer_default(unique)
    ]
    interface IRMS : ISensor 
    {
        enum {RMS_BASE=(SENSOR_BASE+256)};
    };


//Average<type>
    [
        uuid(3822F512-07C3-4823-9E99-138B511CCA3F),
        helpstring("Average class"),
        noncreatable
    ]
    coclass Average
    {
        [default] interface IAverage;
    };
    [
        object,
        uuid(E38101DB-16AA-4C93-9517-EA9CA1051B9B),
        dual,
        helpstring("IAverage Interface"),
        pointer_default(unique)
    ]
    interface IAverage : ISensor 
    {
        enum {AVERAGE_BASE=(SENSOR_BASE+256)};
    };


//PeakToPeak<type>
    [
        uuid(5D9305E5-EE45-4CE0-907D-325DDAAFAD90),
        helpstring("PeakToPeak class"),
        noncreatable
    ]
    coclass PeakToPeak
    {
        [default] interface IPeakToPeak;
    };
    [
        object,
        uuid(7ED757F6-390F-45BC-8593-B03E02488F1A),
        dual,
        helpstring("IPeakToPeak Interface"),
        pointer_default(unique)
    ]
    interface IPeakToPeak : ISensor 
    {
        enum {PEAKTOPEAK_BASE=(SENSOR_BASE+256)};
    };


//Peak<type>
    [
        uuid(8A39C5D7-A90E-4A32-AEE0-6F3F836E1E57),
        helpstring("Peak class"),
        noncreatable
    ]
    coclass Peak
    {
        [default] interface IPeak;
    };
    [
        object,
        uuid(588A279E-A6E6-46D0-9A7E-B80CFA438890),
        dual,
        helpstring("IPeak Interface"),
        pointer_default(unique)
    ]
    interface IPeak : ISensor 
    {
        enum {PEAK_BASE=(SENSOR_BASE+256)};
    };


//PeakNeg<type>
    [
        uuid(21142E33-18F9-4363-AB9B-DEC1A8BE7947),
        helpstring("PeakNeg class"),
        noncreatable
    ]
    coclass PeakNeg
    {
        [default] interface IPeakNeg;
    };
    [
        object,
        uuid(29F73B4C-CCE0-45B6-9D09-4C11216608CC),
        dual,
        helpstring("IPeakNeg Interface"),
        pointer_default(unique)
    ]
    interface IPeakNeg : ISensor 
    {
        enum {PEAKNEG_BASE=(SENSOR_BASE+256)};
    };


//MaxInstantaneous<type>
    [
        uuid(D0F6F48A-D4F3-4733-BE92-6BA76BAD210F),
        helpstring("MaxInstantaneous class"),
        noncreatable
    ]
    coclass MaxInstantaneous
    {
        [default] interface IMaxInstantaneous;
    };
    [
        object,
        uuid(980364D9-6AA4-4928-A8BB-BF0227D5763D),
        dual,
        helpstring("IMaxInstantaneous Interface"),
        pointer_default(unique)
    ]
    interface IMaxInstantaneous : ISensor 
    {
        enum {MAXINSTANTANEOUS_BASE=(SENSOR_BASE+256)};
    };


//MinInstantaneous<type>
    [
        uuid(5B86CAF5-7920-45C4-95B6-B1B3E0710405),
        helpstring("MinInstantaneous class"),
        noncreatable
    ]
    coclass MinInstantaneous
    {
        [default] interface IMinInstantaneous;
    };
    [
        object,
        uuid(F4B9F1E9-CD52-45A3-BCB3-EB755CC9438D),
        dual,
        helpstring("IMinInstantaneous Interface"),
        pointer_default(unique)
    ]
    interface IMinInstantaneous : ISensor 
    {
        enum {MININSTANTANEOUS_BASE=(SENSOR_BASE+256)};
    };


//Measure
    [
        uuid(275576DA-35A6-4291-9F0A-FBE33490EE4D),
        helpstring("Measure class"),
        noncreatable
    ]
    coclass Measure
    {
        [default] interface IMeasure;
    };
    [
        object,
        uuid(76AE805F-A2E1-4244-8251-758E9323C54C),
        dual,
        helpstring("IMeasure Interface"),
        pointer_default(unique)
    ]
    interface IMeasure : ISensor 
    {
        enum {MEASURE_BASE=(SENSOR_BASE+256)};

        [propget, id(MEASURE_BASE+1), helpstring("Attribute of the signal that is to be measured")] 
            HRESULT attribute([out, retval] BSTR *pVal);
        [propput, id(MEASURE_BASE+1), helpstring("Attribute of the signal that is to be measured")] 
            HRESULT attribute([in] BSTR newVal);
    };


//Decode
    [
        uuid(7DA9013B-2365-4179-B574-EA4CFEC7AA73),
        helpstring("Decode class"),
        noncreatable
    ]
    coclass Decode
    {
        [default] interface IDecode;
    };
    [
        object,
        uuid(D2EB4922-DCB5-4F80-90E9-1191B07C2893),
        dual,
        helpstring("IDecode Interface"),
        pointer_default(unique)
    ]
    interface IDecode : ISensor 
    {
        enum {DECODE_BASE=(SENSOR_BASE+256)};

        [propget, id(DECODE_BASE+1), helpstring("The measurement's resultant variant's datatype ")] 
            HRESULT datatype([out, retval] BSTR *pVal);
        [propput, id(DECODE_BASE+1), helpstring("The measurement's resultant variant's datatype ")] 
            HRESULT datatype([in] BSTR newVal);
        [propget, id(DECODE_BASE+2), helpstring("Character set used. This attribute allows alternative character set mappings and code pages to be applied ")] 
            HRESULT encoding([out, retval, custom(GUID_DEFAULTVALUE, "UTF-8")] BSTR *pVal);
        [propput, id(DECODE_BASE+2), helpstring("Character set used. This attribute allows alternative character set mappings and code pages to be applied ")] 
            HRESULT encoding([in, custom(GUID_DEFAULTVALUE, "UTF-8")] BSTR newVal);
    };


//Control
    [
        uuid(7F4A48A5-678C-4153-B09C-25BDF30FF9E7),
        helpstring("Control class"),
        noncreatable
    ]
    coclass Control
    {
        [default] interface IControl;
    };
    [
        object,
        uuid(82BF6793-1839-40E3-AABD-B5AD452EB3C5),
        dual,
        helpstring("IControl Interface"),
        pointer_default(unique)
    ]
    interface IControl : ISignalFunction 
    {
        enum {CONTROL_BASE=(SIGNALFUNCTION_BASE+256)};

        //[propget, id(CONTROL_BASE+1), helpstring("the digital event stream.")] 
        //    HRESULT Selector([out, retval] Signal *pVal);
        //[propputref, id(CONTROL_BASE+1), helpstring("the digital event stream.")] 
        //    HRESULT Selector([in] Signal newVal);
    };


//SelectIf
    [
        uuid(085533C6-AAC5-49B4-80D7-D900765FDFE4),
        helpstring("SelectIf class"),
        noncreatable
    ]
    coclass SelectIf
    {
        [default] interface ISelectIf;
    };
    [
        object,
        uuid(863550DF-DC12-4800-BBB8-B0919D07F911),
        dual,
        helpstring("ISelectIf Interface"),
        pointer_default(unique)
    ]
    interface ISelectIf : IControl 
    {
        enum {SELECTIF_BASE=(CONTROL_BASE+256)};

	    [propget, id(SELECTIF_BASE+1), helpstring("the digital event stream.")] 
            HRESULT Selector([out, retval] Signal *pVal);
        [propputref, id(SELECTIF_BASE+1), helpstring("the digital event stream.")] 
            HRESULT Selector([in] Signal newVal);
};


//SelectCase
    [
        uuid(60FA0503-5661-4225-95C1-9B07BD3B4355),
        helpstring("SelectCase class"),
        noncreatable
    ]
    coclass SelectCase
    {
        [default] interface ISelectCase;
    };
    [
        object,
        uuid(94A89A59-3D98-49BD-8286-AD52A187D053),
        dual,
        helpstring("ISelectCase Interface"),
        pointer_default(unique)
    ]
    interface ISelectCase : IControl 
    {
        enum {SELECTCASE_BASE=(CONTROL_BASE+256)};

	    [propget, id(SELECTCASE_BASE+1), helpstring("the digital event stream.")] 
            HRESULT Selector([out, retval] Signal *pVal);
        [propputref, id(SELECTCASE_BASE+1), helpstring("the digital event stream.")] 
            HRESULT Selector([in] Signal newVal);
        [propget, id(SELECTCASE_BASE+2), helpstring("selector channel mask, identifies which channels of the selector shall be used to select the input , the value can be expressed as a decimal (13) or hex value (0xC) to identify the binary pattern '1101' selecting channels 1,3 and 4.. A value of 0 implies all channels ")] 
            HRESULT mask([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(SELECTCASE_BASE+2), helpstring("selector channel mask, identifies which channels of the selector shall be used to select the input , the value can be expressed as a decimal (13) or hex value (0xC) to identify the binary pattern '1101' selecting channels 1,3 and 4.. A value of 0 implies all channels ")] 
            HRESULT mask([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
    };


//Digital
    [
        uuid(434B0512-6713-4CDF-9B8C-F36B4A9FB310),
        helpstring("Digital class"),
        noncreatable
    ]
    coclass Digital
    {
        [default] interface IDigital;
    };
    [
        object,
        uuid(7B8E96EB-3608-48C5-843E-A63CD676B945),
        dual,
        helpstring("IDigital Interface"),
        pointer_default(unique)
    ]
    interface IDigital : ISignalFunction 
    {
        enum {DIGITAL_BASE=(SIGNALFUNCTION_BASE+256)};

		typedef enum _enumPulseClass {NRZ=0,RZ,R1,RZPulse,BiPLevel,BiPMark,BiPSpace} enumPulseClass;
    };


//SerialDigital
    [
        uuid(6F201257-3680-467D-A887-EF7F2F315AD8),
        helpstring("SerialDigital class"),
        noncreatable
    ]
    coclass SerialDigital
    {
        [default] interface ISerialDigital;
    };
    [
        object,
        uuid(28DC20E2-EEF2-473E-9BEB-5CABF996F7C9),
        dual,
        helpstring("ISerialDigital Interface"),
        pointer_default(unique)
    ]
    interface ISerialDigital : IDigital 
    {
        enum {SERIALDIGITAL_BASE=(DIGITAL_BASE+256)};

        [propget, id(SERIALDIGITAL_BASE+1), helpstring("String containing characters 'H', 'L', 'Z', 'X' identifying digital state")] 
            HRESULT data([out, retval] BSTR *pVal);
        [propput, id(SERIALDIGITAL_BASE+1), helpstring("String containing characters 'H', 'L', 'Z', 'X' identifying digital state")] 
            HRESULT data([in] BSTR newVal);
        [propget, id(SERIALDIGITAL_BASE+2), helpstring("Digital Clock Rate")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1")] Time *pVal);
        [propputref, id(SERIALDIGITAL_BASE+2), helpstring("Digital Clock Rate")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1")] Time newVal);
        [propget, id(SERIALDIGITAL_BASE+3), helpstring("Analog Logic High (1)")] 
            HRESULT logic_H_value([out, retval, custom(GUID_DEFAULTVALUE, "1")] Voltage *pVal);
        [propputref, id(SERIALDIGITAL_BASE+3), helpstring("Analog Logic High (1)")] 
            HRESULT logic_H_value([in, custom(GUID_DEFAULTVALUE, "1")] Voltage newVal);
        [propget, id(SERIALDIGITAL_BASE+4), helpstring("Analog Logic Low (0)")] 
            HRESULT logic_L_value([out, retval, custom(GUID_DEFAULTVALUE, "0")] Voltage *pVal);
        [propputref, id(SERIALDIGITAL_BASE+4), helpstring("Analog Logic Low (0)")] 
            HRESULT logic_L_value([in, custom(GUID_DEFAULTVALUE, "0")] Voltage newVal);
        [propget, id(SERIALDIGITAL_BASE+5), helpstring("Pulse Class type")] 
            HRESULT pulseClass([out, retval, custom(GUID_DEFAULTVALUE, "NRZ")] enumPulseClass *pVal);
        [propput, id(SERIALDIGITAL_BASE+5), helpstring("Pulse Class type")] 
            HRESULT pulseClass([in, custom(GUID_DEFAULTVALUE, "NRZ")] enumPulseClass newVal);
    };


//ParallelDigital
    [
        uuid(8B474D78-140A-41BC-8693-2D8BC1B3077B),
        helpstring("ParallelDigital class"),
        noncreatable
    ]
    coclass ParallelDigital
    {
        [default] interface IParallelDigital;
    };
    [
        object,
        uuid(470C8CB8-7592-41B5-98F2-32C270440CA5),
        dual,
        helpstring("IParallelDigital Interface"),
        pointer_default(unique)
    ]
    interface IParallelDigital : IDigital 
    {
        enum {PARALLELDIGITAL_BASE=(DIGITAL_BASE+256)};

        [propget, id(PARALLELDIGITAL_BASE+1), helpstring("where each string String containing characters 'H', 'L', 'Z', 'X' identifying digital state")] 
            HRESULT data([out, retval] BSTR *pVal);
        [propput, id(PARALLELDIGITAL_BASE+1), helpstring("where each string String containing characters 'H', 'L', 'Z', 'X' identifying digital state")] 
            HRESULT data([in] BSTR newVal);
        [propget, id(PARALLELDIGITAL_BASE+2), helpstring("Digital Clock Rate")] 
            HRESULT period([out, retval, custom(GUID_DEFAULTVALUE, "1")] Time *pVal);
        [propputref, id(PARALLELDIGITAL_BASE+2), helpstring("Digital Clock Rate")] 
            HRESULT period([in, custom(GUID_DEFAULTVALUE, "1")] Time newVal);
        [propget, id(PARALLELDIGITAL_BASE+3), helpstring("Analog Logic High (1)")] 
            HRESULT logic_H_value([out, retval, custom(GUID_DEFAULTVALUE, "1")] Voltage *pVal);
        [propputref, id(PARALLELDIGITAL_BASE+3), helpstring("Analog Logic High (1)")] 
            HRESULT logic_H_value([in, custom(GUID_DEFAULTVALUE, "1")] Voltage newVal);
        [propget, id(PARALLELDIGITAL_BASE+4), helpstring("Analog Logic low (0)")] 
            HRESULT logic_L_value([out, retval, custom(GUID_DEFAULTVALUE, "0")] Voltage *pVal);
        [propputref, id(PARALLELDIGITAL_BASE+4), helpstring("Analog Logic low (0)")] 
            HRESULT logic_L_value([in, custom(GUID_DEFAULTVALUE, "0")] Voltage newVal);
        [propget, id(PARALLELDIGITAL_BASE+5), helpstring("Pulse Class type")] 
            HRESULT pulseClass([out, retval, custom(GUID_DEFAULTVALUE, "NRZ")] enumPulseClass *pVal);
        [propput, id(PARALLELDIGITAL_BASE+5), helpstring("Pulse Class type")] 
            HRESULT pulseClass([in, custom(GUID_DEFAULTVALUE, "NRZ")] enumPulseClass newVal);
    };


//Encode
    [
        uuid(311A1CC6-4565-42A9-B879-0C1E38688C41),
        helpstring("Encode class"),
        noncreatable
    ]
    coclass Encode
    {
        [default] interface IEncode;
    };
    [
        object,
        uuid(AC61A1CD-5997-4E85-950F-C64FED77328E),
        dual,
        helpstring("IEncode Interface"),
        pointer_default(unique)
    ]
    interface IEncode : IControl 
    {
        enum {ENCODE_BASE=(CONTROL_BASE+256)};

        [propget, id(ENCODE_BASE+1), helpstring("The information to be streamed or the URI identifying location of information. The type of the Variant defines the data type. When using XML descriptions, the attribute datatype shall be used to define a valid datatype")] 
            HRESULT data([out, retval] VARIANT *pVal);
        [propput, id(ENCODE_BASE+1), helpstring("The information to be streamed or the URI identifying location of information. The type of the Variant defines the data type. When using XML descriptions, the attribute datatype shall be used to define a valid datatype")] 
            HRESULT data([in] VARIANT newVal);
        [propget, id(ENCODE_BASE+2), helpstring("The number of output channels. Zero indicates that the number of outputs is the minimum required to represents a complete data symbol")] 
            HRESULT width([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(ENCODE_BASE+2), helpstring("The number of output channels. Zero indicates that the number of outputs is the minimum required to represents a complete data symbol")] 
            HRESULT width([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
        [propget, id(ENCODE_BASE+3), helpstring("the number of times the data is output. Zero indicates that the sequence is repeated indefinitely ")] 
            HRESULT repetition([out, retval, custom(GUID_DEFAULTVALUE, "1")] long *pVal);
        [propput, id(ENCODE_BASE+3), helpstring("the number of times the data is output. Zero indicates that the sequence is repeated indefinitely ")] 
            HRESULT repetition([in, custom(GUID_DEFAULTVALUE, "1")] long newVal);
        [propget, id(ENCODE_BASE+4), helpstring("Used in the XML to define the base type of the data.")] 
            HRESULT datatype([out, retval] BSTR *pVal);
        [propput, id(ENCODE_BASE+4), helpstring("Used in the XML to define the base type of the data.")] 
            HRESULT datatype([in] BSTR newVal);
        [propget, id(ENCODE_BASE+5), helpstring("Character set used. This attribute allows alternative character set mappings and code pages to be applied ")] 
            HRESULT encoding([out, retval, custom(GUID_DEFAULTVALUE, "UTF-8")] BSTR *pVal);
        [propput, id(ENCODE_BASE+5), helpstring("Character set used. This attribute allows alternative character set mappings and code pages to be applied ")] 
            HRESULT encoding([in, custom(GUID_DEFAULTVALUE, "UTF-8")] BSTR newVal);
    };


//Connection
    [
        uuid(10DC2FCD-D4FC-43FD-AD2D-D5C27353C6D9),
        helpstring("Connection class"),
        noncreatable
    ]
    coclass Connection
    {
        [default] interface IConnection;
    };
    [
        object,
        uuid(9CC0AAA5-9685-49D6-AA8A-26CA55C95ACD),
        dual,
        helpstring("IConnection Interface"),
        pointer_default(unique)
    ]
    interface IConnection : ISignalFunction 
    {
        enum {CONNECTION_BASE=(SIGNALFUNCTION_BASE+256)};

        [propget, id(CONNECTION_BASE+1), helpstring("maximum number of channels allowed to be connected")] 
            HRESULT channelWidth([out, retval, custom(GUID_DEFAULTVALUE, "0")] long *pVal);
        [propput, id(CONNECTION_BASE+1), helpstring("maximum number of channels allowed to be connected")] 
            HRESULT channelWidth([in, custom(GUID_DEFAULTVALUE, "0")] long newVal);
    };


//TwoWire
    [
        uuid(847937B2-BF8E-4A92-8261-F2DA75A50803),
        helpstring("TwoWire class"),
        noncreatable
    ]
    coclass TwoWire
    {
        [default] interface ITwoWire;
    };
    [
        object,
        uuid(DD6CF9E1-5740-40D7-9041-DB688171ADBB),
        dual,
        helpstring("ITwoWire Interface"),
        pointer_default(unique)
    ]
    interface ITwoWire : IConnection 
    {
        enum {TWOWIRE_BASE=(CONNECTION_BASE+256)};

        [propget, id(TWOWIRE_BASE+1), helpstring("property hi")] 
            HRESULT hi([out, retval] BSTR *pVal);
        [propput, id(TWOWIRE_BASE+1), helpstring("property hi")] 
            HRESULT hi([in] BSTR newVal);
        [propget, id(TWOWIRE_BASE+2), helpstring("property lo")] 
            HRESULT lo([out, retval] BSTR *pVal);
        [propput, id(TWOWIRE_BASE+2), helpstring("property lo")] 
            HRESULT lo([in] BSTR newVal);
    };


//TwoWireComp
    [
        uuid(338ABE27-1111-4AF2-9A88-9C092CD72E16),
        helpstring("TwoWireComp class"),
        noncreatable
    ]
    coclass TwoWireComp
    {
        [default] interface ITwoWireComp;
    };
    [
        object,
        uuid(905B9C85-C022-48F5-B99E-E3B8F6517CDE),
        dual,
        helpstring("ITwoWireComp Interface"),
        pointer_default(unique)
    ]
    interface ITwoWireComp : IConnection 
    {
        enum {TWOWIRECOMP_BASE=(CONNECTION_BASE+256)};

        [propget, id(TWOWIRECOMP_BASE+1), helpstring("property true")] 
            HRESULT true([out, retval] BSTR *pVal);
        [propput, id(TWOWIRECOMP_BASE+1), helpstring("property true")] 
            HRESULT true([in] BSTR newVal);
        [propget, id(TWOWIRECOMP_BASE+2), helpstring("property comp")] 
            HRESULT comp([out, retval] BSTR *pVal);
        [propput, id(TWOWIRECOMP_BASE+2), helpstring("property comp")] 
            HRESULT comp([in] BSTR newVal);
    };


//ThreeWireComp
    [
        uuid(A7F17996-3995-43EC-AB75-72945AB3D54C),
        helpstring("ThreeWireComp class"),
        noncreatable
    ]
    coclass ThreeWireComp
    {
        [default] interface IThreeWireComp;
    };
    [
        object,
        uuid(E96CD53D-5A53-4C0C-ADA5-7707E7D9610E),
        dual,
        helpstring("IThreeWireComp Interface"),
        pointer_default(unique)
    ]
    interface IThreeWireComp : IConnection 
    {
        enum {THREEWIRECOMP_BASE=(CONNECTION_BASE+256)};

        [propget, id(THREEWIRECOMP_BASE+1), helpstring("property true")] 
            HRESULT true([out, retval] BSTR *pVal);
        [propput, id(THREEWIRECOMP_BASE+1), helpstring("property true")] 
            HRESULT true([in] BSTR newVal);
        [propget, id(THREEWIRECOMP_BASE+2), helpstring("property comp")] 
            HRESULT comp([out, retval] BSTR *pVal);
        [propput, id(THREEWIRECOMP_BASE+2), helpstring("property comp")] 
            HRESULT comp([in] BSTR newVal);
        [propget, id(THREEWIRECOMP_BASE+3), helpstring("property lo")] 
            HRESULT lo([out, retval] BSTR *pVal);
        [propput, id(THREEWIRECOMP_BASE+3), helpstring("property lo")] 
            HRESULT lo([in] BSTR newVal);
    };


//SinglePhase
    [
        uuid(E819B7BC-931C-4E64-BC96-DC05024598AB),
        helpstring("SinglePhase class"),
        noncreatable
    ]
    coclass SinglePhase
    {
        [default] interface ISinglePhase;
    };
    [
        object,
        uuid(7AF360BD-FE59-4A0E-B754-3715CD8B7261),
        dual,
        helpstring("ISinglePhase Interface"),
        pointer_default(unique)
    ]
    interface ISinglePhase : IConnection 
    {
        enum {SINGLEPHASE_BASE=(CONNECTION_BASE+256)};

        [propget, id(SINGLEPHASE_BASE+1), helpstring("property a")] 
            HRESULT a([out, retval] BSTR *pVal);
        [propput, id(SINGLEPHASE_BASE+1), helpstring("property a")] 
            HRESULT a([in] BSTR newVal);
        [propget, id(SINGLEPHASE_BASE+2), helpstring("property n")] 
            HRESULT n([out, retval] BSTR *pVal);
        [propput, id(SINGLEPHASE_BASE+2), helpstring("property n")] 
            HRESULT n([in] BSTR newVal);
    };


//TwoPhase
    [
        uuid(2C702E19-FA7E-43B6-BEBB-F6B426A32E96),
        helpstring("TwoPhase class"),
        noncreatable
    ]
    coclass TwoPhase
    {
        [default] interface ITwoPhase;
    };
    [
        object,
        uuid(EF5C9CB1-E6F8-48AF-8552-2A7F0A30D8C8),
        dual,
        helpstring("ITwoPhase Interface"),
        pointer_default(unique)
    ]
    interface ITwoPhase : IConnection 
    {
        enum {TWOPHASE_BASE=(CONNECTION_BASE+256)};

        [propget, id(TWOPHASE_BASE+1), helpstring("property a")] 
            HRESULT a([out, retval] BSTR *pVal);
        [propput, id(TWOPHASE_BASE+1), helpstring("property a")] 
            HRESULT a([in] BSTR newVal);
        [propget, id(TWOPHASE_BASE+2), helpstring("property b")] 
            HRESULT b([out, retval] BSTR *pVal);
        [propput, id(TWOPHASE_BASE+2), helpstring("property b")] 
            HRESULT b([in] BSTR newVal);
        [propget, id(TWOPHASE_BASE+3), helpstring("property n")] 
            HRESULT n([out, retval] BSTR *pVal);
        [propput, id(TWOPHASE_BASE+3), helpstring("property n")] 
            HRESULT n([in] BSTR newVal);
    };


//ThreePhaseDelta
    [
        uuid(850F7EA7-0ED1-4D45-9B47-52774513D5EF),
        helpstring("ThreePhaseDelta class"),
        noncreatable
    ]
    coclass ThreePhaseDelta
    {
        [default] interface IThreePhaseDelta;
    };
    [
        object,
        uuid(CEA7F6EE-D0C4-4D63-9B5D-2CB9B15A7D9D),
        dual,
        helpstring("IThreePhaseDelta Interface"),
        pointer_default(unique)
    ]
    interface IThreePhaseDelta : IConnection 
    {
        enum {THREEPHASEDELTA_BASE=(CONNECTION_BASE+256)};

        [propget, id(THREEPHASEDELTA_BASE+1), helpstring("property a")] 
            HRESULT a([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEDELTA_BASE+1), helpstring("property a")] 
            HRESULT a([in] BSTR newVal);
        [propget, id(THREEPHASEDELTA_BASE+2), helpstring("property b")] 
            HRESULT b([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEDELTA_BASE+2), helpstring("property b")] 
            HRESULT b([in] BSTR newVal);
        [propget, id(THREEPHASEDELTA_BASE+3), helpstring("property c")] 
            HRESULT c([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEDELTA_BASE+3), helpstring("property c")] 
            HRESULT c([in] BSTR newVal);
    };


//ThreePhaseWye
    [
        uuid(0519448D-BF46-4223-865F-932919DCE75D),
        helpstring("ThreePhaseWye class"),
        noncreatable
    ]
    coclass ThreePhaseWye
    {
        [default] interface IThreePhaseWye;
    };
    [
        object,
        uuid(4E8DDB77-614D-40C6-9934-981B1CCDFFA6),
        dual,
        helpstring("IThreePhaseWye Interface"),
        pointer_default(unique)
    ]
    interface IThreePhaseWye : IConnection 
    {
        enum {THREEPHASEWYE_BASE=(CONNECTION_BASE+256)};

        [propget, id(THREEPHASEWYE_BASE+1), helpstring("property a")] 
            HRESULT a([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEWYE_BASE+1), helpstring("property a")] 
            HRESULT a([in] BSTR newVal);
        [propget, id(THREEPHASEWYE_BASE+2), helpstring("property b")] 
            HRESULT b([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEWYE_BASE+2), helpstring("property b")] 
            HRESULT b([in] BSTR newVal);
        [propget, id(THREEPHASEWYE_BASE+3), helpstring("property c")] 
            HRESULT c([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEWYE_BASE+3), helpstring("property c")] 
            HRESULT c([in] BSTR newVal);
        [propget, id(THREEPHASEWYE_BASE+4), helpstring("property n")] 
            HRESULT n([out, retval] BSTR *pVal);
        [propput, id(THREEPHASEWYE_BASE+4), helpstring("property n")] 
            HRESULT n([in] BSTR newVal);
    };


//ThreePhaseSynchro
    [
        uuid(B562E643-4255-4F7B-836B-BF933D0BA7A0),
        helpstring("ThreePhaseSynchro class"),
        noncreatable
    ]
    coclass ThreePhaseSynchro
    {
        [default] interface IThreePhaseSynchro;
    };
    [
        object,
        uuid(B92F4498-A452-4324-ACBC-4ED892B729C7),
        dual,
        helpstring("IThreePhaseSynchro Interface"),
        pointer_default(unique)
    ]
    interface IThreePhaseSynchro : IConnection 
    {
        enum {THREEPHASESYNCHRO_BASE=(CONNECTION_BASE+256)};

        [propget, id(THREEPHASESYNCHRO_BASE+1), helpstring("property x")] 
            HRESULT x([out, retval] BSTR *pVal);
        [propput, id(THREEPHASESYNCHRO_BASE+1), helpstring("property x")] 
            HRESULT x([in] BSTR newVal);
        [propget, id(THREEPHASESYNCHRO_BASE+2), helpstring("property y")] 
            HRESULT y([out, retval] BSTR *pVal);
        [propput, id(THREEPHASESYNCHRO_BASE+2), helpstring("property y")] 
            HRESULT y([in] BSTR newVal);
        [propget, id(THREEPHASESYNCHRO_BASE+3), helpstring("property z")] 
            HRESULT z([out, retval] BSTR *pVal);
        [propput, id(THREEPHASESYNCHRO_BASE+3), helpstring("property z")] 
            HRESULT z([in] BSTR newVal);
    };


//FourWireResolver
    [
        uuid(1D95687C-15F6-4E63-904A-FA0D9C6F1EA8),
        helpstring("FourWireResolver class"),
        noncreatable
    ]
    coclass FourWireResolver
    {
        [default] interface IFourWireResolver;
    };
    [
        object,
        uuid(BE4461AD-E319-492E-B5FB-A734A586A9AD),
        dual,
        helpstring("IFourWireResolver Interface"),
        pointer_default(unique)
    ]
    interface IFourWireResolver : IConnection 
    {
        enum {FOURWIRERESOLVER_BASE=(CONNECTION_BASE+256)};

        [propget, id(FOURWIRERESOLVER_BASE+1), helpstring("property s1")] 
            HRESULT s1([out, retval] BSTR *pVal);
        [propput, id(FOURWIRERESOLVER_BASE+1), helpstring("property s1")] 
            HRESULT s1([in] BSTR newVal);
        [propget, id(FOURWIRERESOLVER_BASE+2), helpstring("property s2")] 
            HRESULT s2([out, retval] BSTR *pVal);
        [propput, id(FOURWIRERESOLVER_BASE+2), helpstring("property s2")] 
            HRESULT s2([in] BSTR newVal);
        [propget, id(FOURWIRERESOLVER_BASE+3), helpstring("property s3")] 
            HRESULT s3([out, retval] BSTR *pVal);
        [propput, id(FOURWIRERESOLVER_BASE+3), helpstring("property s3")] 
            HRESULT s3([in] BSTR newVal);
        [propget, id(FOURWIRERESOLVER_BASE+4), helpstring("property s4")] 
            HRESULT s4([out, retval] BSTR *pVal);
        [propput, id(FOURWIRERESOLVER_BASE+4), helpstring("property s4")] 
            HRESULT s4([in] BSTR newVal);
    };


//SynchroResolver
    [
        uuid(58F65DD6-04F5-4818-AB86-D345C46BF0D9),
        helpstring("SynchroResolver class"),
        noncreatable
    ]
    coclass SynchroResolver
    {
        [default] interface ISynchroResolver;
    };
    [
        object,
        uuid(AA9B71CA-60EC-45D9-8A2B-7253745F550C),
        dual,
        helpstring("ISynchroResolver Interface"),
        pointer_default(unique)
    ]
    interface ISynchroResolver : IConnection 
    {
        enum {SYNCHRORESOLVER_BASE=(CONNECTION_BASE+256)};

        [propget, id(SYNCHRORESOLVER_BASE+1), helpstring("property r1")] 
            HRESULT r1([out, retval] BSTR *pVal);
        [propput, id(SYNCHRORESOLVER_BASE+1), helpstring("property r1")] 
            HRESULT r1([in] BSTR newVal);
        [propget, id(SYNCHRORESOLVER_BASE+2), helpstring("property r2")] 
            HRESULT r2([out, retval] BSTR *pVal);
        [propput, id(SYNCHRORESOLVER_BASE+2), helpstring("property r2")] 
            HRESULT r2([in] BSTR newVal);
        [propget, id(SYNCHRORESOLVER_BASE+3), helpstring("property r3")] 
            HRESULT r3([out, retval] BSTR *pVal);
        [propput, id(SYNCHRORESOLVER_BASE+3), helpstring("property r3")] 
            HRESULT r3([in] BSTR newVal);
        [propget, id(SYNCHRORESOLVER_BASE+4), helpstring("property r4")] 
            HRESULT r4([out, retval] BSTR *pVal);
        [propput, id(SYNCHRORESOLVER_BASE+4), helpstring("property r4")] 
            HRESULT r4([in] BSTR newVal);
    };


//Series
    [
        uuid(61113FF7-4C66-4B31-AFFB-AC8B1FECDD9F),
        helpstring("Series class"),
        noncreatable
    ]
    coclass Series
    {
        [default] interface ISeries;
    };
    [
        object,
        uuid(C20AE5FC-3D9B-4CC0-A383-01E81D604509),
        dual,
        helpstring("ISeries Interface"),
        pointer_default(unique)
    ]
    interface ISeries : IConnection 
    {
        enum {SERIES_BASE=(CONNECTION_BASE+256)};

        [propget, id(SERIES_BASE+1), helpstring("property via")] 
            HRESULT via([out, retval] BSTR *pVal);
        [propput, id(SERIES_BASE+1), helpstring("property via")] 
            HRESULT via([in] BSTR newVal);
    };


//NonElectrical
    [
        uuid(794691C8-4FC1-4D7A-A077-08DE54F7455C),
        helpstring("NonElectrical class"),
        noncreatable
    ]
    coclass NonElectrical
    {
        [default] interface INonElectrical;
    };
    [
        object,
        uuid(501CB84D-7065-411D-9B92-EAC5AAD13B85),
        dual,
        helpstring("INonElectrical Interface"),
        pointer_default(unique)
    ]
    interface INonElectrical : IConnection 
    {
        enum {NONELECTRICAL_BASE=(CONNECTION_BASE+256)};

        [propget, id(NONELECTRICAL_BASE+1), helpstring("property to")] 
            HRESULT to([out, retval] BSTR *pVal);
        [propput, id(NONELECTRICAL_BASE+1), helpstring("property to")] 
            HRESULT to([in] BSTR newVal);
        [propget, id(NONELECTRICAL_BASE+2), helpstring("property from")] 
            HRESULT from([out, retval] BSTR *pVal);
        [propput, id(NONELECTRICAL_BASE+2), helpstring("property from")] 
            HRESULT from([in] BSTR newVal);
    };


//DigitalBus
    [
        uuid(CD0C37DB-8699-4098-8622-546FF4B69278),
        helpstring("DigitalBus class"),
        noncreatable
    ]
    coclass DigitalBus
    {
        [default] interface IDigitalBus;
    };
    [
        object,
        uuid(6DF82FE1-35DC-4B60-93BF-4F7D8EE565A3),
        dual,
        helpstring("IDigitalBus Interface"),
        pointer_default(unique)
    ]
    interface IDigitalBus : IConnection 
    {
        enum {DIGITALBUS_BASE=(CONNECTION_BASE+256)};

        [propget, id(DIGITALBUS_BASE+1), helpstring("List of pin names associated with each channel")] 
            HRESULT pins([out, retval] BSTR *pVal);
        [propput, id(DIGITALBUS_BASE+1), helpstring("List of pin names associated with each channel")] 
            HRESULT pins([in] BSTR newVal);
    };


//FourWire
    [
        uuid(0945AA99-5111-4899-B16C-95DC01F1C371),
        helpstring("FourWire class"),
        noncreatable
    ]
    coclass FourWire
    {
        [default] interface IFourWire;
    };
    [
        object,
        uuid(DAA84E0E-A962-4D4E-A217-4BE44CB9E5A6),
        dual,
        helpstring("IFourWire Interface"),
        pointer_default(unique)
    ]
    interface IFourWire : IConnection 
    {
        enum {FOURWIRE_BASE=(CONNECTION_BASE+256)};

        [propget, id(FOURWIRE_BASE+1), helpstring("property hi")] 
            HRESULT hi([out, retval] BSTR *pVal);
        [propput, id(FOURWIRE_BASE+1), helpstring("property hi")] 
            HRESULT hi([in] BSTR newVal);
        [propget, id(FOURWIRE_BASE+2), helpstring("property lo")] 
            HRESULT lo([out, retval] BSTR *pVal);
        [propput, id(FOURWIRE_BASE+2), helpstring("property lo")] 
            HRESULT lo([in] BSTR newVal);
        [propget, id(FOURWIRE_BASE+3), helpstring("property hiRef")] 
            HRESULT hiRef([out, retval] BSTR *pVal);
        [propput, id(FOURWIRE_BASE+3), helpstring("property hiRef")] 
            HRESULT hiRef([in] BSTR newVal);
        [propget, id(FOURWIRE_BASE+4), helpstring("property loRef")] 
            HRESULT loRef([out, retval] BSTR *pVal);
        [propput, id(FOURWIRE_BASE+4), helpstring("property loRef")] 
            HRESULT loRef([in] BSTR newVal);
    };


//Channels
    [
        uuid(FDD5E3A1-76F5-4916-B671-0CC719ACDCF5),
        helpstring("Channels class"),
        noncreatable
    ]
    coclass Channels
    {
        [default] interface IChannels;
    };
    [
        object,
        uuid(3993BBD6-C6AD-4641-AFA8-C2A7894E9740),
        dual,
        helpstring("IChannels Interface"),
        pointer_default(unique)
    ]
    interface IChannels : IControl 
    {
        enum {CHANNELS_BASE=(CONTROL_BASE+256)};
        
		[propget, id(CHANNELS_BASE+1), helpstring("List of pin names associated with each channel")] 
            HRESULT channelNames([out, retval] BSTR *pVal);
        [propput, id(CHANNELS_BASE+1), helpstring("List of pin names associated with each channel")] 
            HRESULT channelNames([in] BSTR newVal);
    };


};
