MINT-core 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. data/Gemfile +22 -3
  2. data/Gemfile.lock +98 -22
  3. data/History.txt +262 -0
  4. data/LICENSE +30 -0
  5. data/MINT-core.gemspec +25 -80
  6. data/Manifest.txt +145 -30
  7. data/README.rdoc +6 -163
  8. data/Rakefile +16 -17
  9. data/bin/mint-aui +3 -3
  10. data/bin/mint-cui-gfx +3 -2
  11. data/bin/mint-juggernaut.sh +0 -0
  12. data/bin/mint-tuplespace +0 -0
  13. data/lib/MINT-core.rb +53 -15
  14. data/lib/MINT-core/agent/agent.rb +1 -1
  15. data/lib/MINT-core/agent/aui.rb +0 -14
  16. data/lib/MINT-core/agent/auicontrol.rb +91 -38
  17. data/lib/MINT-core/agent/cui-gfx.rb +3 -3
  18. data/lib/MINT-core/agent/cuicontrol.rb +94 -24
  19. data/lib/MINT-core/connector/redis_connector.rb +16 -0
  20. data/lib/MINT-core/manager/mapping_manager.rb +101 -0
  21. data/lib/MINT-core/manager/mapping_parser.rb +89 -0
  22. data/lib/MINT-core/manager/mapping_server.rb +99 -0
  23. data/lib/MINT-core/manager/position_updater.rb +33 -0
  24. data/lib/MINT-core/manager/scxml_client.rb +118 -0
  25. data/lib/MINT-core/manager/scxml_server.rb +86 -0
  26. data/lib/MINT-core/mapping/action/action.rb +32 -0
  27. data/lib/MINT-core/mapping/action/backend_action.rb +32 -0
  28. data/lib/MINT-core/mapping/action/bind_action.rb +88 -0
  29. data/lib/MINT-core/mapping/action/event_action.rb +40 -0
  30. data/lib/MINT-core/mapping/complementary_mapping.rb +31 -0
  31. data/lib/MINT-core/mapping/mapping.rb +170 -34
  32. data/lib/MINT-core/mapping/observation/negation_observation.rb +64 -0
  33. data/lib/MINT-core/mapping/observation/observation.rb +219 -0
  34. data/lib/MINT-core/mapping/sequential.rb +1 -2
  35. data/lib/MINT-core/mapping/sequential_mapping.rb +60 -0
  36. data/lib/MINT-core/model/aui/AIChoiceElement.rb +17 -0
  37. data/lib/MINT-core/model/aui/AICommand.rb +7 -0
  38. data/lib/MINT-core/model/aui/AIContainer.rb +73 -0
  39. data/lib/MINT-core/model/aui/AIContext.rb +12 -0
  40. data/lib/MINT-core/model/aui/AIIN.rb +8 -0
  41. data/lib/MINT-core/model/aui/AIINContinuous.rb +56 -0
  42. data/lib/MINT-core/model/aui/AIINDiscrete.rb +8 -0
  43. data/lib/MINT-core/model/aui/AIMultiChoice.rb +1 -2
  44. data/lib/MINT-core/model/aui/AIMultiChoiceElement.rb +4 -51
  45. data/lib/MINT-core/model/aui/AIO.rb +76 -123
  46. data/lib/MINT-core/model/aui/AIOUT.rb +8 -0
  47. data/lib/MINT-core/model/aui/AIOUTContinuous.rb +61 -0
  48. data/lib/MINT-core/model/aui/AIReference.rb +16 -0
  49. data/lib/MINT-core/model/aui/AISingleChoice.rb +18 -1
  50. data/lib/MINT-core/model/aui/AISingleChoiceElement.rb +10 -56
  51. data/lib/MINT-core/model/aui/AISinglePresence.rb +39 -71
  52. data/lib/MINT-core/model/aui/aicommand.scxml +47 -0
  53. data/lib/MINT-core/model/aui/aicontainer.scxml +41 -0
  54. data/lib/MINT-core/model/aui/aicontext.scxml +34 -0
  55. data/lib/MINT-core/model/aui/aiincontinuous.scxml +59 -0
  56. data/lib/MINT-core/model/aui/aiinrange.scxml +86 -0
  57. data/lib/MINT-core/model/aui/aimultichoice.scxml +67 -0
  58. data/lib/MINT-core/model/aui/aimultichoiceelement.scxml +51 -0
  59. data/lib/MINT-core/model/aui/aio.scxml +18 -27
  60. data/lib/MINT-core/model/aui/aioutcontinuous.scxml +66 -0
  61. data/lib/MINT-core/model/aui/aireference.scxml +28 -0
  62. data/lib/MINT-core/model/aui/aisinglechoice.scxml +60 -0
  63. data/lib/MINT-core/model/aui/aisinglechoiceelement.scxml +45 -60
  64. data/lib/MINT-core/model/aui/aisinglepresence.scxml +15 -24
  65. data/lib/MINT-core/model/aui/model.rb +15 -38
  66. data/lib/MINT-core/model/cui/gfx/CIC.rb +34 -10
  67. data/lib/MINT-core/model/cui/gfx/CIO.rb +66 -115
  68. data/lib/MINT-core/model/cui/gfx/CarouFredSel.scxml +58 -0
  69. data/lib/MINT-core/model/cui/gfx/MarkableRadioButton.rb +8 -0
  70. data/lib/MINT-core/model/cui/gfx/RadioButton.rb +8 -0
  71. data/lib/MINT-core/model/cui/gfx/RadioButtonGroup.rb +6 -0
  72. data/lib/MINT-core/model/cui/gfx/button.rb +16 -0
  73. data/lib/MINT-core/model/cui/gfx/button.scxml +58 -0
  74. data/lib/MINT-core/model/cui/gfx/caroufredsel.rb +48 -0
  75. data/lib/MINT-core/model/cui/gfx/cic.scxml +57 -0
  76. data/lib/MINT-core/model/cui/gfx/cio.scxml +54 -0
  77. data/lib/MINT-core/model/cui/gfx/markableradiobutton.scxml +67 -0
  78. data/lib/MINT-core/model/cui/gfx/model.rb +39 -176
  79. data/lib/MINT-core/model/cui/gfx/radiobutton.scxml +59 -0
  80. data/lib/MINT-core/model/interactor.rb +167 -46
  81. data/lib/MINT-core/model/interactor.scxml +3 -0
  82. data/lib/MINT-core/model/interactor_helpers.rb +25 -0
  83. data/lib/MINT-core/model/ir/body/OneHandPoseNavigation.rb +15 -0
  84. data/lib/MINT-core/model/ir/body/body.rb +5 -0
  85. data/lib/MINT-core/model/ir/body/fingertip.rb +114 -0
  86. data/lib/MINT-core/model/ir/body/fingertip.scxml +43 -0
  87. data/lib/MINT-core/model/{body → ir/body}/gesture_button.rb +0 -0
  88. data/lib/MINT-core/model/ir/body/hand.rb +5 -0
  89. data/lib/MINT-core/model/ir/body/head.rb +102 -0
  90. data/lib/MINT-core/model/ir/body/head.scxml +92 -0
  91. data/lib/MINT-core/model/ir/body/onehandposenavigation.scxml +53 -0
  92. data/lib/MINT-core/model/ir/body/pose.rb +99 -0
  93. data/lib/MINT-core/model/ir/browserscreen.rb +27 -0
  94. data/lib/MINT-core/model/ir/browserscreen.scxml +14 -0
  95. data/lib/MINT-core/model/{device → ir}/button.rb +1 -1
  96. data/lib/MINT-core/model/ir/ir.rb +5 -0
  97. data/lib/MINT-core/model/ir/irmedia.rb +5 -0
  98. data/lib/MINT-core/model/ir/irmode.rb +5 -0
  99. data/lib/MINT-core/model/{device → ir}/joypad.rb +1 -1
  100. data/lib/MINT-core/model/ir/mouse.rb +44 -0
  101. data/lib/MINT-core/model/ir/mouse.scxml +35 -0
  102. data/lib/MINT-core/model/{device/mouse.rb → ir/mouse_old.rb} +2 -2
  103. data/lib/MINT-core/model/{device → ir}/pointer.rb +20 -22
  104. data/lib/MINT-core/model/ir/pointer.scxml +19 -0
  105. data/lib/MINT-core/model/ir/screen.rb +5 -0
  106. data/lib/MINT-core/model/{device → ir}/wheel.rb +1 -1
  107. data/lib/MINT-core/model/mim/aicommand_activate_to_button_press.xml +13 -0
  108. data/lib/MINT-core/model/mim/aicommand_deactivate_to_button_release.xml +13 -0
  109. data/lib/MINT-core/model/mim/aio_defocus_to_cio_unhighlight.xml +13 -0
  110. data/lib/MINT-core/model/mim/aio_focus_to_cio_highlight.xml +14 -0
  111. data/lib/MINT-core/model/mim/aio_present_to_cio_display.xml +14 -0
  112. data/lib/MINT-core/model/mim/aio_suspend_to_cio_hide.xml +13 -0
  113. data/lib/MINT-core/model/mim/aisinglechoice_present_to_child_present.xml +14 -0
  114. data/lib/MINT-core/model/mim/aisinglechoiceelement_chosen_to_radiobutton_select.xml +13 -0
  115. data/lib/MINT-core/model/mim/aisinglechoiceelement_unchosen_to_radiobutton_unselect.xml +13 -0
  116. data/lib/MINT-core/model/mim/aisinglepresence_children_finished_to_caroufredsel_init_js.xml +14 -0
  117. data/lib/MINT-core/model/mim/aisinglepresence_present_to_child_present.xml +15 -0
  118. data/lib/MINT-core/model/mim/browserscreen_reload_to_cuicontrol_refresh_all.xml +12 -0
  119. data/lib/MINT-core/model/mim/button_press_to_aicommand_activate.xml +12 -0
  120. data/lib/MINT-core/model/mim/button_release_to_aicommand_deactivate.xml +12 -0
  121. data/lib/MINT-core/model/mim/caroufredsel_refreshing_to_caroufredsel_init_js.xml +14 -0
  122. data/lib/MINT-core/model/mim/cio_display_to_aio_defocus.xml +13 -0
  123. data/lib/MINT-core/model/mim/cio_display_to_aio_present.xml +12 -0
  124. data/lib/MINT-core/model/mim/cio_display_to_cio_display_cache_add.xml +11 -0
  125. data/lib/MINT-core/model/mim/cio_hide_to_aio_suspend.xml +12 -0
  126. data/lib/MINT-core/model/mim/cio_hide_to_cio_display_cache_remove.xml +12 -0
  127. data/lib/MINT-core/model/mim/cio_highlight_to_aio_focus.xml +13 -0
  128. data/lib/MINT-core/model/mim/head_looking_left_to_aisinglepresence_prev.xml +14 -0
  129. data/lib/MINT-core/model/mim/head_looking_right_to_aisinglepresence_next.xml +15 -0
  130. data/lib/MINT-core/model/mim/head_nodding_to_aisinglepresence_next.xml +15 -0
  131. data/lib/MINT-core/model/mim/head_tilting_left_to_aisinglepresence_prev.xml +14 -0
  132. data/lib/MINT-core/model/mim/head_tilting_right_to_aisinglepresence_next.xml +15 -0
  133. data/lib/MINT-core/model/mim/left_button_aisinglepresence_enter.xml +15 -0
  134. data/lib/MINT-core/model/mim/left_button_aisinglepresence_next.xml +15 -0
  135. data/lib/MINT-core/model/mim/mim_default.xml +52 -0
  136. data/lib/MINT-core/model/mim/mint-mappings.xsd +127 -0
  137. data/lib/MINT-core/model/mim/mouse_press_to_aicommand_activate.xml +17 -0
  138. data/lib/MINT-core/model/mim/mouse_press_to_aisinglechoiceelement_choose.xml +17 -0
  139. data/lib/MINT-core/model/mim/mouse_press_to_aisinglechoiceelement_unchoose.xml +17 -0
  140. data/lib/MINT-core/model/mim/mouse_release_to_aicommand_deactivate.xml +16 -0
  141. data/lib/MINT-core/model/mim/mouse_stop_to_cio_highlight.xml +13 -0
  142. data/lib/MINT-core/model/mim/onehandposnav_confirm_to_aichoiceelement_choose.xml +14 -0
  143. data/lib/MINT-core/model/mim/onehandposnav_next_to_aio_next.xml +14 -0
  144. data/lib/MINT-core/model/mim/onehandposnav_previous_to_aio_prev.xml +14 -0
  145. data/lib/MINT-core/model/mim/radiobutton_selected_to_aisinglechoiceelement_choose.xml +13 -0
  146. data/lib/MINT-core/model/mim/radiobutton_unselected_to_aisinglechoiceelement_unchoose.xml +13 -0
  147. data/lib/MINT-core/model/mim/right_button_aisinglepresence_prev.xml +15 -0
  148. data/lib/MINT-core/model/task.rb +6 -6
  149. data/script/console +0 -0
  150. data/script/destroy +0 -0
  151. data/script/generate +0 -0
  152. data/spec/AICommand_spec.rb +20 -0
  153. data/spec/AIContainer_spec.rb +161 -0
  154. data/spec/AIINContinuous_spec.rb +92 -0
  155. data/spec/AIOUTContinuous_spec.rb +93 -0
  156. data/spec/AIO_spec.rb +73 -0
  157. data/spec/AIReference_spec.rb +105 -0
  158. data/spec/AISinglePresence_spec.rb +204 -60
  159. data/spec/Button_spec.rb +114 -0
  160. data/spec/CIO_spec.rb +145 -0
  161. data/spec/Interactor_spec.rb +95 -0
  162. data/spec/MappingManager_spec.rb +126 -0
  163. data/spec/Spontaneous_spec.rb +53 -0
  164. data/spec/aio_agent_spec.rb +215 -186
  165. data/spec/aisinglechoice_spec.rb +147 -88
  166. data/spec/aisinglechoiceelement_spec.rb +154 -70
  167. data/spec/complementary_mapping_spec.rb +158 -0
  168. data/spec/core_spec.rb +27 -15
  169. data/spec/cui_helper.rb +100 -0
  170. data/spec/examples/browserscreen_reload_to_cuicontrol_refresh_all.xml +12 -0
  171. data/spec/examples/mim_streaming_example.xml +9 -0
  172. data/spec/examples/mouse_highlight.xml +22 -0
  173. data/spec/examples/performance_mapping.xml +15 -0
  174. data/spec/examples/reset_click.xml +24 -0
  175. data/spec/interactor_test.scxml +32 -0
  176. data/spec/interactor_test_2.scxml +16 -0
  177. data/spec/mapping_performance_spec.rb +118 -0
  178. data/spec/mapping_server_spec.rb +161 -0
  179. data/spec/mapping_spec.rb +307 -0
  180. data/spec/music_spec.rb +301 -135
  181. data/spec/performance_counter.scxml +9 -0
  182. data/spec/sequential_mappings_spec.rb +69 -0
  183. data/spec/shared/aio_shared.rb +144 -0
  184. data/spec/spec_helper.rb +22 -3
  185. data/spec/spontaneous.scxml +11 -0
  186. data/spec/support/connection_helper.rb +19 -0
  187. data/spec/support/redis_connector_monkey_patch.rb +1 -0
  188. data/spec/support/statemachine_helper.rb +84 -0
  189. data/spec/sync_mappings_spec.rb +96 -0
  190. metadata +219 -354
  191. data/lib/MINT-core/mapping/complementary.rb +0 -100
  192. data/lib/MINT-core/mapping/on_state_change.rb +0 -65
  193. data/lib/MINT-core/model/aui/AIC.rb +0 -86
  194. data/lib/MINT-core/model/aui/AIChoice.rb +0 -65
  195. data/lib/MINT-core/model/aui/AIINChoose.rb +0 -54
  196. data/lib/MINT-core/model/aui/AIOUTDiscrete.rb +0 -43
  197. data/lib/MINT-core/model/aui/aic.png +0 -0
  198. data/lib/MINT-core/model/aui/aic.scxml +0 -50
  199. data/lib/MINT-core/model/aui/aichoice.png +0 -0
  200. data/lib/MINT-core/model/aui/aichoice.scxml +0 -60
  201. data/lib/MINT-core/model/aui/aio.png +0 -0
  202. data/lib/MINT-core/model/aui/aisinglechoiceelement.png +0 -0
  203. data/lib/MINT-core/model/aui/aisinglepresence.png +0 -0
  204. data/lib/MINT-core/model/body/handgesture.rb +0 -279
  205. data/lib/MINT-core/model/body/head.png +0 -0
  206. data/lib/MINT-core/model/body/head.rb +0 -51
  207. data/lib/MINT-core/model/body/head.scxml +0 -28
  208. data/lib/MINT-core/model/cui/gfx/screen.rb +0 -18
  209. data/lib/MINT-core/overrides/rinda.rb +0 -34
  210. data/spec/AIC_spec.rb +0 -69
  211. data/spec/MINT-core_spec.rb +0 -11
  212. data/spec/aio_spec.rb +0 -144
  213. data/spec/cio_spec.rb +0 -369
  214. data/tasks/rspec.rake +0 -21
