summaryrefslogtreecommitdiffstats
path: root/statechartz/calc.scxml
diff options
context:
space:
mode:
Diffstat (limited to 'statechartz/calc.scxml')
-rw-r--r--statechartz/calc.scxml195
1 files changed, 195 insertions, 0 deletions
diff --git a/statechartz/calc.scxml b/statechartz/calc.scxml
new file mode 100644
index 0000000..69df09f
--- /dev/null
+++ b/statechartz/calc.scxml
@@ -0,0 +1,195 @@
+<?xml version="1.0" ?>
+<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
+ initial="root" profile="ecmascript" name="calc">
+ <parallel id="root">
+ <state id="ui" initial="calc">
+ <onentry>
+ <script>showPopup('Press Spacebar to switch between widgets');</script>
+ </onentry>
+ <state id="calc">
+ <transition event="WIDGETS.NEXT" target="weather" />
+ </state>
+ <state id="weather">
+ <transition event="WIDGETS.NEXT" target="shopping" />
+ </state>
+ <state id="shopping">
+ <transition event="WIDGETS.NEXT" target="calc" />
+ </state>
+ </state>
+ <state id="popup_region" initial="popup_off">
+ <state id="popup_off">
+ <transition event="POPUP.SHOW" target="popup" />
+ </state>
+ <state id="popup">
+ <transition event="POPUP.HIDE" target="popup_off" />
+ <transition event="KEY.PRESS" target="popup_off" />
+ <onentry><script>
+ setTimeout(function(){raise("POPUP.HIDE");},2500);
+ </script></onentry>
+ </state>
+ </state>
+ <state initial="calc_logic">
+ <datamodel>
+ <data id="long_expr" expr="''" />
+ <data id="short_expr" expr="0" />
+ <data id="res" expr="0" />
+ </datamodel>
+ <state id="calc_logic" initial="on">
+ <state id="on" initial="ready">
+ <onentry>
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ <state id="ready" initial="begin">
+ <state id="begin">
+ <transition event="OPER.MINUS" target="negated1" />
+ <onentry>
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ </state>
+ <state id="result">
+ </state>
+ <transition event="OPER" target="opEntered" />
+ <transition event="DIGIT.0" target="zero1">
+ <assign dataid="short_expr" expr="''" />
+ </transition>
+ <transition event="DIGIT" target="int1">
+ <assign dataid="short_expr" expr="''" />
+ </transition>
+ <transition event="POINT" target="frac1">
+ <assign dataid="short_expr" expr="''" />
+ </transition>
+ </state>
+ <state id="negated1">
+ <onentry>
+ <assign dataid="short_expr" expr="'-'" />
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ <transition event="DIGIT.0" target="zero1" />
+ <transition event="DIGIT" target="int1" />
+ <transition event="POINT" target="frac1" />
+ </state>
+ <state id="operand1">
+ <state id="zero1">
+ <transition event="DIGIT" cond="_event.name != 'DIGIT.0'" target="int1" />
+ <transition event="POINT" target="frac1" />
+ </state>
+ <state id="int1">
+ <transition event="POINT" target="frac1" />
+ <transition event="DIGIT">
+ <assign dataid="short_expr" expr="_data.short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />
+ <send event="DISPLAY.UPDATE" />
+ </transition>
+ <onentry>
+ <assign dataid="short_expr" expr="_data.short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ </state>
+ <state id="frac1">
+ <onentry>
+ <assign dataid="short_expr" expr="_data.short_expr+'.'" />
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ <transition event="DIGIT">
+ <assign dataid="short_expr" expr="_data.short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />
+ <send event="DISPLAY.UPDATE" />
+ </transition>
+ </state>
+ <transition event="OPER" target="opEntered" />
+ </state>
+ <state id="opEntered">
+ <transition event="OPER.MINUS" target="negated2" />
+ <transition event="POINT" target="frac2" />
+ <transition event="DIGIT.0" target="zero2" />
+ <transition event="DIGIT" target="int2" />
+ <onentry>
+ <raise event="CALC.SUB" />
+ <send event="OP.INSERT">
+ <param name="operator" expr="_event.name" />
+ </send>
+ </onentry>
+ </state>
+ <state id="negated2">
+ <onentry>
+ <assign dataid="short_expr" expr="'-'" />
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ <transition event="DIGIT.0" target="zero2" />
+ <transition event="DIGIT" target="int2" />
+ <transition event="POINT" target="frac2" />
+ </state>
+ <state id="operand2">
+ <state id="zero2">
+ <transition event="DIGIT" cond="_event.name != 'DIGIT.0'" target="int2" />
+ <transition event="POINT" target="frac2" />
+ </state>
+ <state id="int2">
+ <transition event="DIGIT">
+ <assign dataid="short_expr" expr="_data.short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />
+ <send event="DISPLAY.UPDATE" />
+ </transition>
+ <onentry>
+ <assign dataid="short_expr" expr="_data.short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ <transition event="POINT" target="frac2" />
+ </state>
+ <state id="frac2">
+ <onentry>
+ <assign dataid="short_expr" expr="_data.short_expr+'.'" />
+ <send event="DISPLAY.UPDATE" />
+ </onentry>
+ <transition event="DIGIT">
+ <assign dataid="short_expr" expr="_data.short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />
+ <send event="DISPLAY.UPDATE" />
+ </transition>
+ </state>
+ <transition event="OPER" target="opEntered">
+ <raise event="CALC.SUB" />
+ <raise event="OP.INSERT" />
+ </transition>
+ <transition event="EQUALS" target="result">
+ <raise event="CALC.SUB" />
+ <raise event="CALC.DO" />
+ </transition>
+ </state>
+ <transition event="C" target="on">
+ <assign dataid="long_expr" expr="''" />
+ <assign dataid="short_expr" expr="0" />
+ <assign dataid="res" expr="0" />
+ </transition>
+ </state>
+ <transition event="CALC.DO">
+ <assign dataid="short_expr" expr="''+_data.res" />
+ <assign dataid="long_expr" expr="''" />
+ <assign dataid="res" expr="0" />
+ </transition>
+ <transition event="CALC.SUB">
+ <if cond="_data.short_expr!=''">
+ <assign dataid="long_expr" expr="_data.long_expr+'('+_data.short_expr+')'" />
+ </if>
+ <assign dataid="res" expr="eval(_data.long_expr)" />
+ <assign dataid="short_expr" expr="''" />
+ <send event="DISPLAY.UPDATE" />
+ </transition>
+ <transition event="DISPLAY.UPDATE">
+ <if cond="_data.short_expr == ''">
+ <script>outputText(_data.res);</script>
+ <else />
+ <script>outputText(_data.short_expr);</script>
+ </if>
+ </transition>
+ <transition event="OP.INSERT">
+ <if cond="_event.data.operator == 'OPER.PLUS'">
+ <assign dataid="long_expr" expr="_data.long_expr+'+'" />
+ <elseif cond="_event.data.operator=='OPER.MINUS'" />
+ <assign dataid="long_expr" expr="_data.long_expr+'-'" />
+ <elseif cond="_event.data.operator =='OPER.STAR'" />
+ <assign dataid="long_expr" expr="_data.long_expr+'*'" />
+ <elseif cond="_event.data.operator =='OPER.DIV'" />
+ <assign dataid="long_expr" expr="_data.long_expr+'/'" />
+ </if>
+ </transition>
+ </state>
+ </state>
+ </parallel>
+</scxml> \ No newline at end of file