MINT-scxml 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.gemtest +0 -0
  2. data/Gemfile +5 -0
  3. data/Gemfile.lock +18 -0
  4. data/History.txt +4 -0
  5. data/MINT-scxml.gemspec +35 -0
  6. data/Manifest.txt +49 -0
  7. data/README.rdoc +50 -0
  8. data/Rakefile +31 -0
  9. data/lib/MINT-scxml.rb +5 -0
  10. data/lib/MINT-scxml/scxml-parser.rb +228 -0
  11. data/spec/atm_spec.rb +69 -0
  12. data/spec/parser_spec.rb +394 -0
  13. data/spec/spec.opts +6 -0
  14. data/spec/spec_helper.rb +8 -0
  15. data/spec/test_handgestures_spec.rb +53 -0
  16. data/spec/testmachines/atm_enhanced.rb +129 -0
  17. data/spec/testmachines/handgestures-scxmlgui.png +0 -0
  18. data/spec/testmachines/handgestures-scxmlgui.scxml +106 -0
  19. data/spec/testmachines/multiplestates.rb +25 -0
  20. data/spec/testmachines/traffic_light_enhanced.rb +56 -0
  21. data/spec/testmachines/vending_machine1.rb +18 -0
  22. data/spec/testmachines/vending_machine2.rb +42 -0
  23. data/spec/testmachines/vending_machine3.rb +48 -0
  24. data/spec/testmachines/vending_machine4.rb +29 -0
  25. data/spec_helper.rb +8 -0
  26. data/statemachines/AICommand_scxml_spec.rb +38 -0
  27. data/statemachines/AIO_scxml_spec.rb +36 -0
  28. data/statemachines/aui-scxml/AIC.scxml +26 -0
  29. data/statemachines/aui-scxml/AICommand.scxml +34 -0
  30. data/statemachines/aui-scxml/AICommand2.scxml +32 -0
  31. data/statemachines/aui-scxml/AIO.scxml +25 -0
  32. data/statemachines/aui/AIC.rb +29 -0
  33. data/statemachines/aui/AIChoiceElement.rb +32 -0
  34. data/statemachines/aui/AICommand.rb +34 -0
  35. data/statemachines/aui/AIIN.rb +7 -0
  36. data/statemachines/aui/AIINContinous.rb +41 -0
  37. data/statemachines/aui/AIMultiChoice.rb +46 -0
  38. data/statemachines/aui/AIMultiChoiceElement.rb +46 -0
  39. data/statemachines/aui/AIOUTContinous.rb +41 -0
  40. data/statemachines/aui/AISingleChoice.rb +42 -0
  41. data/statemachines/aui/AISingleChoiceElement.rb +45 -0
  42. data/statemachines/aui/aio.rb +28 -0
  43. data/statemachines/specs/AICommand_spec.rb +58 -0
  44. data/statemachines/specs/AIINContinous_spec.rb +61 -0
  45. data/statemachines/specs/AIMultiChoiceElement_spec.rb +70 -0
  46. data/statemachines/specs/AIMultiChoice_spec.rb +56 -0
  47. data/statemachines/specs/AIOUTContinous_spec.rb +71 -0
  48. data/statemachines/specs/AIO_spec.rb +53 -0
  49. data/statemachines/specs/AISingleChoiceElement_spec.rb +58 -0
  50. data/statemachines/specs/AISingleChoice_spec.rb +68 -0
  51. metadata +146 -0
