Finish final version

This commit is contained in:
2026-07-03 23:05:33 +02:00
parent ca676989d5
commit 9fb951de30
10 changed files with 1628 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
use nix
+1
View File
@@ -1,2 +1,3 @@
.direnv/ .direnv/
Unterschrift.png Unterschrift.png
main.pdf
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

+96
View File
@@ -0,0 +1,96 @@
<mxfile host="embed.diagrams.net">
<diagram id="_j3wlcNpQtahodVmuTn4" name="Page-1">
<mxGraphModel dx="497" dy="359" grid="1" gridSize="5" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="flPkuWbbXEqdPGYcqM_J-1" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;labelBackgroundColor=none;" value="&lt;b&gt;Idle&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="280.2999999999998" y="115" as="geometry" />
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-2" edge="1" parent="1" source="flPkuWbbXEqdPGYcqM_J-1" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;labelBackgroundColor=none;fontColor=default;" target="flPkuWbbXEqdPGYcqM_J-1" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="355.2999999999998" y="240" as="sourcePoint" />
<mxPoint x="405.2999999999998" y="190" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-3" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;labelBackgroundColor=none;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry: clear_pio()&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit: Alarm, set_pio()&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="280.2999999999998" y="140" as="geometry" />
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-4" parent="1" style="ellipse;html=1;shape=startState;labelBackgroundColor=none;" value="" vertex="1">
<mxGeometry height="30" width="30" x="325.24" y="25" as="geometry" />
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-5" edge="1" parent="1" source="flPkuWbbXEqdPGYcqM_J-4" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;rounded=0;labelBackgroundColor=none;fontColor=default;" value="">
<mxGeometry relative="1" as="geometry">
<mxPoint x="340.24" y="115" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-6" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Blink&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="280.2399999999998" y="260" as="geometry" />
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-7" edge="1" parent="1" source="flPkuWbbXEqdPGYcqM_J-6" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="flPkuWbbXEqdPGYcqM_J-6" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="355.2399999999998" y="385" as="sourcePoint" />
<mxPoint x="405.2399999999998" y="335" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-8" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:toggle_pio()&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="280.2399999999998" y="285" as="geometry" />
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-9" edge="1" parent="1" source="flPkuWbbXEqdPGYcqM_J-8" style="endArrow=classic;html=1;rounded=0;exitX=-0.001;exitY=0.274;exitDx=0;exitDy=0;entryX=0.003;entryY=0.359;entryDx=0;entryDy=0;entryPerimeter=0;exitPerimeter=0;" target="flPkuWbbXEqdPGYcqM_J-3" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="220" y="300" />
<mxPoint x="220" y="160" />
</Array>
<mxPoint x="335" y="300" as="sourcePoint" />
<mxPoint x="385" y="250" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-10" connectable="0" parent="flPkuWbbXEqdPGYcqM_J-9" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Zyklus [total_blink_time &amp;gt;= max_cycle_time]" vertex="1">
<mxGeometry relative="1" x="-0.0132" y="-1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-11" edge="1" parent="1" source="flPkuWbbXEqdPGYcqM_J-3" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="flPkuWbbXEqdPGYcqM_J-6" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="345" y="255" as="sourcePoint" />
<mxPoint x="395" y="205" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-12" connectable="0" parent="flPkuWbbXEqdPGYcqM_J-11" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Zyklus" vertex="1">
<mxGeometry relative="1" x="-0.2117" y="-1" as="geometry">
<mxPoint x="1" y="-11" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-14" edge="1" parent="1" source="flPkuWbbXEqdPGYcqM_J-8" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;innerLoopWaypoints=1;" target="flPkuWbbXEqdPGYcqM_J-8" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="400" y="300" />
<mxPoint x="465" y="300" />
<mxPoint x="465" y="320" />
<mxPoint x="405" y="320" />
<mxPoint x="405" y="326" />
</Array>
<mxPoint x="370" y="310" as="sourcePoint" />
<mxPoint x="420" y="260" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-15" connectable="0" parent="flPkuWbbXEqdPGYcqM_J-14" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Text" vertex="1">
<mxGeometry relative="1" x="-0.0503" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-16" connectable="0" parent="flPkuWbbXEqdPGYcqM_J-14" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Text" vertex="1">
<mxGeometry relative="1" x="-0.0503" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="flPkuWbbXEqdPGYcqM_J-18" connectable="0" parent="flPkuWbbXEqdPGYcqM_J-14" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Zyklus" vertex="1">
<mxGeometry relative="1" x="-0.0161" y="1" as="geometry">
<mxPoint y="-1" as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

