--- /dev/null
+\r
+type Limit = \r
+ | Nolimit \r
+ | Inclusive { value : Double } \r
+ | Exclusive { value : Double } \r
+ | InclusiveLong { value : Long } \r
+ | ExclusiveLong { value : Long }\r
+\r
+type Range = { lower : Limit, upper : Limit }\r
+\r
+type Component = { name : String, type : DataType }\r
+type DataTypeDefinition = { name : String, type : DataType }\r
+\r
+type DataType =\r
+ | BooleanType {}\r
+ | ByteType { unit : Optional(String), range : Optional(Range) }\r
+ | IntegerType { unit : Optional(String), range : Optional(Range) }\r
+ | LongType { unit : Optional(String), range : Optional(Range) }\r
+ | FloatType { unit : Optional(String), range : Optional(Range) }\r
+ | DoubleType { unit : Optional(String), range : Optional(Range) }\r
+ | StringType { pattern : Optional(String), mimeType : Optional(String), length : Optional(String) }\r
+ | RecordType referable { referable : Boolean, components : Component[] }\r
+ | ArrayType { componentType : DataType, length : Optional(Range) }\r
+ | MapType { keyType : DataType, valueType : DataType }\r
+ | OptionalType { componentType : DataType }\r
+ | UnionType UnionType\r
+ | VariantType {}\r
+\r
+type UnionType = { components : Component[] }\r
+\r
+type UUID = { mostSigBits : Long, leastSigBits : Long }\r
+type Void = {}\r
+type URI = String\r
+type LocalizedText = Map(String, String)\r
+\r
+type Interface = {\r
+ methodDefinitions : Map(MethodTypeDefinition, {})\r
+ }\r
+type InterfaceDefinition = {\r
+ name : String,\r
+ type : Interface\r
+ }\r
+type MethodType = {\r
+ requestType : DataType,\r
+ responseType : DataType,\r
+ errorType : UnionType\r
+ }\r
+type MethodTypeDefinition = {\r
+ name : String,\r
+ type : MethodType\r
+ }\r
+\r
+\r
+type Handshake = | Version0\r
+type Version0 = {\r
+ recvMsgLimit : Integer,\r
+ sendMsgLimit : Integer,\r
+ methods : MethodTypeDefinition[]\r
+ }\r
+type Message = | RequestHeader RequestHeader \r
+ | ResponseHeader ResponseHeader\r
+ | ExecutionError_ ExecutionError_\r
+ | Exception_ Exception_\r
+ | InvalidMethodError InvalidMethodError\r
+ | ResponseTooLarge ResponseTooLarge\r
+type RequestHeader = {\r
+ requestId : Integer,\r
+ methodId : Integer\r
+ }\r
+type ResponseHeader = {\r
+ requestId : Integer\r
+ }\r
+type ExecutionError_ = {\r
+ requestId : Integer\r
+ }\r
+type InvalidMethodError = {\r
+ requestId : Integer\r
+ }\r
+type Exception_ = {\r
+ requestId : Integer, \r
+ message : String\r
+ }\r
+type ResponseTooLarge = {\r
+ requestId : Integer \r
+ }\r
+\r
+type AccessorReference = | ArrayIndexReference { childReference : Optional(AccessorReference), index : Integer }\r
+ | KeyReference { childReference : Optional(AccessorReference), key : Variant }\r
+ | OptionalValueReference { childReference : Optional(AccessorReference) }\r
+ | FieldIndexReference { childReference : Optional(AccessorReference), index : Integer }\r
+ | FieldNameReference { childReference : Optional(AccessorReference), fieldName : String }\r
+ | TagReference { childReference : Optional(AccessorReference) }\r
+ | TagIndexReference { childReference : Optional(AccessorReference), tag : Integer }\r
+ | TagNameReference { childReference : Optional(AccessorReference), tag : String }\r
+ | VariantValueReference { childReference : Optional(AccessorReference) }\r
+ | LabelReference { childReference : Optional(AccessorReference), label : String }\r
+\r
+type Event = | ArrayElementAdded { reference : Optional( AccessorReference ), index : Integer, value : Optional( Variant ) }\r
+ | ArrayElementRemoved { reference : Optional( AccessorReference ), index : Integer }\r
+ | MapEntryAdded { reference : Optional( AccessorReference ), key : Variant, value : Optional( Variant ) }\r
+ | MapEntryRemoved { reference : Optional( AccessorReference ), key : Variant }\r
+ | UnionValueAssigned { reference : Optional( AccessorReference ), tag : Integer, newValue : Optional( Variant ) }\r
+ | OptionalValueAssigned { reference : Optional( AccessorReference ), newValue : Optional( Variant ) }\r
+ | OptionalValueRemoved { reference : Optional( AccessorReference ) }\r
+ | ValueAssigned { reference : Optional( AccessorReference ), newValue : Optional( Variant ) }\r
+ | InvalidatedEvent { reference : Optional( AccessorReference ) }\r
+ \r
+type ChangeSet = { events : Event[] }\r
+\r
+type InterestSet = | BooleanInterestSet { notification : Boolean, value : Boolean }\r
+ | ByteInterestSet { notification : Boolean, value : Boolean }\r
+ | IntegerInterestSet { notification : Boolean, value : Boolean }\r
+ | LongInterestSet { notification : Boolean, value : Boolean }\r
+ | FloatInterestSet { notification : Boolean, value : Boolean }\r
+ | DoubleInterestSet { notification : Boolean, value : Boolean }\r
+ | StringInterestSet { notification : Boolean, value : Boolean }\r
+ | RecordInterestSet { notification : Boolean, notifications : Boolean[], value : Boolean, values : Boolean[] }\r
+ | ArrayInterestSet { notification : Boolean, notifications : Integer[], value : Boolean, values : Integer[] }\r
+ | MapInterestSet { notification : Boolean, notifications : Variant[], value : Boolean, values : Variant[], componentInterest : InterestSet, componentInterests : Map( Variant, InterestSet ) }\r
+ | OptionalInterestSet { notification : Boolean, value : Boolean, componentInterest : InterestSet }\r
+ | UnionInterestSet { notification : Boolean, value : Boolean, componentInterests : InterestSet[] }\r
+ | VariantInterestSet { notification : Boolean, value : Boolean, componentInterest : InterestSet, completeComponent : Boolean }\r
+\r
+type Datasource = {\r
+ nodes : Map(Variant, Node)\r
+ }\r
+type Node = {\r
+ id : Variant,\r
+ labels : LocalizedText,\r
+ children : Variant[],\r
+ value : Optional(Variant)\r
+ }\r
+\r
+type Instant = { \r
+ seconds : Long, \r
+ nanoSeconds : Integer(range=[0..999999999])\r
+ }\r
+\r
+type Duration = { \r
+ seconds : Long, \r
+ nanoSeconds : Integer(range=[0..999999999]) \r
+ }\r
+\r
+type LocalDate = { \r
+ year : Integer, \r
+ monthOfYear : Integer(range=[1..12]), \r
+ dayOfMonth : Integer(range=[1..31]) \r
+ }\r
+ \r
+type LocalTime = { \r
+ hourOfDay : Integer(range=[0..23]),\r
+ minuteOfHour : Integer(range=[0..59]),\r
+ secondOfMinute : Integer(range=[0..59]),\r
+ nanoOfSecond : Integer(range=[0..999999999])\r
+ }\r
+ \r
+type LocalDateTime = {\r
+ year : Integer, \r
+ monthOfYear : Integer(range=[1..12]), \r
+ dayOfMonth : Integer(range=[1..31]), \r
+ hourOfDay : Integer(range=[0..23]),\r
+ minuteOfHour : Integer(range=[0..59]),\r
+ secondOfMinute : Integer(range=[0..59]),\r
+ nanoOfSecond : Integer(range=[0..999999999])\r
+ }\r
+ \r
+type ZonedDateTime = {\r
+ date : LocalDate,\r
+ time : LocalTime,\r
+ zone : TimeZone\r
+ }\r
+ \r
+type TimeZone = { zoneId : String }\r
+\r
+// A result of a data capturing session\r
+type RecordingSession = {\r
+ // An optional Datasource URL\r
+ datasource : Optional( String ),\r
+ \r
+ // Events that occured in the data source during sampling, a map of Event Id to Event\r
+ events: Map( Integer, Event ),\r
+ \r
+ // A collection of events that are promoted to milestones, a map of Milestone Id to Event Id\r
+ milestones : Map( Integer, Integer ),\r
+ \r
+ // All records, a map of NodeId to Recording(T, V)\r
+ recordings : Map( Variant, Variant )\r
+ }\r
+ \r
+type SubscriptionParameters = {\r
+ nodeId : Variant,\r
+ deadband : Optional( Variant ),\r
+ interval : Optional( Variant )\r
+ }\r
+\r
+type SamplingConfiguration = {\r
+ // Capture events, if true events are captured\r
+ captureEvents : Boolean,\r
+ // Subscribed Variables\r
+ subscriptions : SubscriptionParameters[]\r
+ }\r
+ \r
+type Event = {\r
+ // Session unique identifier\r
+ id : Integer,\r
+\r
+ // Timevalue, a number type e.g. Double(unit="s"), or a date type (See #Time_Types)\r
+ time : Variant,\r
+\r
+ // Title\r
+ title : Optional(String), \r
+\r
+ // Message\r
+ message : String,\r
+ \r
+ // NodeId of the sender object, optional\r
+ source : Optional(Variant),\r
+\r
+ // Event Type: alarm, action, error, info, debug\r
+ type : String,\r
+ \r
+ // System Text, generated by the source system, eg. \94YD11D001 started\94\r
+ systemText : Optional(String), \r
+\r
+ // Comments\r
+ comments : Comment[],\r
+\r
+ // Other Metadata\r
+ metadata : Map(String, String) \r
+ }\r
+\r
+type Comment = {\r
+ user : Optional(String),\r
+ message : String\r
+ }\r