diff options
Diffstat (limited to 'statechartz/calc.scxml')
-rw-r--r-- | statechartz/calc.scxml | 195 |
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 |