+348
View File
@@ -0,0 +1,348 @@
<mxfile host="embed.diagrams.net">
<diagram id="0ujAiOFXezjglgX2qZKg" name="Page-1">
<mxGraphModel dx="2541" dy="1221" grid="1" gridSize="5" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="2" parent="1" style="ellipse;html=1;shape=startState;fillColor=#000000;strokeColor=#000000;rounded=1;" value="" vertex="1">
<mxGeometry height="40" width="40" x="250.12" y="45" as="geometry" />
</mxCell>
<mxCell id="3" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;html=1;verticalAlign=bottom;endArrow=open;endSize=8;strokeColor=#000000;rounded=1;exitX=0.501;exitY=0.908;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="5" value="">
<mxGeometry relative="1" as="geometry">
<mxPoint x="270.1599999999994" y="79.99999999999994" as="sourcePoint" />
<mxPoint x="265" y="123.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="5" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Init&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="210" y="123.68" as="geometry" />
</mxCell>
<mxCell id="16" edge="1" parent="1" source="5" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="5" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="285" y="248.68" as="sourcePoint" />
<mxPoint x="335" y="198.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="17" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="210" y="148.68" as="geometry" />
</mxCell>
<mxCell id="18" edge="1" parent="1" source="17" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="22" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="260" y="203.68" as="sourcePoint" />
<mxPoint x="260" y="243.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="21" connectable="0" parent="18" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getButton(I2CSCHEDULER_STOCK3, 1)]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.1319" y="-1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="22" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Öffnen1&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="139.76" x="200.24" y="243.68" as="geometry" />
</mxCell>
<mxCell id="23" edge="1" parent="1" source="22" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="22" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="275.2399999999998" y="368.68" as="sourcePoint" />
<mxPoint x="325.2399999999998" y="318.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="24" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Event: Tür Kabine öffnen&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;&amp;nbsp;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Event: Tür Aussen öffnen&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="139.76" x="200.24" y="268.68" as="geometry" />
</mxCell>
<mxCell id="25" edge="1" parent="1" source="24" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="29" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="330" y="358.68" as="sourcePoint" />
<mxPoint x="120" y="383.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="26" connectable="0" parent="25" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_OFFEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="-14" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="27" edge="1" parent="1" style="endArrow=classic;html=1;rounded=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="270" y="323.68" as="sourcePoint" />
<mxPoint x="421.2399999999998" y="383.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="28" connectable="0" parent="27" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_OFFEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="33" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="29" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Öffnen1a&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="40.23999999999978" y="383.68" as="geometry" />
</mxCell>
<mxCell id="30" edge="1" parent="1" source="29" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="29" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="110.47999999999979" y="508.68" as="sourcePoint" />
<mxPoint x="160.4799999999998" y="458.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="31" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="40.23999999999978" y="408.68" as="geometry" />
</mxCell>
<mxCell id="32" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Öffnen1b&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="360.2399999999998" y="383.68" as="geometry" />
</mxCell>
<mxCell id="33" edge="1" parent="1" source="32" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="32" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="435.2399999999998" y="508.68" as="sourcePoint" />
<mxPoint x="485.2399999999998" y="458.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="34" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="360.2399999999998" y="408.68" as="geometry" />
</mxCell>
<mxCell id="40" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Offen&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="200.23999999999978" y="543.68" as="geometry" />
</mxCell>
<mxCell id="41" edge="1" parent="1" source="40" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="40" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="275.2399999999998" y="668.68" as="sourcePoint" />
<mxPoint x="325.2399999999998" y="618.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="42" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="200.23999999999978" y="568.68" as="geometry" />
</mxCell>
<mxCell id="43" edge="1" parent="1" source="42" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="264" y="643.68" as="sourcePoint" />
<mxPoint x="260" y="663.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="44" connectable="0" parent="43" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getButton(I2CSCHEDULER_STOCK0, 0)]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.1319" y="-1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="45" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Schliessen1&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="140.12" x="190.25" y="663.68" as="geometry" />
</mxCell>
<mxCell id="46" edge="1" parent="1" source="45" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="45" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="265.2499999999998" y="788.68" as="sourcePoint" />
<mxPoint x="315.2499999999998" y="738.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="47" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Event: Tür Kabine schliessen&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;&amp;nbsp;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Event: Tür Aussen schliessen&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="140.12" x="190.25" y="688.68" as="geometry" />
</mxCell>
<mxCell id="48" edge="1" parent="1" source="31" style="endArrow=classic;html=1;rounded=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" target="40" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="115" y="468.68" as="sourcePoint" />
<mxPoint x="440.2399999999998" y="553.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="49" connectable="0" parent="48" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_OFFEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="4" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="50" edge="1" parent="1" source="34" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="40" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="425" y="463.68" as="sourcePoint" />
<mxPoint x="265" y="523.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="51" connectable="0" parent="50" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_OFFEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="72" y="-29" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="53" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Schliessen1a&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="30.23999999999978" y="803.68" as="geometry" />
</mxCell>
<mxCell id="54" edge="1" parent="1" source="53" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="53" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="100.47999999999979" y="928.68" as="sourcePoint" />
<mxPoint x="150.4799999999998" y="878.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="55" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="30.23999999999978" y="828.68" as="geometry" />
</mxCell>
<mxCell id="56" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Schliessen1b&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="350.2399999999998" y="803.68" as="geometry" />
</mxCell>
<mxCell id="57" edge="1" parent="1" source="56" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="56" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="425.2399999999998" y="928.68" as="sourcePoint" />
<mxPoint x="475.2399999999998" y="878.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="58" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="350.2399999999998" y="828.68" as="geometry" />
</mxCell>
<mxCell id="59" edge="1" parent="1" style="endArrow=classic;html=1;rounded=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="260" y="743.68" as="sourcePoint" />
<mxPoint x="411.2399999999998" y="803.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="60" connectable="0" parent="59" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_GESCHLOSSEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="-2" y="-6" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="61" edge="1" parent="1" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" target="53" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="260" y="743.68" as="sourcePoint" />
<mxPoint x="110" y="803.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="62" connectable="0" parent="61" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_GESCHLOSSEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="-8" y="10" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="63" edge="1" parent="1" source="55" style="endArrow=classic;html=1;rounded=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="105" y="888.68" as="sourcePoint" />
<mxPoint x="250" y="963.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="64" connectable="0" parent="63" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_GESCHLOSSEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="4" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="65" edge="1" parent="1" source="58" style="endArrow=classic;html=1;rounded=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="415" y="883.68" as="sourcePoint" />
<mxPoint x="250" y="963.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="66" connectable="0" parent="65" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_GESCHLOSSEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="32" y="-15" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="67" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Geschlossen&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="120" x="190.48999999999978" y="963.68" as="geometry" />
</mxCell>
<mxCell id="68" edge="1" parent="1" source="67" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="67" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="265.4899999999998" y="1088.68" as="sourcePoint" />
<mxPoint x="315.4899999999998" y="1038.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="69" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="120" x="190.48999999999978" y="988.68" as="geometry" />
</mxCell>
<mxCell id="70" edge="1" parent="1" source="69" style="endArrow=classic;html=1;rounded=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;exitX=0;exitY=0.25;exitDx=0;exitDy=0;" target="24" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="20" y="1003.68" />
<mxPoint x="20" y="668.68" />
<mxPoint x="20" y="282.68" />
</Array>
<mxPoint x="185" y="1008.68" as="sourcePoint" />
<mxPoint x="10" y="616.18" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="71" connectable="0" parent="70" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getButton(I2CSCHEDULER_STOCK3, 1)]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.1319" y="-1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="72" parent="1" style="html=1;align=center;verticalAlign=top;rounded=1;absoluteArcSize=1;arcSize=10;dashed=0;whiteSpace=wrap;" value="&lt;b&gt;Eingeklemmt&lt;/b&gt;" vertex="1">
<mxGeometry height="80" width="160.24" x="620.32" y="620" as="geometry" />
</mxCell>
<mxCell id="73" edge="1" parent="1" source="72" style="endArrow=none;html=1;rounded=1;exitX=-0.002;exitY=0.302;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.001;entryY=0.302;entryDx=0;entryDy=0;entryPerimeter=0;" target="72" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="735.5599999999998" y="745" as="sourcePoint" />
<mxPoint x="785.5599999999998" y="695" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="75" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=left;verticalAlign=top;rounded=0;labelPosition=center;verticalLabelPosition=middle;" value="&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Entry:&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Event: Tür Kabine öffnen&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;&amp;nbsp;&lt;span style=&quot;white-space: pre;&quot;&gt;&#x9;&lt;/span&gt;Event: Tür Aussen öffnen&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;font-size: 8px;&quot;&gt;Exit:&lt;/font&gt;&lt;/div&gt;" vertex="1">
<mxGeometry height="55" width="159.76" x="620.5600000000001" y="645" as="geometry" />
</mxCell>
<mxCell id="76" edge="1" parent="1" source="47" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" target="75" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="430" y="763.68" as="sourcePoint" />
<mxPoint x="520.5599999999995" y="676.18" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="79" connectable="0" parent="76" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_EINGEKLEMMT]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.0216" y="1" as="geometry">
<mxPoint x="23" y="-8" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="80" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="329.32" y="728" as="sourcePoint" />
<mxPoint x="620.32" y="685" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="81" connectable="0" parent="80" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_EINGEKLEMMT]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.0216" y="1" as="geometry">
<mxPoint x="28" y="-2" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="82" edge="1" parent="1" source="58" style="endArrow=classic;html=1;rounded=0;exitX=1.003;exitY=0.198;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitPerimeter=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="700" y="840" />
</Array>
<mxPoint x="469.9999999999998" y="842.4299999999998" as="sourcePoint" />
<mxPoint x="700.2" y="700" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="83" connectable="0" parent="82" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_EINGEKLEMMT]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.0216" y="1" as="geometry">
<mxPoint x="-61" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="84" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" target="75" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="240" y="842" />
<mxPoint x="240" y="900" />
<mxPoint x="740" y="900" />
</Array>
<mxPoint x="149.99999999999977" y="842.4299999999998" as="sourcePoint" />
<mxPoint x="660.26" y="700" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="85" connectable="0" parent="84" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_EINGEKLEMMT]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="-0.0216" y="1" as="geometry">
<mxPoint x="93" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="86" edge="1" parent="1" source="72" style="endArrow=classic;html=1;rounded=1;entryX=1.01;entryY=0.585;entryDx=0;entryDy=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryPerimeter=0;" target="34" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="741" y="440" />
</Array>
<mxPoint x="595" y="570" as="sourcePoint" />
<mxPoint x="426.2399999999998" y="388.68" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="87" connectable="0" parent="86" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_kabine) == TUER_OFFEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="33" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="88" edge="1" parent="1" source="72" style="endArrow=classic;html=1;rounded=1;entryX=1;entryY=0.25;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" target="31" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="700" y="500" />
<mxPoint x="400" y="500" />
<mxPoint x="300" y="500" />
<mxPoint x="300" y="422" />
</Array>
<mxPoint x="620" y="580" as="sourcePoint" />
<mxPoint x="105" y="389" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="89" connectable="0" parent="88" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];rounded=1;" value="&lt;font style=&quot;font-size: 8px;&quot;&gt;Zyklus [getStatus(tuer_aussen) == TUER_OFFEN]&lt;/font&gt;" vertex="1">
<mxGeometry relative="1" x="0.0174" y="-1" as="geometry">
<mxPoint x="60" y="1" as="offset" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file not shown.