@@ -0,0 +1,16 @@
1
+ class RedisConnector
2
+
3
+ def self.redis
4
+
5
+ @@redis ||= EventMachine::Hiredis.connect
6
+ end
7
+
8
+ def self.sync_redis
9
+ @@sync_redis ||= Redis.new
10
+ end
11
+
12
+ def self.reset
13
+ @@redis =nil
14
+ end
15
+
16
+ end
@@ -0,0 +1,101 @@
1
+ require 'rubygems'
2
+ require "bundler/setup"
3
+ require 'rexml/document'
4
+ require 'rexml/streamlistener'
5
+
6
+ class MappingManager
7
+ include REXML
8
+ include StreamListener
9
+
10
+ def initialize()
11
+ @mappings = {}
12
+ @callbacks = {}
13
+ @file_path = nil
14
+
15
+ #callback that will be called if all mappings with attribute == run have been activated == subscribed
16
+ @started_cb = nil
17
+
18
+ # contains mappings that have been loaded ans started but whose observations have not finished subscribing
19
+ @waiting_mappings = []
20
+
21
+ #will be true if all mappings have been parsed
22
+ @finished_parsing = false
23
+ end
24
+
25
+ def finished_parsing
26
+ @finished_parsing = true
27
+ wait_for_all_mappings_activated(nil)
28
+ end
29
+
30
+ # This function parses scxml from a file
31
+ def build_from_scxml(filename)
32
+ source = File.new filename
33
+ Document.parse_stream(source, self)
34
+ finished_parsing()
35
+ @mappings
36
+ end
37
+
38
+ # This function parses scxml directly from the string parameter "stringbuffer"
39
+ def build_from_scxml_string(stringbuffer)
40
+ Document.parse_stream(stringbuffer, self)
41
+ finished_parsing()
42
+ @mappings
43
+ end
44
+
45
+ def load(xml_file)
46
+ @file_path = File.expand_path(File.dirname(xml_file))
47
+ @mappings = build_from_scxml(xml_file)
48
+ self
49
+ end
50
+
51
+ def get_mappings
52
+ @mappings.keys
53
+ end
54
+
55
+ def register_callback(mapping_name, callback)
56
+ #If mapping already exists add callback
57
+ #Otherwise save it for later
58
+ if @mappings.has_key? (mapping_name)
59
+ @mappings[mapping_name].state_callback = callback
60
+ else
61
+ @callbacks[mapping_name] = callback
62
+ end
63
+ end
64
+
65
+ # This function defines the actions to be taken for each different tag when the tag is opened
66
+ def tag_start(name, attributes)
67
+ case name
68
+ when 'mim'
69
+ #Do I have to store its name?
70
+ when 'include'
71
+ parser = MINT::MappingParser.new
72
+ mapping = parser.build_from_scxml(@file_path +"/"+ attributes['href'])
73
+ @mappings[mapping.mapping_name] = mapping
74
+
75
+ #If a callback has already been register, add it.
76
+ if @callbacks.has_key? mapping.mapping_name
77
+ mapping.state_callback = @callbacks[mapping.mapping_name]
78
+ end
79
+
80
+ #TODO check if callback here or in class initialize
81
+ if @mappings[mapping.mapping_name].state_callback
82
+ p "Mapping #{mapping.mapping_name} loaded"
83
+ @mappings[mapping.mapping_name].state_callback.call(mapping.mapping_name, {:id => mapping.id, :mapping_state => :loaded})
84
+ end
85
+ if attributes['start'] == "true"
86
+ @waiting_mappings << mapping.mapping_name
87
+ mapping.start.activated_callback {wait_for_all_mappings_activated(mapping)}
88
+
89
+ end
90
+ end
91
+ end
92
+
93
+ def wait_for_all_mappings_activated(mapping)
94
+ @waiting_mappings.delete mapping.mapping_name if mapping
95
+ @started_cb.call if @started_cb and @finished_parsing and @waiting_mappings.length == 0
96
+ end
97
+
98
+ def started(&block)
99
+ @started_cb = block
100
+ end
101
+ end
@@ -0,0 +1,89 @@
1
+ require 'rubygems'
2
+ require "bundler/setup"
3
+ require 'rexml/document'
4
+ require 'rexml/streamlistener'
5
+ module MINT
6
+ class MappingParser
7
+ include REXML
8
+ include StreamListener
9
+
10
+ def initialize()
11
+ @mapping_name #actual name of the mapping
12
+ @mapping_type #type of the mapping: complementary, sequential, ...
13
+ @observations = Array.new #will store the observations
14
+ @actions = Array.new #will store the actions
15
+ @mapping #actual mapping
16
+ end
17
+
18
+ # This function parses scxml from a file
19
+ def build_from_scxml(filename)
20
+ source = File.new filename
21
+ Document.parse_stream(source, self)
22
+ @mapping
23
+ end
24
+
25
+ # This function parses scxml directly from the string parameter "stringbuffer"
26
+ def build_from_scxml_string(stringbuffer)
27
+ Document.parse_stream(stringbuffer, self)
28
+ @mapping
29
+ end
30
+
31
+ # This function defines the actions to be taken for each different tag when the tag is opened
32
+ def tag_start(name, attributes)
33
+ case name
34
+ when 'mapping'
35
+ @mapping_name = attributes['name']
36
+ when 'operator'
37
+ @mapping_type = attributes['type']
38
+ @mapping_id = attributes['id']
39
+ when 'observation'
40
+ observation_states = Array.new
41
+ observation_hash = Hash.new
42
+ observation_hash[:element] = attributes['interactor']
43
+ observation_hash[:name] = attributes['name']
44
+ observation_hash[:id] = attributes['id']
45
+ attributes['states'].split("|").each do |s| observation_states << s.to_sym end if attributes['states']
46
+ observation_hash[:states] = observation_states
47
+ observation_hash[:process] = attributes['process'].to_s.to_sym if attributes['process']
48
+ observation_hash[:result] = attributes['result'] if attributes['result']
49
+
50
+ if attributes['type'] and attributes['type'].eql? "negation"
51
+ @observations << NegationObservation.new(observation_hash)
52
+ else
53
+ @observations << Observation.new(observation_hash)
54
+ end
55
+ when 'backend'
56
+ backend_call = MINT::const_get(attributes['class']).method(attributes['call'].to_sym) # TODO figure out a way that this can work
57
+ @actions << BackendAction.new(:call => backend_call,:parameter => attributes['parameter'], :id => attributes['id'])
58
+ when 'bind'
59
+ backend_call = MINT::const_get(attributes['class']).method(attributes['transformation'].to_sym) if attributes['transformation']
60
+ @actions << BindAction.new(:id => attributes['id'], :elementIn => attributes['interactor_in'], :nameIn => attributes['name_in'], :attrIn => attributes['attr_in'],
61
+ :elementOut => attributes['interactor_out'], :nameOut => attributes['name_out'], :attrOut => attributes['attr_out'],:transform => backend_call)
62
+ when 'event'
63
+ @actions << EventAction.new(:id => attributes['id'], :event => attributes['type'].to_sym, :target => attributes['target'])
64
+ else
65
+ end
66
+ end
67
+
68
+ # This function defines the actions to be taken for each different tag when the tag is closed
69
+ def tag_end(name)
70
+ case name
71
+ when 'operator'
72
+ case @mapping_type
73
+ when 'complementary'
74
+ @mapping = ComplementaryMapping.new(:id => @mapping_id, :name => @mapping_name, :observations => @observations, :actions => @actions)
75
+ when 'sequential'
76
+ @mapping = SequentialMapping.new(:id => @mapping_id, :name => @mapping_name, :observations => @observations, :actions => @actions)
77
+ else
78
+ end
79
+ else
80
+ end
81
+ end
82
+
83
+ def text(text)
84
+ end
85
+
86
+ def xmldecl(version, encoding, standalone)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,99 @@
1
+
2
+ require 'rubygems'
3
+ require "bundler/setup"
4
+ require "MINT-core"
5
+ require "MINT-scxml"
6
+
7
+ class MappingServer
8
+ attr_accessor :connections
9
+ attr_accessor :manager
10
+
11
+ class StatefulProtocol < EventMachine::Connection
12
+ include EM::Protocols::LineText2
13
+ attr_accessor :manager
14
+
15
+ def initialize
16
+ @mapping_store = {}
17
+
18
+ # saves if a registered mapping is detail
19
+ @registered_as_detail = {}
20
+ super()
21
+ end
22
+
23
+ def forward_callback(mapping,data)
24
+ p "in forward #{mapping} #{data}"
25
+
26
+ if (data[:result])
27
+ d = data[:result]
28
+ if not d.nil? and not d.empty? and not @mapping_store[mapping]
29
+ #a= d.first
30
+ #b = a[1]['name']
31
+ if d.first[1].is_a? Hash
32
+ @mapping_store[mapping] = {:name => d.first[1]['name']}
33
+
34
+ else
35
+
36
+ @mapping_store[mapping] = {:name => d.first[1].map{|x| x['name']}}
37
+ end
38
+ end
39
+ end
40
+ json_data = (@mapping_store[mapping]!=nil)?MultiJson.encode(data.merge(@mapping_store[mapping])) : MultiJson.encode(data)
41
+ if data[:mapping_state] and data[:mapping_state] == :succeeded
42
+ send_data("INFO%"+mapping+"%"+json_data+"\r\n")
43
+ p "sent: INFO%"+mapping+"%"+json_data
44
+ @mapping_store[mapping]=nil
45
+ elsif @registered_as_detail[mapping]
46
+ send_data("DETAIL%"+mapping+"%"+json_data+"\r\n")
47
+ p "sent: DETAIL%"+mapping+"%"+json_data
48
+ @mapping_store[mapping]=nil
49
+ end
50
+
51
+ end
52
+
53
+ def receive_line(data)
54
+ begin
55
+ p "server received:#{data}"
56
+ d = data.split('%')
57
+
58
+ case d[0]
59
+ when "REGISTER"
60
+ @manager.register_callback(d[1], method(:forward_callback))
61
+ @registered_as_detail[d[1]] = d[2].eql?('DETAIL')?true:false
62
+ send_data("REGISTERED%#{d[1]}%#{d[2]}\r\n")
63
+ when "LIST"
64
+ mappings = @manager.get_mappings
65
+ mappings.each {|m| send_data("MAPPING%#{m}\r\n")}
66
+ else
67
+ p "ERROR\r\nReceived Unknown data:#{data}\r\n "
68
+ end
69
+ end
70
+ rescue Statemachine::TransitionMissingException => bang
71
+ puts "ERROR\n#{bang}"
72
+ end
73
+ end
74
+
75
+ def initialize(hsh = {:host=>"0.0.0.0",:port=>8000})
76
+ @host = hsh[:host]
77
+ @port = hsh[:port]
78
+ @connections =[]
79
+ end
80
+
81
+ def start(manager = nil)
82
+
83
+ if (manager)
84
+ @manager = manager
85
+ else
86
+ @manager = MappingManager.new
87
+ end
88
+ EventMachine::start_server @host, @port, StatefulProtocol do |conn|
89
+ @connections << conn
90
+ conn.send_data("READY\r\n")
91
+ conn.manager=@manager
92
+ puts "connection..."
93
+ end
94
+ puts "Started server on #{@host}:#{@port}"
95
+ end
96
+
97
+ end
98
+
99
+
@@ -0,0 +1,33 @@
1
+
2
+ require 'rubygems'
3
+ require "bundler/setup"
4
+ require "eventmachine"
5
+ require "MINT-scxml"
6
+
7
+ require 'redis'
8
+ require 'hiredis'
9
+
10
+ class PositionUpdater
11
+
12
+ def initialize
13
+ end
14
+
15
+ def start()
16
+ redis = EventMachine::Hiredis.connect
17
+
18
+ redis.pubsub.psubscribe("in_channel:Interactor.CIO.coordinates.*") { |key, message|
19
+ found=MultiJson.decode message
20
+ cio = CIO.get "cui-gfx",found['name']
21
+ #cio.x =found['x']
22
+ #cio.y = found['y']
23
+ cio.width=found['width']
24
+ cio.height = found['height']
25
+ cio.save
26
+ CUIControl.update_cache(cio)
27
+ puts found.inspect
28
+ }.callback { p "subscribed to receive position updates"}
29
+
30
+ end
31
+
32
+ end
33
+
@@ -0,0 +1,118 @@
1
+
2
+ require 'rubygems'
3
+ require "bundler/setup"
4
+ require "eventmachine"
5
+ require "MINT-scxml"
6
+
7
+ require 'redis'
8
+ require 'hiredis'
9
+
10
+ class SCXMLClient
11
+ attr_accessor :connections
12
+
13
+ def self.state_store
14
+ @@state_store ||= {}
15
+ end
16
+
17
+
18
+ class StatefulProtocol < EventMachine::Connection
19
+ include EM::Protocols::LineText2
20
+
21
+ @@host = nil
22
+ @@port = nil
23
+
24
+ def initialize
25
+
26
+
27
+ super()
28
+ end
29
+
30
+ def unbind
31
+ puts "#{@@host}: #{@@port}"
32
+ puts "-- disconnected from remote server!"
33
+ puts "-- attempting reconnection"
34
+ #reconnect @@ip, @@port # use reconnect, already provided by E
35
+ EventMachine.add_timer 15, proc { reconnect(@@host,@@port) }
36
+ end
37
+
38
+ def self.config(host,port)
39
+ @@host = host
40
+ @@port = port
41
+ end
42
+
43
+ def subscribe_redis(interactor,name)
44
+ @interactor = interactor
45
+ @name = name
46
+
47
+ redis = EventMachine::Hiredis.connect
48
+
49
+ redis.pubsub.psubscribe(@interactor) { |key, message|
50
+
51
+ found=MultiJson.decode message
52
+ if @name.nil? or @name.eql? found["name"]
53
+ if found.has_key? "new_states"
54
+ # send new state
55
+ found["new_states"].each { |state|
56
+ p "activated: #{state}"
57
+ send_active_state state }
58
+ end
59
+
60
+ current_active_states = found["states"] + found["abstract_states"].split("|")
61
+ if(SCXMLClient.state_store.has_key? key)
62
+ activated_states = SCXMLClient.state_store[key]
63
+
64
+
65
+
66
+ deactivated_states = activated_states - current_active_states
67
+
68
+ # send deactivate states
69
+
70
+ deactivated_states.each {|state|
71
+ p "deactivated: #{state}"
72
+ send_inactive_state state
73
+ }
74
+
75
+ #save activated states
76
+
77
+ end
78
+ SCXMLClient.state_store[key] = current_active_states
79
+ end
80
+ }.callback { p "subscribed to #{@interactor} name #{@name}"}
81
+
82
+ end
83
+
84
+ def send_active_state(name)
85
+ send_data "1 #{name}\r\n"
86
+ end
87
+
88
+ def send_inactive_state(name)
89
+ send_data "0 #{name}\r\n"
90
+ end
91
+ end
92
+
93
+ def initialize(_interactor,_name)
94
+ @interactor = _interactor
95
+ @name = _name
96
+
97
+ end
98
+
99
+ def start(host="0.0.0.0",port=3003)
100
+
101
+ StatefulProtocol.config(host,port)
102
+
103
+ #socket = EM.connect(host, port, StatefulProtocol) do |conn|
104
+ EventMachine::start_server host, port, StatefulProtocol do |conn|
105
+ # conn.config(host,port)
106
+ conn.subscribe_redis(@interactor,@name)
107
+ #@connections << conn
108
+
109
+ puts "SCXML Tool connection..."
110
+
111
+ # inform about all currently activated states
112
+ # @state_store[@interactor]
113
+ end
114
+ puts "Started server on #{host}:#{port}"
115
+ end
116
+
117
+ end
118
+