@@ -0,0 +1,129 @@
1
+ # -*- coding: raw-text -*-
2
+ require 'rubygems'
3
+ require 'statemachine'
4
+
5
+ module Statemachine
6
+ module SuperstateBuilding
7
+
8
+ def state(id, &block)
9
+ builder = StateBuilder.new(id, @subject, @statemachine)
10
+ builder.instance_eval(&block) if block
11
+ p "id>> #{id}"
12
+ end
13
+ end
14
+
15
+ end
16
+
17
+ class AtmContext
18
+
19
+ attr_accessor :statemachine
20
+
21
+ def initialize
22
+ @conta = 100000
23
+ @senha = "0000"
24
+ end
25
+
26
+ def verifica_senha(senha)
27
+ if senha == @senha
28
+ @statemachine.senha_correta
29
+ else
30
+ @statemachine.senha_errada
31
+ end
32
+ end
33
+
34
+ def verifica_escolha(escolha)
35
+ case escolha.downcase
36
+ when "saldo": @statemachine.saldo
37
+ when "saque": puts "Entre com a quantia a ser sacada: "
38
+ @statemachine.saque(gets.chomp!)
39
+ when "cancelar": @statemachine.cancelar
40
+ else @statemachine.invalida
41
+ end
42
+ end
43
+
44
+ def emitindo(quantia)
45
+ if (Integer(quantia) <= @conta)
46
+ puts "Emitindo: R$#{quantia}"
47
+ @conta -= Integer(quantia)
48
+ else
49
+ puts "Saldo insuficiente"
50
+ end
51
+ nova_operacao
52
+ end
53
+
54
+ def saldo
55
+ puts "Seu saldo: R$#{@conta}"
56
+ nova_operacao
57
+ end
58
+
59
+ def nova_operacao
60
+ puts "Deseja realizar outra operacao? (S/N)"
61
+ decisao = gets.chomp!
62
+ if decisao.downcase == "s"
63
+ @statemachine.nova_opcao
64
+ else
65
+ @statemachine.cancelar
66
+ end
67
+ end
68
+ end
69
+
70
+ if __FILE__ == $0
71
+
72
+ atm = Statemachine.build do
73
+ startstate :ocioso
74
+ superstate :operando do
75
+ state :esperando_senha do
76
+ event :senha, :senha_inserida
77
+ on_entry Proc.new{puts "Digite a senha"}
78
+ end
79
+ state :senha_inserida do
80
+ event :senha_errada, :esperando_senha, Proc.new {puts "Senha incorreta."}
81
+ event :senha_correta, :esperando_opcao
82
+ on_entry :verifica_senha
83
+ end
84
+ state :esperando_opcao do
85
+ event :opcao, :opcao_escolhida
86
+ on_entry Proc.new{puts "Digite a sua escolha"}
87
+ end
88
+ state :opcao_escolhida do
89
+ event :saldo, :exibindo_saldo
90
+ event :saque, :emitindo_quantia
91
+ event :invalida, :esperando_opcao
92
+ on_entry :verifica_escolha
93
+ end
94
+ state :exibindo_saldo do
95
+ event :nova_opcao, :esperando_opcao
96
+ on_entry :saldo
97
+
98
+ end
99
+ state :emitindo_quantia do
100
+ event :nova_opcao, :esperando_opcao
101
+ on_entry :emitindo
102
+ end
103
+
104
+ event :cancelar, :ocioso, Proc.new {puts "Saindo..."}
105
+ end
106
+
107
+ state :ocioso do
108
+ event :cartao, :esperando_senha
109
+ event :cancelar, :ocioso
110
+ end
111
+
112
+ context AtmContext.new
113
+ end
114
+
115
+ atm.context.statemachine = atm
116
+ atm.cartao
117
+ # Continua perguntando a senha at� acertar
118
+ begin
119
+ atm.senha(gets.chomp!)
120
+ end until atm.state != :esperando_senha
121
+
122
+ # Continua perguntando at� acertar
123
+ begin
124
+ atm.opcao(gets.chomp!)
125
+ end until atm.state != :esperando_opcao
126
+ atm.cancelar
127
+ end
128
+
129
+
@@ -0,0 +1,106 @@
1
+ <scxml id="SCXML" xmlns="http://www.w3.org/2005/07/scxml"><!-- node-size-and-position x=0.0 y=0.0 w=500.0 h=940.0 -->
2
+ <state id="hand_gestures" initial="no_hands"><!-- node-size-and-position x=20.0 y=40.0 w=450.0 h=880.0 -->
3
+ <state id="two_hands" initial="wait_two"><!-- node-size-and-position x=30.0 y=40.0 w=340.0 h=410.0 -->
4
+ <transition event="one_hand" target="one_hand"><!-- edge-path [one_hand] x=190.0 y=517.0 pointx=-1.0 pointy=23.0 offsetx=6.0 offsety=23.0 --></transition>
5
+ <transition event="no_hands" target="no_hands"><!-- edge-path [no_hands] x=94.49800059980008 y=474.80003998800396 pointx=0.0 pointy=7.0 offsetx=5.0 offsety=4.0 --></transition>
6
+ <state id="n" initial="narrowing"><!-- node-size-and-position x=20.0 y=240.0 w=135.53364159488612 h=147.0 -->
7
+ <transition event="widen" target="w">
8
+ <invoke src="print_distance" type="x-mint"></invoke>
9
+ <!-- edge-path [w] x=62.766820797443074 y=214.0 pointx=0.0 pointy=29.0 offsetx=-2.0 offsety=-8.0 --></transition>
10
+ <state id="narrowed"><!-- node-size-and-position x=30.0 y=30.0 w=60.0 h=20.0 -->
11
+ <transition event="narrow" target="narrowing">
12
+ <invoke src="print_distance" type="x-mint"></invoke>
13
+ <!-- edge-path [narrowing] x=82.76682079744307 y=84.0 pointx=0.0 pointy=22.0 offsetx=2.0 offsety=3.0 --></transition>
14
+ </state>
15
+ <state id="narrowing"><!-- node-size-and-position x=20.0 y=110.0 w=60.0 h=20.0 -->
16
+ <onentry>
17
+ <invoke src="start_confirm_timeout" type="x-mint"></invoke>
18
+ </onentry>
19
+ <onexit>
20
+ <invoke src="stop_confirm_timeout" type="x-mint"></invoke>
21
+ </onexit>
22
+ <transition event="confirm" target="narrowed"><!-- edge-path [narrowed] x=32.766820797443074 y=74.0 pointx=0.0 pointy=9.0 offsetx=-3.0 offsety=-6.0 --></transition>
23
+ <transition event="narrow">
24
+ <invoke src="reset_confirm_ticker" type="x-mint"></invoke>
25
+ <!-- edge-path [narrowing] pointx=0.0 pointy=-10.0 offsetx=27.0 offsety=-3.0 --></transition>
26
+ </state>
27
+ </state>
28
+ <state id="w" initial="widening"><!-- node-size-and-position x=20.953427405958184 y=42.99999999999999 w=133.62678678296976 h=147.0 -->
29
+ <transition event="narrow" target="n">
30
+ <invoke src="print_distance" type="x-mint"></invoke>
31
+ <!-- edge-path [n] x=111.0 y=215.0 pointx=0.0 pointy=31.0 offsetx=2.0 offsety=6.0 --></transition>
32
+ <state id="widened"><!-- node-size-and-position x=29.999999999999986 y=40.0 w=50.0 h=20.0 -->
33
+ <transition event="widen" target="widening">
34
+ <invoke src="print_distance" type="x-mint"></invoke>
35
+ <!-- edge-path [widening] x=81.8133933914849 y=81.0 pointx=0.0 pointy=15.0 offsetx=9.0 offsety=-10.0 --></transition>
36
+ </state>
37
+ <state id="widening"><!-- node-size-and-position x=21.962724282969738 y=111.0 w=50.0 h=20.0 -->
38
+ <onentry>
39
+ <invoke src="start_confirm_timeout" type="x-mint"></invoke>
40
+ </onentry>
41
+ <onexit>
42
+ <invoke src="stop_confirm_timeout" type="x-mint"></invoke>
43
+ </onexit>
44
+ <transition event="confirm" target="widened"><!-- edge-path [widened] x=43.50171423674868 y=80.18515344006022 pointx=0.0 pointy=21.0 offsetx=-1.0 offsety=-12.0 --></transition>
45
+ <transition event="widen" target="widening">
46
+ <invoke src="reset_confirm_ticker" type="x-mint"></invoke>
47
+ <!-- edge-path [widening] pointx=0.0 pointy=20.0 offsetx=0.0 offsety=0.0 --></transition>
48
+ </state>
49
+ </state>
50
+ <state id="wait_two"><!-- node-size-and-position x=210.0 y=160.0 w=100.0 h=40.0 -->
51
+ <transition event="widen" target="w"><!-- edge-path [w] pointx=-1.0 pointy=-20.0 offsetx=-7.0 offsety=-3.0 --></transition>
52
+ <transition event="narrow" target="n"></transition>
53
+ </state>
54
+ </state>
55
+ <state id="one_hand" initial="wait_one"><!-- node-size-and-position x=20.0 y=570.0 w=190.0 h=286.828125 -->
56
+ <transition event="two_hands" target="two_hands"><!-- edge-path [two_hands] x=129.50312353591877 y=509.75007808839797 pointx=0.0 pointy=-30.0 offsetx=1.0 offsety=-5.0 --></transition>
57
+ <transition event="no_hands" target="no_hands"><!-- edge-path [no_hands] x=50.0 y=547.0 pointx=0.0 pointy=19.0 offsetx=-3.0 offsety=-9.0 --></transition>
58
+ <state id="previous"><!-- node-size-and-position x=65.0 y=43.00000000000003 w=50.0 h=20.0 -->
59
+ <onentry>
60
+ <invoke src="command_timeout_start_prev" type="x-mint"></invoke>
61
+ </onentry>
62
+ <onexit>
63
+ <invoke src="command_timeout_stop" type="x-mint"></invoke>
64
+ </onexit>
65
+ <transition event="stop" target="wait_one"><!-- edge-path [wait_one] x=80.57492925712545 y=93.14495755427527 pointx=0.0 pointy=-12.0 offsetx=-3.0 offsety=3.0 --></transition>
66
+ <transition event="previous" target="previous_tick">
67
+ <invoke src="issued_rev" type="x-mint"></invoke>
68
+ <!-- edge-path [previous_tick] x=130.0 y=77.0 pointx=0.0 pointy=22.0 offsetx=5.0 offsety=6.0 --></transition>
69
+ </state>
70
+ <state id="wait_one"><!-- node-size-and-position x=20.0 y=113.00000000000003 w=50.0 h=20.0 -->
71
+ <transition event="next" target="next"><!-- edge-path [next] x=60.0 y=157.0 pointx=0.0 pointy=18.0 offsetx=4.0 offsety=9.0 --></transition>
72
+ <transition event="previous" target="previous"><!-- edge-path [previous] x=40.0 y=77.0 pointx=0.0 pointy=9.0 offsetx=-1.0 offsety=-13.0 --></transition>
73
+ </state>
74
+ <state id="next_tick"><!-- node-size-and-position x=20.999999999999996 y=246.82812499999991 w=50.0 h=20.0 -->
75
+ <onentry>
76
+ <invoke src="tick" type="x-mint"></invoke>
77
+ </onentry>
78
+ <transition event="tick" target="next"><!-- edge-path [next] x=33.50171423674869 y=219.81484655993978 pointx=0.0 pointy=15.0 offsetx=0.0 offsety=0.0 --></transition>
79
+ </state>
80
+ <state id="previous_tick"><!-- node-size-and-position x=110.0 y=106.99999999999999 w=70.0 h=20.0 -->
81
+ <onentry>
82
+ <invoke src="tick" type="x-mint"></invoke>
83
+ </onentry>
84
+ <transition event="tick" target="previous"><!-- edge-path [previous] x=110.0 y=87.0 pointx=0.0 pointy=8.0 offsetx=4.0 offsety=3.0 --></transition>
85
+ </state>
86
+ <state id="next"><!-- node-size-and-position x=20.0 y=176.99999999999997 w=50.0 h=20.0 -->
87
+ <onentry>
88
+ <invoke src="command_timeout_start_next" type="x-mint"></invoke>
89
+ </onentry>
90
+ <onexit>
91
+ <invoke src="command_timeout_stop" type="x-mint"></invoke>
92
+ </onexit>
93
+ <transition event="stop" target="wait_one"><!-- edge-path [wait_one] x=33.00799041278211 y=158.39968038348871 pointx=0.0 pointy=11.0 offsetx=-4.0 offsety=5.0 --></transition>
94
+ <transition event="next" target="next_tick">
95
+ <invoke src="issued_next" type="x-mint"></invoke>
96
+ <!-- edge-path [next_tick] x=53.49828576325132 y=220.1851534400602 pointx=0.0 pointy=17.0 offsetx=0.0 offsety=-8.0 --></transition>
97
+ </state>
98
+ </state>
99
+ <state id="no_hands"><!-- node-size-and-position x=20.0 y=497.0 w=60.0 h=30.0 -->
100
+ <transition event="one_hand" target="one_hand"><!-- edge-path [one_hand] x=96.0 y=545.0 -->
101
+ </transition>
102
+ <transition event="two_hands" target="two_hands"><!-- edge-path [two_hands] x=70.0 y=477.0 pointx=0.0 pointy=35.0 offsetx=-5.0 offsety=11.0 -->
103
+ </transition>
104
+ </state>
105
+ </state>
106
+ </scxml>
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ require 'statemachine'
3
+
4
+ if __FILE__ == $0
5
+ @state = Statemachine.build do
6
+ state :state1 do
7
+ event :event1, :state2, Proc.new {puts("This is action1")}
8
+ end
9
+
10
+ state :state2 do
11
+ event :event2, :state3, Proc.new {puts("This is action2")}
12
+ end
13
+
14
+ state :state3 do
15
+ event :event3, :state1, Proc.new {puts("This is action3")}
16
+ end
17
+ end
18
+
19
+ @state.event1
20
+ puts @state.state
21
+ @state.event2
22
+ puts @state.state
23
+ @state.event3
24
+ puts @state.state
25
+ end
@@ -0,0 +1,56 @@
1
+ require 'rubygems'
2
+ require 'statemachine'
3
+
4
+ class TrafficLightContext
5
+
6
+ attr_accessor :statemachine
7
+
8
+ def color_green
9
+ puts "red yellow :GREEN:"
10
+ end
11
+
12
+ def color_yellow
13
+ puts "red :YELLOW: green"
14
+ end
15
+
16
+ def color_red
17
+ puts ":RED: yellow green"
18
+ end
19
+
20
+ end
21
+
22
+
23
+ traffic_light = Statemachine.build do
24
+
25
+ superstate :operational do
26
+ startstate :green
27
+ state :green do
28
+ event :change, :yellow
29
+ on_entry :color_green
30
+ end
31
+ state :yellow do
32
+ event :change, :red
33
+ on_entry :color_yellow
34
+ end
35
+ state :red do
36
+ event :change, :green
37
+ on_entry :color_red
38
+ end
39
+ event :pedestrian, :pedestrian_mode, Proc.new {puts "Entering Pedestrian Mode"}
40
+ end
41
+
42
+ trans :pedestrian_mode, :operate, :operational_H, Proc.new {puts "Exit Pedestrian Mode"}
43
+
44
+ context TrafficLightContext.new
45
+ end
46
+
47
+ traffic_light.change
48
+ traffic_light.change
49
+ traffic_light.change
50
+ traffic_light.pedestrian
51
+ traffic_light.operate
52
+ traffic_light.change
53
+ traffic_light.change
54
+ traffic_light.pedestrian
55
+ traffic_light.operate
56
+
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'statemachine'
3
+
4
+ if __FILE__ == $0
5
+
6
+ vending_machine = Statemachine.build do
7
+ trans :waiting, :dollar, :paid
8
+ trans :paid, :selection, :waiting
9
+ trans :waiting, :selection, :waiting
10
+ trans :paid, :dollar, :paid
11
+ end
12
+
13
+ puts vending_machine.state
14
+ vending_machine.dollar
15
+ puts vending_machine.state
16
+ vending_machine.selection
17
+ puts vending_machine.state
18
+ end
@@ -0,0 +1,42 @@
1
+ require 'rubygems'
2
+ require 'statemachine'
3
+
4
+ class VendingMachineContext
5
+ def activate
6
+ puts "activating"
7
+ end
8
+
9
+ def release(product)
10
+ puts "releasing product: #{product}"
11
+ end
12
+
13
+ def refund
14
+ puts "refuding dollar"
15
+ end
16
+
17
+ def sales_mode
18
+ puts "going into sales mode"
19
+ end
20
+
21
+ def operation_mode
22
+ puts "going into operation mode"
23
+ end
24
+ end
25
+
26
+ if __FILE__ == $0
27
+ vending_machine = Statemachine.build do
28
+ state :waiting do
29
+ event :dollar, :paid, :activate # event, destination state, action
30
+ event :selection, :waiting
31
+ on_entry :sales_mode # action
32
+ on_exit :operation_mode
33
+ end
34
+ trans :paid, :selection, :waiting, :release # state, event, destination state, action
35
+ trans :paid, :dollar, :paid, :refund
36
+ context VendingMachineContext.new
37
+ end
38
+
39
+ vending_machine.dollar
40
+ vending_machine.dollar
41
+ vending_machine.selection "Peanuts"
42
+ end
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'statemachine'
3
+
4
+ class VendingMachineContext
5
+ attr_accessor :statemachine
6
+
7
+ def initialize
8
+ @amount_tendered = 0
9
+ end
10
+
11
+ def add_coin
12
+ @amount_tendered = @amount_tendered + 25
13
+ end
14
+
15
+ def count_amount_tendered
16
+ if @amount_tendered >= 100
17
+ @statemachine.paid
18
+ else
19
+ @statemachine.not_paid_yet
20
+ end
21
+ end
22
+
23
+ def prompt_money
24
+ puts "$.#{@amount_tendered}: more money please"
25
+ end
26
+
27
+ def prompt_selection
28
+ puts "please make a selection"
29
+ end
30
+ end
31
+
32
+ if __FILE__ == $0
33
+ vending_machine = Statemachine.build do
34
+ trans :accept_money, :coin, :coin_inserted, :add_coin
35
+ state :coin_inserted do
36
+ event :not_paid_yet, :accept_money, :prompt_money
37
+ event :paid, :await_selection, :prompt_selection
38
+ on_entry :count_amount_tendered
39
+ end
40
+ context VendingMachineContext.new
41
+ end
42
+ vending_machine.context.statemachine = vending_machine
43
+
44
+ vending_machine.coin
45
+ vending_machine.coin
46
+ vending_machine.coin
47
+ vending_machine.coin
48
+ end
@@ -0,0 +1,29 @@
1
+ require 'rubygems'
2
+ require 'statemachine'
3
+
4
+ if __FILE__ == $0
5
+ vending_machine = Statemachine.build do
6
+ superstate :operational do
7
+ state :waiting do
8
+ event :dollar, :paid
9
+ event :selection, :waiting
10
+ end
11
+ trans :paid, :selection, :waiting
12
+ trans :paid, :dollar, :paid
13
+
14
+ event :repair, :repair_mode, Proc.new {puts "Entering Repair Mode"}
15
+ end
16
+
17
+ trans :repair_mode, :operate, :operational_H, Proc.new {puts "Exit Repair Mode"}
18
+
19
+ on_entry_of :waiting, Proc.new {puts "Entering Waiting State"}
20
+ on_entry_of :paid, Proc.new {puts "Entering Paid State"}
21
+
22
+ end
23
+
24
+ vending_machine.repair
25
+ vending_machine.operate
26
+ vending_machine.dollar
27
+ vending_machine.repair
28
+ vending_machine.operate
29
+ end