<?xml version="1.0" encoding="utf-8"?>
<!--
  MiniBus - ein erfundenes, aber typisches proprietaeres Telegramm, wie es in
  Gebaeude- und Anlagenautomation vorkommt. Beispiel der Website-Seite
  "Eigenes Protokoll dekodieren" und Grundlage des TrIML-Tutorials
  (docs/triml/<lang>/10-tutorial.md), hier mit format-Angaben fuer eine
  lesbare Anzeige.

    STX  Type  Address(2, big-endian)  Length  Payload[Length]  XOR  ETX
    02   ..    .. ..                   ..      ...              ..   03

  XOR = ByteXor ueber Type .. Payload (STX zaehlt nicht mit).
  Geprueft von TServer.Tests/Interpreters/TrimlTutorialTests.cs.
-->
<Trace-Interpreter-Definition>
  <interpreter name="MiniBus" type="FrameOriented" />
  <definition>

    <valuedescriptor type="byte" name="type-descriptor">
      <descriptor value="0x01" name="Status"  label="Status message" />
      <descriptor value="0x02" name="Command" label="Command" />
      <descriptor value="0x03" name="Error"   label="Error message" />
    </valuedescriptor>

    <message>
      <const type="byte" value="0x02" name="STX" />
      <byte  name="Type"     valuedescriptor="type-descriptor" />
      <word  name="Address"  bigendian="yes" format="0x{0:X4}" />
      <byte  name="Length" />
      <array sizeRef="Length" name="Payload" format="{0:X2}" />
      <calc  name="ExpectedChecksum" type="ByteXor" from="1" to="-1" resultType="byte" />
      <const ref="ExpectedChecksum" validate="true" name="Checksum" format="0x{0:X2}" />
      <const type="byte" value="0x03" name="ETX" />
      <match format="MiniBus {0} to {1}">
        <param ref="Type" />
        <param ref="Address" />
      </match>
    </message>

  </definition>
</Trace-Interpreter-Definition>
