|
@@ -0,0 +1,78 @@
|
|
|
+<?xml version="1.0" ?>
|
|
|
+<statechart>
|
|
|
+ <semantics input_event_lifeline="whole"/>
|
|
|
+
|
|
|
+ <datamodel>
|
|
|
+ <var id="c" expr="0"/>
|
|
|
+ <var id="lp" expr="0"/>
|
|
|
+ <var id="p" expr="0"/>
|
|
|
+
|
|
|
+ <func id="digit(i:int, pos:int)">
|
|
|
+ return i // 10**pos % 10;
|
|
|
+ </func>
|
|
|
+
|
|
|
+ <func id="numdigits(i:int)">
|
|
|
+ return int(log10(i)) + 1;
|
|
|
+ </func>
|
|
|
+ </datamodel>
|
|
|
+
|
|
|
+ <tree>
|
|
|
+ <state>
|
|
|
+ <parallel id="Dialing">
|
|
|
+ <state id="Dialer" initial="WaitForDial">
|
|
|
+ <state id="WaitForDial">
|
|
|
+ <!-- t1 -->
|
|
|
+ <transition event="dial(d:int), not redial" cond="c < 10" target=".">
|
|
|
+ <code>
|
|
|
+ c += 1;
|
|
|
+ lp = lp * 10 + d;
|
|
|
+ </code>
|
|
|
+ <raise port="out" event="out(d)"/>
|
|
|
+ </transition>
|
|
|
+ <!-- t2 -->
|
|
|
+ <transition event="dial(d:int), redial" cond="c == 0" target="../DialDigits">
|
|
|
+ <code>
|
|
|
+ lp = d;
|
|
|
+ c = 1;
|
|
|
+ </code>
|
|
|
+ <raise port="out" event="out(d)"/>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ <state id="DialDigits">
|
|
|
+ <!-- t3 -->
|
|
|
+ <transition event="dial(d:int)" cond="c < 10" target=".">
|
|
|
+ <code>
|
|
|
+ lp = lp * 10 + d;
|
|
|
+ c += 1;
|
|
|
+ </code>
|
|
|
+ <raise port="out" event="out(d)"/>
|
|
|
+ </transition>
|
|
|
+ <!-- t4 -->
|
|
|
+ <transition cond="c == 10" target="../WaitForDial"/>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ <state id="Redialer" initial="WaitForRedial">
|
|
|
+ <state id="WaitForRedial">
|
|
|
+ <!-- t5 -->
|
|
|
+ <transition event="redial" cond="c == 0" target="../RedialDigits">
|
|
|
+ <code>
|
|
|
+ p = lp;
|
|
|
+ </code>
|
|
|
+ <raise event="dial(digit(lp, 1))"/>
|
|
|
+ </transition>
|
|
|
+ </state>
|
|
|
+ <state id="RedialDigits">
|
|
|
+ <!-- t6 -->
|
|
|
+ <transition cond="c < numdigits(p)" target=".">
|
|
|
+ <raise event="dial(digit(p, c+1))"/>
|
|
|
+ </transition>
|
|
|
+ <!-- t7 -->
|
|
|
+ <transition cond="c == numdigits(p)" target="../WaitForRedial"/>
|
|
|
+ </state>
|
|
|
+ </state>
|
|
|
+
|
|
|
+ </parallel>
|
|
|
+ </state>
|
|
|
+ </tree>
|
|
|
+</statechart>
|