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.
- data/Gemfile +22 -3
- data/Gemfile.lock +98 -22
- data/History.txt +262 -0
- data/LICENSE +30 -0
- data/MINT-core.gemspec +25 -80
- data/Manifest.txt +145 -30
- data/README.rdoc +6 -163
- data/Rakefile +16 -17
- data/bin/mint-aui +3 -3
- data/bin/mint-cui-gfx +3 -2
- data/bin/mint-juggernaut.sh +0 -0
- data/bin/mint-tuplespace +0 -0
- data/lib/MINT-core.rb +53 -15
- data/lib/MINT-core/agent/agent.rb +1 -1
- data/lib/MINT-core/agent/aui.rb +0 -14
- data/lib/MINT-core/agent/auicontrol.rb +91 -38
- data/lib/MINT-core/agent/cui-gfx.rb +3 -3
- data/lib/MINT-core/agent/cuicontrol.rb +94 -24
- data/lib/MINT-core/connector/redis_connector.rb +16 -0
- data/lib/MINT-core/manager/mapping_manager.rb +101 -0
- data/lib/MINT-core/manager/mapping_parser.rb +89 -0
- data/lib/MINT-core/manager/mapping_server.rb +99 -0
- data/lib/MINT-core/manager/position_updater.rb +33 -0
- data/lib/MINT-core/manager/scxml_client.rb +118 -0
- data/lib/MINT-core/manager/scxml_server.rb +86 -0
- data/lib/MINT-core/mapping/action/action.rb +32 -0
- data/lib/MINT-core/mapping/action/backend_action.rb +32 -0
- data/lib/MINT-core/mapping/action/bind_action.rb +88 -0
- data/lib/MINT-core/mapping/action/event_action.rb +40 -0
- data/lib/MINT-core/mapping/complementary_mapping.rb +31 -0
- data/lib/MINT-core/mapping/mapping.rb +170 -34
- data/lib/MINT-core/mapping/observation/negation_observation.rb +64 -0
- data/lib/MINT-core/mapping/observation/observation.rb +219 -0
- data/lib/MINT-core/mapping/sequential.rb +1 -2
- data/lib/MINT-core/mapping/sequential_mapping.rb +60 -0
- data/lib/MINT-core/model/aui/AIChoiceElement.rb +17 -0
- data/lib/MINT-core/model/aui/AICommand.rb +7 -0
- data/lib/MINT-core/model/aui/AIContainer.rb +73 -0
- data/lib/MINT-core/model/aui/AIContext.rb +12 -0
- data/lib/MINT-core/model/aui/AIIN.rb +8 -0
- data/lib/MINT-core/model/aui/AIINContinuous.rb +56 -0
- data/lib/MINT-core/model/aui/AIINDiscrete.rb +8 -0
- data/lib/MINT-core/model/aui/AIMultiChoice.rb +1 -2
- data/lib/MINT-core/model/aui/AIMultiChoiceElement.rb +4 -51
- data/lib/MINT-core/model/aui/AIO.rb +76 -123
- data/lib/MINT-core/model/aui/AIOUT.rb +8 -0
- data/lib/MINT-core/model/aui/AIOUTContinuous.rb +61 -0
- data/lib/MINT-core/model/aui/AIReference.rb +16 -0
- data/lib/MINT-core/model/aui/AISingleChoice.rb +18 -1
- data/lib/MINT-core/model/aui/AISingleChoiceElement.rb +10 -56
- data/lib/MINT-core/model/aui/AISinglePresence.rb +39 -71
- data/lib/MINT-core/model/aui/aicommand.scxml +47 -0
- data/lib/MINT-core/model/aui/aicontainer.scxml +41 -0
- data/lib/MINT-core/model/aui/aicontext.scxml +34 -0
- data/lib/MINT-core/model/aui/aiincontinuous.scxml +59 -0
- data/lib/MINT-core/model/aui/aiinrange.scxml +86 -0
- data/lib/MINT-core/model/aui/aimultichoice.scxml +67 -0
- data/lib/MINT-core/model/aui/aimultichoiceelement.scxml +51 -0
- data/lib/MINT-core/model/aui/aio.scxml +18 -27
- data/lib/MINT-core/model/aui/aioutcontinuous.scxml +66 -0
- data/lib/MINT-core/model/aui/aireference.scxml +28 -0
- data/lib/MINT-core/model/aui/aisinglechoice.scxml +60 -0
- data/lib/MINT-core/model/aui/aisinglechoiceelement.scxml +45 -60
- data/lib/MINT-core/model/aui/aisinglepresence.scxml +15 -24
- data/lib/MINT-core/model/aui/model.rb +15 -38
- data/lib/MINT-core/model/cui/gfx/CIC.rb +34 -10
- data/lib/MINT-core/model/cui/gfx/CIO.rb +66 -115
- data/lib/MINT-core/model/cui/gfx/CarouFredSel.scxml +58 -0
- data/lib/MINT-core/model/cui/gfx/MarkableRadioButton.rb +8 -0
- data/lib/MINT-core/model/cui/gfx/RadioButton.rb +8 -0
- data/lib/MINT-core/model/cui/gfx/RadioButtonGroup.rb +6 -0
- data/lib/MINT-core/model/cui/gfx/button.rb +16 -0
- data/lib/MINT-core/model/cui/gfx/button.scxml +58 -0
- data/lib/MINT-core/model/cui/gfx/caroufredsel.rb +48 -0
- data/lib/MINT-core/model/cui/gfx/cic.scxml +57 -0
- data/lib/MINT-core/model/cui/gfx/cio.scxml +54 -0
- data/lib/MINT-core/model/cui/gfx/markableradiobutton.scxml +67 -0
- data/lib/MINT-core/model/cui/gfx/model.rb +39 -176
- data/lib/MINT-core/model/cui/gfx/radiobutton.scxml +59 -0
- data/lib/MINT-core/model/interactor.rb +167 -46
- data/lib/MINT-core/model/interactor.scxml +3 -0
- data/lib/MINT-core/model/interactor_helpers.rb +25 -0
- data/lib/MINT-core/model/ir/body/OneHandPoseNavigation.rb +15 -0
- data/lib/MINT-core/model/ir/body/body.rb +5 -0
- data/lib/MINT-core/model/ir/body/fingertip.rb +114 -0
- data/lib/MINT-core/model/ir/body/fingertip.scxml +43 -0
- data/lib/MINT-core/model/{body → ir/body}/gesture_button.rb +0 -0
- data/lib/MINT-core/model/ir/body/hand.rb +5 -0
- data/lib/MINT-core/model/ir/body/head.rb +102 -0
- data/lib/MINT-core/model/ir/body/head.scxml +92 -0
- data/lib/MINT-core/model/ir/body/onehandposenavigation.scxml +53 -0
- data/lib/MINT-core/model/ir/body/pose.rb +99 -0
- data/lib/MINT-core/model/ir/browserscreen.rb +27 -0
- data/lib/MINT-core/model/ir/browserscreen.scxml +14 -0
- data/lib/MINT-core/model/{device → ir}/button.rb +1 -1
- data/lib/MINT-core/model/ir/ir.rb +5 -0
- data/lib/MINT-core/model/ir/irmedia.rb +5 -0
- data/lib/MINT-core/model/ir/irmode.rb +5 -0
- data/lib/MINT-core/model/{device → ir}/joypad.rb +1 -1
- data/lib/MINT-core/model/ir/mouse.rb +44 -0
- data/lib/MINT-core/model/ir/mouse.scxml +35 -0
- data/lib/MINT-core/model/{device/mouse.rb → ir/mouse_old.rb} +2 -2
- data/lib/MINT-core/model/{device → ir}/pointer.rb +20 -22
- data/lib/MINT-core/model/ir/pointer.scxml +19 -0
- data/lib/MINT-core/model/ir/screen.rb +5 -0
- data/lib/MINT-core/model/{device → ir}/wheel.rb +1 -1
- data/lib/MINT-core/model/mim/aicommand_activate_to_button_press.xml +13 -0
- data/lib/MINT-core/model/mim/aicommand_deactivate_to_button_release.xml +13 -0
- data/lib/MINT-core/model/mim/aio_defocus_to_cio_unhighlight.xml +13 -0
- data/lib/MINT-core/model/mim/aio_focus_to_cio_highlight.xml +14 -0
- data/lib/MINT-core/model/mim/aio_present_to_cio_display.xml +14 -0
- data/lib/MINT-core/model/mim/aio_suspend_to_cio_hide.xml +13 -0
- data/lib/MINT-core/model/mim/aisinglechoice_present_to_child_present.xml +14 -0
- data/lib/MINT-core/model/mim/aisinglechoiceelement_chosen_to_radiobutton_select.xml +13 -0
- data/lib/MINT-core/model/mim/aisinglechoiceelement_unchosen_to_radiobutton_unselect.xml +13 -0
- data/lib/MINT-core/model/mim/aisinglepresence_children_finished_to_caroufredsel_init_js.xml +14 -0
- data/lib/MINT-core/model/mim/aisinglepresence_present_to_child_present.xml +15 -0
- data/lib/MINT-core/model/mim/browserscreen_reload_to_cuicontrol_refresh_all.xml +12 -0
- data/lib/MINT-core/model/mim/button_press_to_aicommand_activate.xml +12 -0
- data/lib/MINT-core/model/mim/button_release_to_aicommand_deactivate.xml +12 -0
- data/lib/MINT-core/model/mim/caroufredsel_refreshing_to_caroufredsel_init_js.xml +14 -0
- data/lib/MINT-core/model/mim/cio_display_to_aio_defocus.xml +13 -0
- data/lib/MINT-core/model/mim/cio_display_to_aio_present.xml +12 -0
- data/lib/MINT-core/model/mim/cio_display_to_cio_display_cache_add.xml +11 -0
- data/lib/MINT-core/model/mim/cio_hide_to_aio_suspend.xml +12 -0
- data/lib/MINT-core/model/mim/cio_hide_to_cio_display_cache_remove.xml +12 -0
- data/lib/MINT-core/model/mim/cio_highlight_to_aio_focus.xml +13 -0
- data/lib/MINT-core/model/mim/head_looking_left_to_aisinglepresence_prev.xml +14 -0
- data/lib/MINT-core/model/mim/head_looking_right_to_aisinglepresence_next.xml +15 -0
- data/lib/MINT-core/model/mim/head_nodding_to_aisinglepresence_next.xml +15 -0
- data/lib/MINT-core/model/mim/head_tilting_left_to_aisinglepresence_prev.xml +14 -0
- data/lib/MINT-core/model/mim/head_tilting_right_to_aisinglepresence_next.xml +15 -0
- data/lib/MINT-core/model/mim/left_button_aisinglepresence_enter.xml +15 -0
- data/lib/MINT-core/model/mim/left_button_aisinglepresence_next.xml +15 -0
- data/lib/MINT-core/model/mim/mim_default.xml +52 -0
- data/lib/MINT-core/model/mim/mint-mappings.xsd +127 -0
- data/lib/MINT-core/model/mim/mouse_press_to_aicommand_activate.xml +17 -0
- data/lib/MINT-core/model/mim/mouse_press_to_aisinglechoiceelement_choose.xml +17 -0
- data/lib/MINT-core/model/mim/mouse_press_to_aisinglechoiceelement_unchoose.xml +17 -0
- data/lib/MINT-core/model/mim/mouse_release_to_aicommand_deactivate.xml +16 -0
- data/lib/MINT-core/model/mim/mouse_stop_to_cio_highlight.xml +13 -0
- data/lib/MINT-core/model/mim/onehandposnav_confirm_to_aichoiceelement_choose.xml +14 -0
- data/lib/MINT-core/model/mim/onehandposnav_next_to_aio_next.xml +14 -0
- data/lib/MINT-core/model/mim/onehandposnav_previous_to_aio_prev.xml +14 -0
- data/lib/MINT-core/model/mim/radiobutton_selected_to_aisinglechoiceelement_choose.xml +13 -0
- data/lib/MINT-core/model/mim/radiobutton_unselected_to_aisinglechoiceelement_unchoose.xml +13 -0
- data/lib/MINT-core/model/mim/right_button_aisinglepresence_prev.xml +15 -0
- data/lib/MINT-core/model/task.rb +6 -6
- data/script/console +0 -0
- data/script/destroy +0 -0
- data/script/generate +0 -0
- data/spec/AICommand_spec.rb +20 -0
- data/spec/AIContainer_spec.rb +161 -0
- data/spec/AIINContinuous_spec.rb +92 -0
- data/spec/AIOUTContinuous_spec.rb +93 -0
- data/spec/AIO_spec.rb +73 -0
- data/spec/AIReference_spec.rb +105 -0
- data/spec/AISinglePresence_spec.rb +204 -60
- data/spec/Button_spec.rb +114 -0
- data/spec/CIO_spec.rb +145 -0
- data/spec/Interactor_spec.rb +95 -0
- data/spec/MappingManager_spec.rb +126 -0
- data/spec/Spontaneous_spec.rb +53 -0
- data/spec/aio_agent_spec.rb +215 -186
- data/spec/aisinglechoice_spec.rb +147 -88
- data/spec/aisinglechoiceelement_spec.rb +154 -70
- data/spec/complementary_mapping_spec.rb +158 -0
- data/spec/core_spec.rb +27 -15
- data/spec/cui_helper.rb +100 -0
- data/spec/examples/browserscreen_reload_to_cuicontrol_refresh_all.xml +12 -0
- data/spec/examples/mim_streaming_example.xml +9 -0
- data/spec/examples/mouse_highlight.xml +22 -0
- data/spec/examples/performance_mapping.xml +15 -0
- data/spec/examples/reset_click.xml +24 -0
- data/spec/interactor_test.scxml +32 -0
- data/spec/interactor_test_2.scxml +16 -0
- data/spec/mapping_performance_spec.rb +118 -0
- data/spec/mapping_server_spec.rb +161 -0
- data/spec/mapping_spec.rb +307 -0
- data/spec/music_spec.rb +301 -135
- data/spec/performance_counter.scxml +9 -0
- data/spec/sequential_mappings_spec.rb +69 -0
- data/spec/shared/aio_shared.rb +144 -0
- data/spec/spec_helper.rb +22 -3
- data/spec/spontaneous.scxml +11 -0
- data/spec/support/connection_helper.rb +19 -0
- data/spec/support/redis_connector_monkey_patch.rb +1 -0
- data/spec/support/statemachine_helper.rb +84 -0
- data/spec/sync_mappings_spec.rb +96 -0
- metadata +219 -354
- data/lib/MINT-core/mapping/complementary.rb +0 -100
- data/lib/MINT-core/mapping/on_state_change.rb +0 -65
- data/lib/MINT-core/model/aui/AIC.rb +0 -86
- data/lib/MINT-core/model/aui/AIChoice.rb +0 -65
- data/lib/MINT-core/model/aui/AIINChoose.rb +0 -54
- data/lib/MINT-core/model/aui/AIOUTDiscrete.rb +0 -43
- data/lib/MINT-core/model/aui/aic.png +0 -0
- data/lib/MINT-core/model/aui/aic.scxml +0 -50
- data/lib/MINT-core/model/aui/aichoice.png +0 -0
- data/lib/MINT-core/model/aui/aichoice.scxml +0 -60
- data/lib/MINT-core/model/aui/aio.png +0 -0
- data/lib/MINT-core/model/aui/aisinglechoiceelement.png +0 -0
- data/lib/MINT-core/model/aui/aisinglepresence.png +0 -0
- data/lib/MINT-core/model/body/handgesture.rb +0 -279
- data/lib/MINT-core/model/body/head.png +0 -0
- data/lib/MINT-core/model/body/head.rb +0 -51
- data/lib/MINT-core/model/body/head.scxml +0 -28
- data/lib/MINT-core/model/cui/gfx/screen.rb +0 -18
- data/lib/MINT-core/overrides/rinda.rb +0 -34
- data/spec/AIC_spec.rb +0 -69
- data/spec/MINT-core_spec.rb +0 -11
- data/spec/aio_spec.rb +0 -144
- data/spec/cio_spec.rb +0 -369
- data/tasks/rspec.rake +0 -21
|
@@ -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
|
+
|