After

Width:  |  Height:  |  Size: 370 KiB

+520
View File
@@ -0,0 +1,520 @@
<mxfile host="embed.diagrams.net">
<diagram id="EaYkW2fJ8n5_NxkyVZ5k" name="Page-1">
<mxGraphModel dx="352" dy="254" grid="1" gridSize="5" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="xuCRX5vSqQQLfsLv1z8r-150" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="280" y="710" as="sourcePoint" />
<mxPoint x="280" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-151" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="379.64" y="710" as="sourcePoint" />
<mxPoint x="379.64" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-152" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="479.64" y="710" as="sourcePoint" />
<mxPoint x="479.64" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-153" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="579.64" y="710" as="sourcePoint" />
<mxPoint x="579.64" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-154" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="680" y="710" as="sourcePoint" />
<mxPoint x="680" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-155" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="780" y="710" as="sourcePoint" />
<mxPoint x="780" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-156" edge="1" parent="1" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="880" y="710" as="sourcePoint" />
<mxPoint x="880" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-1" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="&lt;div&gt;task_UNTEN_END_1&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="180" y="50" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-2" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_OBEN_END_2" vertex="1">
<mxGeometry height="30" width="180" y="80" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-5" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK1_EXAKT_3" vertex="1">
<mxGeometry height="30" width="180" y="110" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-6" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK1_OBEN_4" vertex="1">
<mxGeometry height="30" width="180" y="140" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-7" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK2_UNTEN_5" vertex="1">
<mxGeometry height="30" width="180" y="170" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-8" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK2_EXAKT_6" vertex="1">
<mxGeometry height="30" width="180" y="200" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-9" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK2_OBEN_7" vertex="1">
<mxGeometry height="30" width="180" y="230" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-32" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK3_UNTEN_8" vertex="1">
<mxGeometry height="30" width="180" y="260" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-33" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK3_EXAKT_9" vertex="1">
<mxGeometry height="30" width="180" y="290" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-34" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK3_OBEN_10" vertex="1">
<mxGeometry height="30" width="180" y="320" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-35" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK4_UNTEN_11" vertex="1">
<mxGeometry height="30" width="180" y="350" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-36" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_STOCK4_EXAKT_12" vertex="1">
<mxGeometry height="30" width="180" y="380" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-37" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_I2CSCHEDULER_13" vertex="1">
<mxGeometry height="30" width="180" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-38" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-124" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" target="xuCRX5vSqQQLfsLv1z8r-123" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="155" y="250" as="sourcePoint" />
<mxPoint x="210" y="60" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-40" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_TUER_KABINE_14" vertex="1">
<mxGeometry height="30" width="180" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-41" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_TUER_AUSSEN1_15" vertex="1">
<mxGeometry height="30" width="180" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-42" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_TUER_AUSSEN234_16" vertex="1">
<mxGeometry height="30" width="180" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-43" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_LED_KABINE_17" vertex="1">
<mxGeometry height="30" width="180" y="530" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-44" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_LED_AUSSEN1_18" vertex="1">
<mxGeometry height="30" width="180" y="560" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-45" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_RUF_TIMEOUT_19" vertex="1">
<mxGeometry height="30" width="180" y="590" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-46" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_FSM_STOCK_20" vertex="1">
<mxGeometry height="30" width="180" y="620" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-47" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_FSM_RUF_21" vertex="1">
<mxGeometry height="30" width="180" y="650" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-48" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="task_FSM_TUER_22" vertex="1">
<mxGeometry height="30" width="180" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-49" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="0" vertex="1">
<mxGeometry height="15" width="20" x="170" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-50" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="4" vertex="1">
<mxGeometry height="15" width="20" x="210" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-51" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="8" vertex="1">
<mxGeometry height="15" width="20" x="250" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-52" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="12" vertex="1">
<mxGeometry height="15" width="20" x="290" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-53" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="16" vertex="1">
<mxGeometry height="15" width="20" x="330" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-54" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="20" vertex="1">
<mxGeometry height="15" width="20" x="370" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-55" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="24" vertex="1">
<mxGeometry height="15" width="20" x="410" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-56" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="28" vertex="1">
<mxGeometry height="15" width="20" x="450" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-57" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="32" vertex="1">
<mxGeometry height="15" width="20" x="490" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-58" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="36" vertex="1">
<mxGeometry height="15" width="20" x="530" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-59" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="40" vertex="1">
<mxGeometry height="15" width="20" x="570" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-60" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="44" vertex="1">
<mxGeometry height="15" width="20" x="610" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-61" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="48" vertex="1">
<mxGeometry height="15" width="20" x="650" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-62" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="52" vertex="1">
<mxGeometry height="15" width="20" x="690" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-63" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="56" vertex="1">
<mxGeometry height="15" width="20" x="730" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-65" edge="1" parent="1" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="2.2737367544323206e-13" y="19.38" as="sourcePoint" />
<mxPoint x="920" y="19.38" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-81" edge="1" parent="1" style="endArrow=none;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint y="708.67" as="sourcePoint" />
<mxPoint x="920" y="710" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-82" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="60" vertex="1">
<mxGeometry height="15" width="20" x="770" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-83" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="64" vertex="1">
<mxGeometry height="15" width="20" x="810" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-84" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="68" vertex="1">
<mxGeometry height="15" width="20" x="850" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-85" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="72" vertex="1">
<mxGeometry height="15" width="20" x="890" y="5" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-86" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="0" vertex="1">
<mxGeometry height="15" width="20" x="170" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-87" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="4" vertex="1">
<mxGeometry height="15" width="20" x="210" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-88" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="8" vertex="1">
<mxGeometry height="15" width="20" x="250" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-89" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="12" vertex="1">
<mxGeometry height="15" width="20" x="290" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-90" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="16" vertex="1">
<mxGeometry height="15" width="20" x="330" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-91" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="20" vertex="1">
<mxGeometry height="15" width="20" x="370" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-92" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="24" vertex="1">
<mxGeometry height="15" width="20" x="410" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-93" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="28" vertex="1">
<mxGeometry height="15" width="20" x="450" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-94" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="32" vertex="1">
<mxGeometry height="15" width="20" x="490" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-95" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="36" vertex="1">
<mxGeometry height="15" width="20" x="530" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-96" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="40" vertex="1">
<mxGeometry height="15" width="20" x="570" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-97" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="44" vertex="1">
<mxGeometry height="15" width="20" x="610" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-98" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="48" vertex="1">
<mxGeometry height="15" width="20" x="650" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-99" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="52" vertex="1">
<mxGeometry height="15" width="20" x="690" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-100" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="56" vertex="1">
<mxGeometry height="15" width="20" x="730" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-101" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="60" vertex="1">
<mxGeometry height="15" width="20" x="770" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-102" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="64" vertex="1">
<mxGeometry height="15" width="20" x="810" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-103" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="68" vertex="1">
<mxGeometry height="15" width="20" x="850" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-104" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontSize=10;" value="72" vertex="1">
<mxGeometry height="15" width="20" x="890" y="710" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-105" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="190" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-106" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="80" x="180" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-107" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="70" x="180" y="650" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-108" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="60" x="180" y="620" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-111" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="30" x="180" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-112" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="40" x="180" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-113" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="50" x="180" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-114" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="210" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-115" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="220" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-116" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="230" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-119" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="oeffnen" vertex="1">
<mxGeometry height="30" width="10" x="240" y="620" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-120" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="250" y="650" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-121" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="oeffnen" vertex="1">
<mxGeometry height="30" width="10" x="260" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-122" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="280" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-123" parent="1" style="text;html=1;whiteSpace=wrap;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;rounded=0;fontStyle=0;labelPosition=center;verticalLabelPosition=middle;fontFamily=Courier New;" value="&lt;div&gt;task_INIT_0&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="180" y="20" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-125" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-48" style="endArrow=none;html=1;rounded=0;entryX=1;entryY=0;entryDx=0;entryDy=0;exitX=1;exitY=1;exitDx=0;exitDy=0;" target="xuCRX5vSqQQLfsLv1z8r-123" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="180" y="710" as="sourcePoint" />
<mxPoint x="180" y="20" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-124" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="180" y="20" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-127" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="180" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-128" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="330" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-129" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="480" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-131" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="780" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-132" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="380" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-133" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="480" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-134" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="580" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-135" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="680" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-136" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="780" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-138" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="880" y="410" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-139" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="330" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-140" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="480" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-142" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="780" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-143" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="330" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-144" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="30" x="480" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-146" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="30" x="780" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-147" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="380" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-148" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="580" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-149" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="40" x="780" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-157" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="200" y="110" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-162" edge="1" parent="1" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" target="xuCRX5vSqQQLfsLv1z8r-157" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="195" y="100" as="sourcePoint" />
<mxPoint x="225" y="275" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-163" connectable="0" parent="xuCRX5vSqQQLfsLv1z8r-162" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="ISR" vertex="1">
<mxGeometry relative="1" x="-0.0725" as="geometry">
<mxPoint x="-2" y="-19" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-164" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="390" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-165" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="340" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-166" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="350" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-167" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="offen" vertex="1">
<mxGeometry height="30" width="10" x="490" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-168" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="offen" vertex="1">
<mxGeometry height="30" width="10" x="500" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-169" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="510" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-171" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="340" y="530" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-172" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="350" y="560" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-173" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="630" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-174" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="10" x="630" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-175" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="630" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-176" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="640" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-177" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="650" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-178" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="360" y="530" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-179" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="370" y="560" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-180" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="offen" vertex="1">
<mxGeometry height="30" width="10" x="590" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-181" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;div&gt;TO&lt;/div&gt;start" vertex="1">
<mxGeometry height="30" width="10" x="600" y="650" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-183" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" value="" vertex="1">
<mxGeometry height="30" width="20" x="640" y="580" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-184" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="&lt;div&gt;TO&lt;/div&gt;&lt;div&gt;done&lt;/div&gt;" vertex="1">
<mxGeometry height="30" width="10" x="660" y="580" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-185" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="670" y="620" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-186" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="schliessen" vertex="1">
<mxGeometry height="30" width="10" x="690" y="620" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-187" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="790" y="440" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-188" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="800" y="470" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-189" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="" vertex="1">
<mxGeometry height="30" width="10" x="810" y="500" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-190" edge="1" parent="1" style="endArrow=classic;startArrow=baseDash;html=1;rounded=0;entryX=0.026;entryY=0.62;entryDx=0;entryDy=0;entryPerimeter=0;startFill=0;" target="xuCRX5vSqQQLfsLv1z8r-135" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="635" y="429" as="sourcePoint" />
<mxPoint x="575" y="380" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-191" connectable="0" parent="xuCRX5vSqQQLfsLv1z8r-190" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" value="Neokey" vertex="1">
<mxGeometry relative="1" x="-0.2963" as="geometry">
<mxPoint x="4" y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-192" parent="1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" value="schliessen" vertex="1">
<mxGeometry height="30" width="10" x="820" y="680" as="geometry" />
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-193" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=8 8;" target="xuCRX5vSqQQLfsLv1z8r-108">
<mxGeometry relative="1" as="geometry">
<mxPoint x="210.84" y="140" as="sourcePoint" />
<mxPoint x="209.99999999999997" y="681.29" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-196" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-184" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;dashPattern=8 8;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=-0.033;entryY=0.093;entryDx=0;entryDy=0;entryPerimeter=0;" target="xuCRX5vSqQQLfsLv1z8r-185">
<mxGeometry relative="1" as="geometry">
<mxPoint x="605" y="685" as="sourcePoint" />
<mxPoint x="605" y="655" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-197" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-135" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;dashPattern=8 8;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" target="xuCRX5vSqQQLfsLv1z8r-186">
<mxGeometry relative="1" as="geometry">
<mxPoint x="675" y="615" as="sourcePoint" />
<mxPoint x="675" y="628" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-198" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-139" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;dashPattern=8 8;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" target="xuCRX5vSqQQLfsLv1z8r-171">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="340" y="505" />
<mxPoint x="340" y="505" />
</Array>
<mxPoint x="315" y="485" as="sourcePoint" />
<mxPoint x="315" y="595" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-199" edge="1" parent="1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;dashPattern=8 8;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="350.31" y="530" />
<mxPoint x="350.31" y="530" />
</Array>
<mxPoint x="349.95" y="500" as="sourcePoint" />
<mxPoint x="349.95" y="560" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-202" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-180" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;dashPattern=8 8;" target="xuCRX5vSqQQLfsLv1z8r-181" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<Array as="points">
<mxPoint x="605" y="695" />
</Array>
<mxPoint x="550" y="685" as="sourcePoint" />
<mxPoint x="600" y="635" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-203" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-181" style="endArrow=baseDash;startArrow=baseDash;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;startFill=0;endFill=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="545" y="640" as="sourcePoint" />
<mxPoint x="640" y="650" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="xuCRX5vSqQQLfsLv1z8r-204" edge="1" parent="1" source="xuCRX5vSqQQLfsLv1z8r-183" style="endArrow=none;dashed=1;html=1;dashPattern=1 3;strokeWidth=2;rounded=0;exitX=0;exitY=1;exitDx=0;exitDy=0;" value="">
<mxGeometry height="50" relative="1" width="50" as="geometry">
<mxPoint x="545" y="640" as="sourcePoint" />
<mxPoint x="640" y="650" as="targetPoint" />
</mxGeometry>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
+656
View File
@@ -0,0 +1,656 @@
#import "@preview/ilm:2.1.0": *
#let link-text(body) = text(blue, body)
#set text(lang: "de")
#show: ilm.with(
title: [Ausarbeitung\ Embedded Systems Architecture],
authors: "Konstantin Veltmann",
date: datetime(year: 2026, month: 07, day: 03),
date-format: "[day padding:zero]. [month repr:short]. [year repr:full]",
figure-index: (
enabled: true,
title: "Abbildungsverzeichnis",
),
preface: [
Hiermit versichere ich, dass ich die vorliegende Arbeit selbstständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe. Ich versichere, dass ich alle wörtlich oder sinngemäß aus anderen Werken übernommenen Aussagen als solche gekennzeichnet habe. Dies gilt explizit auch für die Verwendung von text- oder codegenerierenden KI-Werkzeugen. Die eingereichte Arbeit ist weder vollständig noch in wesentlichen Teilen Gegenstand eines anderen Prüfungsverfahrens gewesen. Ich habe zur Kenntnis genommen, dass die Arbeit einer elektronischen Plagiatsprüfung unterzogen werden kann.
#v(2em)
#image("./assets/Unterschrift.png", height: 1.5cm)
#line(angle: 0deg, length: 6cm)
#v(5em)
Der Quelltext dieser Arbeit sowie Beispielcode und das vollständige Quellenverzeichnis sind unter #link-text([https://git.veltko.de/Weckyy702/ausarbeitung-embedded-systems-architecture]) aufzufinden und unter der #link("https://unlicense.org", link-text([Unlicense])) lizensiert.
],
)
= Aufgabe a) - Polling Zustandsautomat
#figure(
image("./assets/fsm.png"),
caption: [Modifizierter Zustandsautomat],
)
Dieser Automat verhält sich wie in der letzten Aufgabe. Für Aufgabe b) müssen die direkten Tastenabfragen (`getButton(...)`) mit Anfragen an die entsprechenden Module ersetzt werden:
- `getButton(I2CSCHEDULER_STOCK3, 1) => stock_get_oeffnen()`
- `getButton(I2CSCHEDULER_STOCK0, 0) => ruf_get_schliessen()`
= Aufgabe b) - Betriebssystem
== Prioritäten
Für die Taskprioritäten wurde folgendes Überlegt:
- Die Tastentasks sind Sicherheitsrelevant und müssen auf ISRs reagieren. Deshalb sollten sie die höchsten Prioritäten haben
- Der I²C-Scheduler muss mit (externer) Hardware reagieren und hat daher die nächsthöchste Priorität
- Die Tür-Tasks müssen ebenfalls mit Hardware interagieren und regelmäßig die Motorposition überprüfen
- Ebenso wie die LED-Tasks
- Da der Timeout-Tasks die Ruf-FSM freigeben soll, sollte er höhere Priorität haben als diese
- Die Stockwerks- und Ruf-FSMs sind als nächstes dran
- Die Tür-FSM hat die niedrigste Priorität, da sie von den aktuellsten Daten der anderen FSMs abhängig ist
Daraus ergeben sich folgende Prioritäten:
#table(
columns: (1fr, auto),
table.header([Task], [Priorität]),
[ `task_UNTEN_END_1` ], [ 1 ],
[ `task_OBEN_END_2` ], [ 2 ],
[ `task_STOCK1_EXAKT_3` ], [ 3 ],
[ `task_STOCK1_OBEN_4` ], [ 4 ],
[ `task_STOCK2_UNTEN_5` ], [ 5 ],
[ `task_STOCK2_EXAKT_6` ], [ 6 ],
[ `task_STOCK2_OBEN_7` ], [ 7 ],
[ `task_STOCK3_UNTEN_8` ], [ 8 ],
[ `task_STOCK3_EXAKT_9` ], [ 9 ],
[ `task_STOCK3_OBEN_10` ], [ 10 ],
[ `task_STOCK4_UNTEN_11` ], [ 11 ],
[ `task_STOCK4_EXAKT_12` ], [ 12 ],
[ `task_I2CSCHEDULER_13` ], [ 13 ],
[ `task_TUER_KABINE_14` ], [ 14 ],
[ `task_TUER_AUSSEN1_15` ], [ 15 ],
[ `task_TUER_AUSSEN234_16` ], [ 16 ],
[ `task_LED_KABINE_17` ], [ 17 ],
[ `task_LED_AUSSEN1_18` ], [ 18 ],
[ `task_RUF_TIMEOUT_19` ], [ 19 ],
[ `task_FSM_STOCK_20` ], [ 20 ],
[ `task_FSM_RUF_21` ], [ 21 ],
[ `task_FSM_TUER_22` ], [ 22 ],
)
== Positionstaster
Das Drücken der Positionstaster soll über ISRs festgestellt werden. Pro Taster wird eine ISR registriert, die einen Task startet, der ein Event an die #link(<chap-stock_fsm>, [Stockwerks-FSM]) sendet.
Eine alternative Implementation könnte ein Event direkt aus der ISR an die FSM senden, um den Scheduler zu entlasten. Eventuell wurde diese Variante nicht gewählt, da in ISRs kein dynamischer Speicher für das Senden des Events angelegt werden kann.
=== ISR
Für jeden Taster wird eine ISR wie folgt registriert. Für die Entprellung wird davon ausgegangen, dass es eine monoton steigende globale Zeitquelle mit 1µs Auflösung gibt, deren aktueller Wert mit `uint32_t clock_get_us(void)` auch in ISRs abgefragt werden kann.
```c
ISR(isr_UNTEN_END) {
static uint32_t last_press=0;
uint32_t now = clock_get_us();
if((now - last_press) > 500) {
last_press = now;
TaskActivateISR(task_UNTEN_END_1);
}
}
```
=== Tasks
Für jeden Taster wird ein Task wie folgt angelegt:
```c
TASKDECLARE(task_UNTEN_END_1, 1, 256, FALSE);
TASK(task_UNTEN_END_1) {
QueueSend_stock((stock_event_t) { .stock = STOCK_UNTEN_END });
TaskTerminate();
}
```
Das Event `stock_event_t` ist in #ref(<chap-stock_fsm>) definiert.
== I2CScheduler
Zum zyklischen Aufrufen des I²C-Tasks wird ein Counteralarm genutzt, der den Task alle 10ms startet. Sollte der Task in den 10ms bis zum nächsten Auslösen des Alarms nicht durchgelaufen sein, wird er nicht zweimal laufen.
Der Task läuft also _höchstens_ alle 10ms.
Die Initialisierung des Counteralarms wird in #ref(<chap-init>) besprochen.
Es wird angenommen, dass die in der Aufgabenstellung genannte Funktion `I2CSCHEDULER_DISPLAY` mit jedem Taskzyklus aufgerufen werden soll.
```c
TASKDECLARE(task_I2CSCHEDULER_13, 13, 256, TRUE);
ALARMDECLARE(alarm_I2C_CYCLE);
TASK(task_I2CSCHEDULER_13) {
I2CSCHEDULER_DISPLAY();
if(I2CSCHEDULER_NEOPIXEL_GET_KEY(I2C_STOCK_0, I2C_KEY_1)) {
QueueSend_ruf((ruf_event_t){ .type = RUF_EVENT_BUTTON, .stock = STOCK0, .direction = DIRECTION_UP });
}
// Weitere Tasten...
if(I2CSCHEDULER_NEOPIXEL_GET_KEY(I2C_STOCK_3, I2C_KEY_0)) {
QueueSend_ruf((ruf_event_t){ .type = RUF_EVENT_BUTTON, .stock = STOCK3, .direction = DIRECTION_DOWN });
}
TaskTerminate();
}
```
== Ruf-Automat <chap-ruf_fsm>
Diese Eventgesteuerte FSM ist für das Behandeln von Fahrgastwünschen zuständig und gibt der #link(<chap-tür_fsm>, [Tür-FSM]) das Schließsignal, wenn sich lange genug in einem Stockwerk aufgehalten wurde.
=== Event-Queue <chap-event_queue>
Die Event-Queue wird wie folgt definiert:
```c
typedef enum {
RUF_EVENT_BUTTON,
RUF_EVENT_TIMEOUT,
RUF_EVENT_GEOEFFNET,
// ...
} ruf_event_e;
typedef struct {
ruf_event_e type;
union {
struct {
i2cscheduler_stock_e stock;
direction_e direction;
};
};
} ruf_event_t;
VLDECLARE(vl_FSM_RUF_QUEUE, ruf_event_t);
SEMAPHOREDECLARE(sem_FSM_RUF_QUEUE_LENGTH, 0);
SEMAPHOREDECLARE(sem_FSM_RUF_QUEUE_TX_MUTEX, 1);
void QueueSend_ruf(ruf_event_t event) {
int reenable = IsrGetAndDisable();
SemaphoreDown(sem_FSM_RUF_QUEUE_TX_MUTEX);
vlAddBack(vl_FSM_RUF_QUEUE, &event);
SemaphoreUp(sem_FSM_RUF_QUEUE_TX_MUTEX);
IsrSet(reenable);
SemaphoreUp(sem_FSM_RUF_QUEUE);
}
void QueueReceive_ruf(ruf_event_t* e) {
SemaphoreDown(sem_FSM_RUF_QUEUE);
vlGetFront(vl_FSM_RUF_QUEUE, e);
}
```
Die Semaphore `sem_FSM_RUF_QUEUE_LENGTH` repräsentiert die Anzahl an unbearbeiteten Events in der Queue. Der consumer-Task ruft `SemaphoreDown` auf, um zu warten, bis mindestens ein Element vorliegt. \
Da mehrere Tasks in die Queue senden könnten, stellt `QueueSend_ruf` einen kritischen Bereich dar, der durch `sem_FSM_RUF_QUEUE_TX_MUTEX` geschützt wird. `QueueReceive_ruf` muss nicht geschützt werden, da davon auszugehen ist, dass `vlAddBack` nicht mit `vlGetFront` interferriert und es nur einen Empfängertask gibt.
=== Datenstruktur
Der Zustand der FSM wird in folgender Datenstruktur repräsentiert:
```c
typedef enum {
RUF_STATE_WAIT_OPEN
RUF_STATE_OEFFNEN,
// ...
} ruf_state_e;
struct {
ruf_state_e state;
bool schliessen : 1;
// ...
} fsm_ruf;
```
=== Externe Schnittstelle <chap-ruf_interface>
Die Schnittstelle für die Ruf-FSM sieht wie folgt aus. Obwohl (lesend) auf globale Variablen zugegriffen wird, ist kein kritischer Bereich notwendig, da nur ein Prozess gleichzeitig laufen kann, wodurch sich Lesen und Schreiben nicht überlappen und diese Funktionen nicht aus ISRs aufgerufen werden. Dasselbe gilt für die meisten getter-Funktionen.
```c
int ruf_get_schliessen(void) {
return fsm_ruf.schliessen;
}
ruf_state_e ruf_get_state(void) {
return fsm_ruf.state;
}
```
=== Task
Die Ruf-FSM wartet ständig auf neue Events und verarbeitet sie wie folgt:
```c
ALARMDECLARE(alarm_FSM_RUF_TIMEOUT);
TASKDECLARE(task_FSM_RUF_21, 21, 256, TRUE);
TASK(task_FSM_RUF_21) {
ruf_event_t event;
for(;;) {
//Auf das nächste Event warten
QueueReceive_ruf(&event);
//Event behandeln
switch(fsm_ruf.state) {
case RUF_STATE_WAIT_OPEN:
if(event.type != RUF_EVENT_TIMEOUT) {
/*TODO: was ist mit Eingaben während des Timeouts?*/
break;
}
/* Status für fsm_tuer setzen */
fsm_ruf.schliessen = true;
// ...
break;
// ....
case RUF_STATE_OEFFNEN:
if(event.type == RUF_EVENT_GEOEFFNET) {
AlarmSetTask(alarm_FSM_RUF_TIMEOUT, 5000, FALSE, task_RUF_TIMEOUT_19);
fsm_ruf.state = RUF_STATE_WAIT_OPEN;
}
// ...
break;
}
}
}
```
=== Timeout
Der Ruf-Timeout Task ist wie folgt implementiert:
```c
TASKDECLARE(task_RUF_TIMEOUT_19, 19, 256, FALSE);
TASK(task_RUF_TIMEOUT_19) {
QueueSend_ruf((ruf_event_t) { .type = RUF_EVENT_TIMEOUT });
TaskTerminate();
}
```
== Tür-Automat <chap-tür_fsm>
Dieser Automat ist für die (synchrone) Kontrolle der Innen- und Außentüren zuständig. Er ist als polling FSM implementiert, die alle 20ms aufgerufen wird.
Da nicht spezifiziert ist, wie die "korrekte" Außentür zu bestimmen ist, wird davon ausgegangen, dass es eine Funktion `tuer_t* get_aussen_tuer(void)` gibt, die die korrekte Außentür für das momentane Stockwerk bestimmt.
=== Datenstruktur
Der Zustand der Tür-FSM wird in folgender Datenstruktur gehalten:
```c
typedef enum {
FSM_TUER_STATE_INIT = 0,
FSM_TUER_STATE_OEFFNEN1,
FSM_TUER_STATE_OEFFNEN1A,
FSM_TUER_STATE_OEFFNEN1B,
FSM_TUER_STATE_OFFEN,
FSM_TUER_STATE_SCHLIESSEN1,
FSM_TUER_STATE_SCHLIESSEN1A,
FSM_TUER_STATE_SCHLIESSEN1B,
FSM_TUER_STATE_GESCHLOSSEN,
FSM_TUER_STATE_EINGEKLEMMT,
} fsm_tuer_state_e;
struct {
fsm_tuer_state_e state;
} fsm_tuer;
```
=== Tasks
Da der Code im Task genau dann ausgeführt wird, wenn der Counteralarm auslöst, hat die FSM implizit ein `Zyklus`-Event erhalten.
```c
ALARMDECLARE(alarm_FSM_TUER_CYCLE);
TASKDECLARE(task_FSM_TUER_22, 22, 256, TRUE);
TASK(task_FSM_TUER_22) {
tuer_t* tuer_aussen = get_aussen_tuer();;
switch(fsm_tuer.state) {
case FSM_TUER_STATE_INIT:
if(stock_get_oeffnen()) {
fsm_tuer.state = FSM_TUER_STATE_OEFFNEN1;
tuer_set_cmd(tuer_kabine, TUER_CMD_OEFFNEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_OEFFNEN);
}
break;
case FSM_TUER_STATE_OEFFNEN1:
if(tuer_getState(tuer_aussen) == TUER_GEOEFFNET) {
fsm_tuer.state = FSM_TUER_STATE_OEFFNEN1A;
} else if(tuer_getState(tuer_kabine) == TUER_GEOEFFNET) {
fsm_tuer.state = FSM_TUER_STATE_OEFFNEN1B;
}
break;
case FSM_TUER_STATE_OEFFNEN1A:
if(tuer_getState(tuer_kabine) == TUER_GEOEFFNET) {
QueueSend_ruf((ruf_event_t){.type = RUF_EVENT_GEOEFFNET});
fsm_tuer.state = FSM_TUER_STATE_GEOEFFNET;
}
break;
case FSM_TUER_STATE_OEFFNEN1B:
if(tuer_getState(tuer_aussen) == TUER_GEOEFFNET) {
fsm_tuer.state = FSM_TUER_STATE_GEOEFFNET;
}
break;
case FSM_TUER_STATE_OFFEN:
if(ruf_get_schliessen) {
fsm_tuer.state = FSM_TUER_STATE_SCHLIESSEN1;
tuer_set_cmd(tuer_kabine, TUER_CMD_SCHLIESSEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_SCHLIESSEN);
}
break;
case FSM_TUER_STATE_SCHLIESSEN1:
/* Eingeklemmte Türen werden zuerst überprüft, da sie sicherheitsrelevant sind */
if(tuer_getState(tuer_aussen) == TUER_EINGEKLEMMT) {
fsm_tuer.state = FSM_TUER_STATE_EINGEKLEMMT;
tuer_set_cmd(tuer_kabine, TUER_CMD_OEFFNEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_OEFFNEN);
} else if(tuer_getState(tuer_kabine) == TUER_EINGEKLEMMT) {
fsm_tuer.state = FSM_TUER_STATE_EINGEKLEMMT;
tuer_set_cmd(tuer_kabine, TUER_CMD_OEFFNEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_OEFFNEN);
} else if(tuer_getState(tuer_aussen) == TUER_GESCHLOSSEN) {
fsm_tuer.state = FSM_TUER_STATE_SCHLIESSEN1A;
} else if(tuer_getState(tuer_kabine) == TUER_GESCHLOSSEN) {
fsm_tuer.state = FSM_TUER_STATE_SCHLIESSEN1B;
}
break;
case FSM_TUER_STATE_SCHLIESSEN1A:
if(tuer_getState(tuer_kabine) == TUER_EINGEKLEMMT) {
fsm_tuer.state = FSM_TUER_STATE_EINGEKLEMMT;
tuer_set_cmd(tuer_kabine, TUER_CMD_OEFFNEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_OEFFNEN);
} else if(tuer_getState(tuer_kabine) == TUER_GESCHLOSSEN) {
fsm_tuer.state = FSM_TUER_STATE_GESCHLOSSEN;
}
break;
case FSM_TUER_STATE_SCHLIESSEN1B:
if(tuer_getState(tuer_aussen) == TUER_EINGEKLEMMT) {
fsm_tuer.state = FSM_TUER_STATE_EINGEKLEMMT;
tuer_set_cmd(tuer_kabine, TUER_CMD_OEFFNEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_OEFFNEN);
} else if(tuer_getState(tuer_aussen) == TUER_GESCHLOSSEN) {
fsm_tuer.state = FSM_TUER_STATE_GESCHLOSSEN;
}
break;
case FSM_TUER_STATE_GESCHLOSSEN:
if(stock_get_oeffnen()) {
fsm_tuer.state = FSM_TUER_STATE_OEFFNEN1;
tuer_set_cmd(tuer_kabine, TUER_CMD_OEFFNEN);
tuer_set_cmd(tuer_aussen, TUER_CMD_OEFFNEN);
}
break;
case FSM_TUER_STATE_EINGEKLEMMT:
if(tuer_getState(tuer_aussen) == TUER_OFFEN) {
fsm_tuer.state = FSM_TUER_STATE_OEFFNEN1A;
} else if(tuer_getState(tuer_kabine) == TUER_OFFEN) {
fsm_tuer.state = FSM_TUER_STATE_OEFFNEN1B;
}
break;
}
}
```
== Stockwerks-Automat <chap-stock_fsm>
=== Event-Queue
Die Event-Queue für den Stockwerks-Automaten ist analog zu der in #ref(<chap-event_queue>) besprochenen implementiert.
Das Event ist wie folgt definiert:
```c
typedef enum {
STOCK_UNTEN_END,
// ...
} stock_e;
typedef strut {
stock_e stock;
} stock_event_t;
void QueueReceive_stock(stock_event_t* e);
void QueueSend_stock(stock_event_t e);
```
=== Datenstruktur
Der Zustand der FSM wird in folgender Datenstruktur gehalten.
```c
typedef enum {
// ...
} stock_state_e;
struct {
stock_state_e state;
bool oeffnen : 1;
} fsm_stock;
```
=== Externe Schnittstelle
Zur Kommunikation mit der polling FSM werden folgende Funktionen bereitgestellt. Es gelten die gleichen Bedenken zur Synchronisierung wie in #ref(<chap-ruf_interface>).
```c
int stock_get_oeffnen(void) {
return fsm_stock.oeffnen;
}
```
=== Tasks
```c
TASKDECLARE(task_FSM_STOCK_20, 20, 256, TRUE);
TASK(task_FSM_STOCK_20) {
stock_event_t event;
for(;;) {
QueueReceive_stock(&event);
switch(fsm_stock.state) {
// ...
}
}
}
```
== Türen <chap-türen>
Die Türen (`tuer_kabine`, `tuer_aussen` und `tuer_aussen234`) werden jeweils durch eine Datenstruktur `tuer_t` und einen zugehörigen Task repräsentiert. Außerdem werden für die pollenden FSMs getter-Methoden bereitgestellt.
=== Datenstrukturen
Der Zustand der Tueren wird in folgender Datenstruktur festgehalten:
```c
typedef enum {
TUER_GESCHLOSSEN,
TUER_OEFFNEN,
TUER_OFFEN,
TUER_SCHLIESSEN,
TUER_EINGEKLEMMT,
} tuer_state_e;
typedef enum {
TUER_CMD_NONE,
TUER_CMD_OEFFNEN,
TUER_CMD_SCHLIESSEN,
} tuer_cmd_e;
typedef struct {
tuer_state_e state;
tuer_cmd_e command;
// ...
} tuer_t;
tuer_t tuer_kabine, tuer_aussen1, tuer_assen234;
```
=== Externe Schnittstellen
Damit andere Module den Zustand der Türen abfragen können, werden folgende Methoden bereitgestellt:
```c
void tuer_set_cmd(tuer_t* me, tuer_cmd_e cmd) {
me->command = cmd;
}
tuer_state_e tuer_getState(tuer_t* me) {
return me->state;
}
```
=== Tasks
Hier wird beispielsweise nur der Code für die Kabinentür angezeigt. Die Außentüren führen identischen Code in jeweils eigenen Tasks mit eigenen Counteralarmen aus.
```c
TASKDECLARE(task_TUER_KABINE_14, 14, 256, TRUE);
ALARMDECLARE(alarm_TUER_KABINE_CYCLE);
TASK(task_TUER_KABINE_14) {
switch(tuer_kabine.state) {
case TUER_OEFFNEN:
if(/*tür offen*/) {
}
break;
// ...
}
TaskTerminate();
}
```
== LEDs
Jede (physische) Tür hat eine LED, die den Zustand der Tür anzeigt. Das Blinken wird durch folgenden Zustandsautomaten realisiert:
#figure(
image("./assets/led_fsm.png"),
caption: [LED-Zustandsautomat],
)
Wie bei der Tür-FSM wird das `Zyklus`-Event implizit bei jedem Aufrufen des Tasks empfangen.
=== Datenstruktur
```c
typedef enum {
LED_STATE_IDLE,
LED_STATE_BLINK,
} led_state_e;
struct led_fsm {
led_state_e state;
uint32_t total_blink_time_ms;
uint32_t max_blink_time_ms;
uint32_t blink_cycle_time_ms;
// Pin-Nummern etc. ...
} led_kabine, led_aussen1;
```
=== Schnittstelle
Da mehrere Schreib-Operationen auf den geteilten globalen LED-FSMs ausgeführt werden, muss sie durch eine Semaphore geschützt werden.
```c
SEMAPHOREDECLARE(sem_LED_KABINE_MUTEX, 1);
void led_start_blink(struct led_state* me, uint32_t cycle_time_ms, uint32_t blinkt_time_ms) {
SemaphoreDown(sem_LED_KABINE_MUTEX);
me->blink_cycle_time_ms = cycle_time_ms;
me->max_blink_time_ms = blink_time_ms;
SemaphoreUp(sem_LED_KABINE_MUTEX);
TaskActivate(task_LED_KABINE_17);
}
```
=== Tasks
Für jede der LEDs wird ein Task wie folgt erzeugt.
```c
TASKDECLARE(task_LED_KABINE_17, 17, 256, TRUE);
ALARMDECLARE(alarm_LED_KABINE);
TASK(task_LED_KABINE_17) {
SemaphoreDown(sem_LED_START_MUTEX);
switch(led_kabine.state) {
case LED_STATE_IDLE:
led_kabine.total_blink_time_ms = 0;
AlarmSetTask(alarm_LED_KABINE, led_kabine.blink_cycle_time_ms, TRUE, task_LED_KABINE_17);
// set PIO
led_kabine.state = LED_STATE_BLINK;
break;
case LED_STATE_BLINK:
if(led_kabine.total_blink_time_ms >= led_kabine.max_blink_time_ms) {
// clear PIO
led_kabine.state = LED_STATE_IDLE;
AlarmCancel(alarm_LED_KABINE);
break;
}
led_kabine.total_blink_ms += led_kabine.blink_cycle_time_ms;
// toggle PIO
break;
}
SemaphoreUp(sem_LED_START_MUTEX);
TaskTerminate();
}
```
== Initialisierung <chap-init>
Die initialisierung der Ressourcen und Tasks wird durch einen hochprioren `init`-Task wie folgt vorgenommen:
```
TASKDECLARE(task_INIT_0, 0, 256, TRUE);
TASK(task_INIT_0) {
// evtl. weitere Initialisierung für Peripherie ...
AlarmSetTask(alarm_I2C_CYCLE, 10, TRUE, task_i2c_scheduler_13);
AlarmSetTask(alarm_FSM_TUER_CYCLE, 20, TRUE, task_FSM_TUER_22);
AlarmSetTask(alarm_TUER_KABINE_CYCLE, 15, TRUE, task_TUER_KABINE_14);
AlarmSetTask(alarm_TUER_AUSSEN1_CYCLE, 15, TRUE, task_TUER_AUSSEN1_15);
AlarmSetTask(alarm_TUER_AUSSEN234_CYCLE, 15, TRUE, task_TUER_AUSSEN234_16);
TaskTerminate();
}
```
= Aufgabe c) - Scheduling-Diagramm
Aus Gründen der Übersichtlichkeit wird der `Blocked`-Zustand nicht explizit dargestellt, sondern durch ein leeres Feld. Die Zustände #text(yellow)[Ready] und #text(green)[Running] werden als farbige Boxen dargestellt.
Aktiviert ein Task einen anderen Task durch `TaskActivate`, zeigt ein gestrichelter Pfeil vom aktivierenden Task zum aktivierten Task.
#figure(
image("./assets/scheduling_diagram.png"),
caption: [Timing-Diagramm],
)
Für dieses Diagramm wird folgender (unrealistischer) Ablauf angenommen:
1. Bei $t = 2"ms"$ löst der Stock 3-Taster aus.
2. Dadurch wird de Stock-FSM (wieder) aktivert und setzt ihre `oeffnen`-Flag.
3. Die TÜr-FSM pollt die Stock-FSM und signalisiert der Kabinen- und Außentür, sich zu öffnen.
4. Die Türen aktivieren ihre jeweiligen LED-Tasks und starten die Motoren.
5. Beim nächsten Zyklus der TÜr-Regler sind die TÜren bereits geöffnet.
6. Die Tür-FSM sendet das "Geöffnet"-Event and die Ruf-FSM, die das Timeout startet
7. Das Ruf-Timeout endet bei $t = 46"ms"$ und aktiviert baldmöglichst die Ruf-FSM
8. Bei $t = 45.5"ms"$ wird eine der Neokeys gedrückt.
9. Der I²C-Scheduler sendet beim nächsten Zyklus eine Event an die Ruf-FSM, die ihre `schliessen`-Flag setzt.
10. Bei $t=64"ms"$ weist die Tür-FSM die Türen zum Schließen an.
+6
View File
@@ -0,0 +1,6 @@
{ pkgs ? import <nixpkgs> { } }:
pkgs.mkShell {
packages = with pkgs; [
typst
];
}