testability-driver-qt-sut-plugin 1.2.1 → 1.3.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 (30) hide show
  1. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/application.rb +16 -6
  2. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/behaviour.rb +86 -12
  3. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/configure_behaviour.rb +1 -1
  4. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/events.rb +5 -3
  5. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/file_transfer.rb +15 -0
  6. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/fixture.rb +110 -76
  7. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/gesture.rb +125 -69
  8. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/sut.rb +28 -19
  9. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/synchronization.rb +143 -24
  10. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/behaviours/widget.rb +25 -10
  11. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/agent.rb +54 -0
  12. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/application.rb +1 -0
  13. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/configure_command.rb +32 -39
  14. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/find_object.rb +8 -19
  15. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/fixture.rb +35 -22
  16. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/group.rb +31 -29
  17. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/infologger_command.rb +23 -32
  18. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/key_sequence.rb +44 -61
  19. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/screen_capture.rb +22 -23
  20. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/tap.rb +39 -28
  21. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/version.rb +14 -24
  22. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/controllers/widget.rb +39 -42
  23. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/adapter.rb +93 -120
  24. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/sut/communication.rb +95 -75
  25. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/find_object_generator.rb +6 -8
  26. data/lib/testability-driver-plugins/testability-driver-qt-sut-plugin/util/message_composer.rb +1 -1
  27. data/xml/behaviour/qt.xml +6 -0
  28. data/xml/keymap/win.xml +174 -0
  29. data/xml/template/qt.xml +128 -117
  30. metadata +60 -75
@@ -21,97 +21,99 @@ module MobyController
21
21
 
22
22
  module QT
23
23
 
24
- module Comms
24
+ module Comms
25
25
 
26
- # Command types
27
- ERROR_MSG = 0
28
- VALID_MSG = 1
29
- OK_MESSAGE = "OK"
26
+ # Command types
27
+ ERROR_MSG = 0
28
+ VALID_MSG = 1
29
+ OK_MESSAGE = "OK"
30
30
 
31
- class Inflator
31
+ class Inflator
32
32
 
33
- def self.inflate( response )
34
- # strip 4 extra bytes written by qt compression, return empty string if no raw data found, otherwise inflate it
35
- ( raw_data = response[ 4 .. -1 ] ).empty? ? "" : Zlib::Inflate.inflate( raw_data )
36
- end
33
+ def self.inflate( response )
37
34
 
38
- # enable hooking for performance measurement & debug logging
39
- TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
35
+ # strip 4 extra bytes written by qt compression, return empty string if no raw data found, otherwise inflate it
36
+ ( raw_data = response[ 4 .. -1 ] ).empty? ? "" : Zlib::Inflate.inflate( raw_data )
40
37
 
41
- end # Inflator
38
+ end
39
+
40
+ # enable hooking for performance measurement & debug logging
41
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
42
+
43
+ end # Inflator
42
44
 
43
45
  # deprecated: see send_service_request#adapter.rb
44
- # Wrapper for protocol message.
45
- class QTResponse
46
+ # Wrapper for protocol message.
47
+ class QTResponse
46
48
 
47
- attr_accessor :msg_body, :flag, :crc, :message_id
49
+ attr_accessor :msg_body, :flag, :crc, :message_id
48
50
 
49
51
  # deprecated: see send_service_request#adapter.rb
50
- # Initialize QT Response.
51
- # == params
52
- # command_flag Indicator flad for message type (error or ok)
53
- # message_code 0 or an error code
54
- # msg_body Body of the message. For command a simple "OK" message for ui state the xml document as string
55
- # == returns
56
- def initialize( command_flag, msg_body, crc, message_id )
52
+ # Initialize QT Response.
53
+ # == params
54
+ # command_flag Indicator flad for message type (error or ok)
55
+ # message_code 0 or an error code
56
+ # msg_body Body of the message. For command a simple "OK" message for ui state the xml document as string
57
+ # == returns
58
+ def initialize( command_flag, msg_body, crc, message_id )
57
59
 
58
- @flag, @msg_body, @crc, @message_id = command_flag, msg_body, crc, message_id
60
+ @flag, @msg_body, @crc, @message_id = command_flag, msg_body, crc, message_id
59
61
 
60
- end
62
+ end
61
63
 
62
64
  # deprecated: see send_service_request#adapter.rb
63
- def validate_message( msg_id )
65
+ def validate_message( msg_id )
64
66
 
65
- #check that response matches the request
66
- if @message_id != msg_id
67
+ #check that response matches the request
68
+ if @message_id != msg_id
67
69
 
68
70
  msg = "Response to request did not match: #{ @message_id.to_s.inspect }!=#{ msg_id.to_s.inspect }"
69
-
71
+
70
72
  $logger.fatal msg
71
73
 
72
74
  $logger.fatal @msg_body
73
-
74
- raise RuntimeError, msg
75
-
76
- end
77
75
 
78
- #raise error if error flag
79
- if @flag == Comms::ERROR_MSG
76
+ raise RuntimeError, msg
77
+
78
+ end
80
79
 
81
- raise MobyBase::ApplicationNotAvailableError, @msg_body if @msg_body =~ /The application with Id \d+ is no longer available/
80
+ #raise error if error flag
81
+ if @flag == Comms::ERROR_MSG
82
82
 
83
- raise RuntimeError, @msg_body
83
+ raise MobyBase::ApplicationNotAvailableError, @msg_body if @msg_body =~ /The application with Id \d+ is no longer available/
84
+
85
+ raise RuntimeError, @msg_body
84
86
 
85
87
  end
86
88
 
87
- end
89
+ end
88
90
 
89
- # enable hooking for performance measurement & debug logging
90
- TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
91
+ # enable hooking for performance measurement & debug logging
92
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
91
93
 
92
- end # QTResponse
94
+ end # QTResponse
93
95
 
94
- # Message generator for qt tas messages
95
- class MessageGenerator
96
+ # Message generator for qt tas messages
97
+ class MessageGenerator
96
98
 
97
- def self.generate( message_data, message_flag = VALID_MSG )
99
+ def self.generate( message_data, message_flag = VALID_MSG )
98
100
 
99
- MobyController::QT::Comms::QtMessage.new( message_flag, message_data )
101
+ MobyController::QT::Comms::QtMessage.new( message_flag, message_data )
100
102
 
101
- end
103
+ end
102
104
 
103
- # enable hooking for performance measurement & debug logging
104
- TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
105
+ # enable hooking for performance measurement & debug logging
106
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
105
107
 
106
- end # MobyController
108
+ end # MobyController
107
109
 
108
- class QtMessage
110
+ class QtMessage
109
111
 
110
- attr_reader :flag, :data, :crc, :compression, :size
112
+ attr_reader :flag, :data, :compression, :size
111
113
 
112
- attr_accessor :message_id
114
+ attr_accessor :message_id
113
115
 
114
- def initialize( message_flag, message_data )
116
+ def initialize( message_flag, message_data )
115
117
 
116
118
  # message flag
117
119
  @flag = message_flag
@@ -123,42 +125,60 @@ module MobyController
123
125
 
124
126
  @size = @data.size
125
127
 
126
- # compress message body if size is greater than 1000 bytes
127
- deflate if @size > 1000
128
+ # calculate crc only when requested
129
+ @crc = nil
130
+
131
+ end
128
132
 
129
- # calculate outgoing message crc; sent in message header to receiver for data validation
130
- @crc = TDriver::Checksum.crc16_ibm( @data )
133
+ def crc
131
134
 
132
- end
135
+ if @crc.nil?
133
136
 
134
- def make_binary_message( message_id )
137
+ # calculate outgoing message crc; sent in message header to receiver for data validation
138
+ @crc = TDriver::Checksum.crc16_ibm( @data )
135
139
 
136
- [ @flag, @size, @crc, @compression, message_id, @data ].pack( 'CISCIa*' )
140
+ else
137
141
 
138
- end
142
+ @crc
139
143
 
140
- def deflate
144
+ end
145
+
146
+ end
141
147
 
142
- @compression = 2
148
+ def make_binary_message( message_id )
143
149
 
144
- #@data = [ (@data.size & 0xff000000) >> 24, (@data.size & 0x00ff0000) >> 16, (@data.size & 0x0000ff00) >> 8, (@data.size & 0x000000ff), Zlib::Deflate.deflate( @data, 9 ) ].pack('C4a*')
145
150
 
146
- data_size = @data.size
151
+ [ @flag, @size, crc, @compression, message_id, @data ].pack( 'CISCIa*' )
147
152
 
148
- # qUncompress required the data length at the beginning so append it - the bytes need to be arranged in the below method (see QByteArray::qUncompress)
149
- @data = [ (data_size & 0xff000000) >> 24, (data_size & 0x00ff0000) >> 16, (data_size & 0x0000ff00) >> 8, (data_size & 0x000000ff), Zlib::Deflate.deflate( @data, 9 ) ].pack('C4a*')
153
+ end
150
154
 
151
- # update data size
152
- @size = @data.size
153
-
154
- end
155
+ def deflate( level = 9 )
156
+
157
+ unless @compression == 2
158
+
159
+ @compression = 2
160
+
161
+ data_size = @data.size
162
+
163
+ # qUncompress required the data length at the beginning so append it - the bytes need to be arranged in the below method (see QByteArray::qUncompress)
164
+ @data = [ ( data_size & 0xff000000 ) >> 24, ( data_size & 0x00ff0000 ) >> 16, ( data_size & 0x0000ff00 ) >> 8, ( data_size & 0x000000ff ), Zlib::Deflate.deflate( @data, level ) ].pack('C4a*')
165
+
166
+ # update data size
167
+ @size = @data.size
168
+
169
+ # recalculate crc
170
+ @crc = nil
171
+
172
+ end
173
+
174
+ end
155
175
 
156
- # enable hooking for performance measurement & debug logging
157
- TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
176
+ # enable hooking for performance measurement & debug logging
177
+ TDriver::Hooking.hook_methods( self ) if defined?( TDriver::Hooking )
158
178
 
159
- end # QtMessage
179
+ end # QtMessage
160
180
 
161
- end # Comms
181
+ end # Comms
162
182
 
163
183
  end # QT
164
184
 
@@ -40,7 +40,7 @@ module MobyUtil
40
40
 
41
41
  when 'dynamic'
42
42
 
43
- value = MobyUtil::DynamicAttributeFilter.instance.filter_string
43
+ value = TDriver::AttributeFilter.filter_string
44
44
 
45
45
  filters[ 'attributeWhiteList' ] = value unless value.blank?
46
46
 
@@ -62,11 +62,9 @@ module MobyUtil
62
62
  xml = "<TasCommands service=\"findObject\" #{ @_app_details.to_attributes }"
63
63
 
64
64
  # pass checksum value if known from previous service request result
65
- unless @_checksum.nil?
66
-
67
- xml << " checksum=\"#{ @_checksum.to_s }\" "
68
-
69
- end
65
+ #unless @_checksum.nil?
66
+ # xml << " checksum=\"#{ @_checksum.to_s }\" "
67
+ #end
70
68
 
71
69
  unless @_params.empty?
72
70
 
@@ -131,7 +129,7 @@ module MobyUtil
131
129
 
132
130
  when 'dynamic'
133
131
 
134
- filters[ 'attributeWhiteList' ] = value if ( value = MobyUtil::DynamicAttributeFilter.instance.filter_string )
132
+ filters[ 'attributeWhiteList' ] = value if ( value = TDriver::AttributeFilter.filter_string )
135
133
 
136
134
  when 'static'
137
135
 
@@ -261,7 +259,7 @@ module MobyUtil
261
259
 
262
260
  when 'dynamic'
263
261
 
264
- white_list = MobyUtil::DynamicAttributeFilter.instance.filter_string
262
+ white_list = TDriver::AttributeFilter.filter_string
265
263
 
266
264
  params['attributeWhiteList'] = white_list if white_list
267
265
 
@@ -275,7 +275,7 @@ module MobyUtil
275
275
 
276
276
  when 'dynamic'
277
277
 
278
- white_list = MobyUtil::DynamicAttributeFilter.instance.filter_string
278
+ white_list = TDriver::AttributeFilter.filter_string
279
279
  params['attributeWhiteList'] = white_list if white_list
280
280
 
281
281
  when 'static'
data/xml/behaviour/qt.xml CHANGED
@@ -289,6 +289,12 @@
289
289
  <description>Synchronizes execution to a signal. The script will wait until the given signal is emitted.</description>
290
290
  <example>wait_for_signal(10, "clicked()")</example>
291
291
  </method>
292
+
293
+ <method name="ensure_event">
294
+ <description>Make sure event is fired.</description>
295
+ <example>ensure_event()</example>
296
+ </method>
297
+
292
298
  </methods>
293
299
 
294
300
  </behaviour>
@@ -0,0 +1,174 @@
1
+ <!-- http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx -->
2
+ <keymap>
3
+ <parameter name="kLeftButton" value="0x01"/>
4
+ <parameter name="kRightButton" value="0x2"/>
5
+ <parameter name="kCancel" value="0x03"/>
6
+ <parameter name="kMiddleButton" value="0x04"/>
7
+ <parameter name="kXButton1" value="0x5"/>
8
+ <parameter name="kXButton2" value="0x06"/>
9
+ <parameter name="kBackSpace" value="0x08"/>
10
+ <parameter name="kTab" value="0x09"/>
11
+ <parameter name="kClear" value="0x0C"/>
12
+ <parameter name="kReturn" value="0x0D"/>
13
+ <parameter name="kShift" value="0x10"/>
14
+ <parameter name="kControl" value="0x11"/>
15
+ <parameter name="kAlt" value="0x12"/>
16
+ <parameter name="kPause" value="0x13"/>
17
+ <parameter name="kCapsLock" value="0x14"/>
18
+ <parameter name="kKana" value="0x15"/>
19
+ <parameter name="kHangul" value="0x15"/>
20
+ <parameter name="kJunja" value="0x17"/>
21
+ <parameter name="kFinal" value="0x18"/>
22
+ <parameter name="kHanja" value="0x19"/>
23
+ <parameter name="kKanji" value="0x19"/>
24
+ <parameter name="kEscape" value="0x1B"/>
25
+ <parameter name="kConvert" value="0x1C"/>
26
+ <parameter name="kNonConvert" value="0x1D"/>
27
+ <parameter name="kAccept" value="0x1E"/>
28
+ <parameter name="kModechange" value="0x1F"/>
29
+ <parameter name="kSpace" value="0x20"/>
30
+ <parameter name="kPageUp" value="0x21"/>
31
+ <parameter name="kPageDown" value="0x22"/>
32
+ <parameter name="kEnd" value="0x23"/>
33
+ <parameter name="kHome" value="0x24"/>
34
+ <parameter name="kLeft" value="0x25"/>
35
+ <parameter name="kUp" value="0x26"/>
36
+ <parameter name="kRight" value="0x27"/>
37
+ <parameter name="kDown" value="0x28"/>
38
+ <parameter name="kSelect" value="0x29"/>
39
+ <parameter name="kPrint" value="0x2A"/>
40
+ <parameter name="kExecute" value="0x2B"/>
41
+ <parameter name="kPrintScreen" value="0x2C"/>
42
+ <parameter name="kInsert" value="0x2D"/>
43
+ <parameter name="kDelete" value="0x2E"/>
44
+ <parameter name="kHelp" value="0x2F"/>
45
+ <parameter name="k0" value="0x30"/>
46
+ <parameter name="k1" value="0x31"/>
47
+ <parameter name="k2" value="0x32"/>
48
+ <parameter name="k3" value="0x33"/>
49
+ <parameter name="k4" value="0x34"/>
50
+ <parameter name="k5" value="0x35"/>
51
+ <parameter name="k6" value="0x36"/>
52
+ <parameter name="k7" value="0x37"/>
53
+ <parameter name="k8" value="0x38"/>
54
+ <parameter name="k9" value="0x39"/>
55
+ <parameter name="kA" value="0x41"/>
56
+ <parameter name="kB" value="0x42"/>
57
+ <parameter name="kC" value="0x43"/>
58
+ <parameter name="kD" value="0x44"/>
59
+ <parameter name="kE" value="0x45"/>
60
+ <parameter name="kF" value="0x46"/>
61
+ <parameter name="kG" value="0x47"/>
62
+ <parameter name="kH" value="0x48"/>
63
+ <parameter name="kJ" value="0x49"/>
64
+ <parameter name="kI" value="0x4A"/>
65
+ <parameter name="kK" value="0x4B"/>
66
+ <parameter name="kL" value="0x4C"/>
67
+ <parameter name="kM" value="0x4D"/>
68
+ <parameter name="kN" value="0x4E"/>
69
+ <parameter name="kO" value="0x4F"/>
70
+ <parameter name="kP" value="0x50"/>
71
+ <parameter name="kQ" value="0x51"/>
72
+ <parameter name="kR" value="0x52"/>
73
+ <parameter name="kS" value="0x53"/>
74
+ <parameter name="kT" value="0x54"/>
75
+ <parameter name="kU" value="0x55"/>
76
+ <parameter name="kV" value="0x56"/>
77
+ <parameter name="kW" value="0x57"/>
78
+ <parameter name="kX" value="0x58"/>
79
+ <parameter name="kY" value="0x59"/>
80
+ <parameter name="kZ" value="0x5A"/>
81
+ <parameter name="kLWin" value="0x5B"/>
82
+ <parameter name="kRWin" value="0x5C"/>
83
+ <parameter name="kkApps" value="0x5D"/>
84
+ <parameter name="kSleep" value="0x5F"/>
85
+ <parameter name="kNumpad0" value="0x60"/>
86
+ <parameter name="kNumpad1" value="0x61"/>
87
+ <parameter name="kNumpad2" value="0x62"/>
88
+ <parameter name="kNumpad3" value="0x63"/>
89
+ <parameter name="kNumpad4" value="0x64"/>
90
+ <parameter name="kNumpad5" value="0x65"/>
91
+ <parameter name="kNumpad6" value="0x66"/>
92
+ <parameter name="kNumpad7" value="0x67"/>
93
+ <parameter name="kNumpad8" value="0x68"/>
94
+ <parameter name="kNumpad9" value="0x69"/>
95
+ <parameter name="kMultiply" value="0x6A"/>
96
+ <parameter name="kAdd" value="0x6B"/>
97
+ <parameter name="kSeparator" value="0x6C"/>
98
+ <parameter name="kSubtract" value="0x6D"/>
99
+ <parameter name="kDecimal" value="0x6E"/>
100
+ <parameter name="kDivide" value="0x6F"/>
101
+ <parameter name="kF1" value="0x70"/>
102
+ <parameter name="kF2" value="0x71"/>
103
+ <parameter name="kF3" value="0x72"/>
104
+ <parameter name="kF4" value="0x73"/>
105
+ <parameter name="kF5" value="0x74"/>
106
+ <parameter name="kF6" value="0x75"/>
107
+ <parameter name="kF7" value="0x76"/>
108
+ <parameter name="kF8" value="0x77"/>
109
+ <parameter name="kF9" value="0x78"/>
110
+ <parameter name="kF10" value="0x79"/>
111
+ <parameter name="kF11" value="0x7A"/>
112
+ <parameter name="kF12" value="0x7B"/>
113
+ <parameter name="kF13" value="0x7C"/>
114
+ <parameter name="kF14" value="0x7D"/>
115
+ <parameter name="kF15" value="0x7E"/>
116
+ <parameter name="kF16" value="0x7F"/>
117
+ <parameter name="kF17" value="0x80H"/>
118
+ <parameter name="kF18" value="0x81H"/>
119
+ <parameter name="kF19" value="0x82H"/>
120
+ <parameter name="kF20" value="0x83H"/>
121
+ <parameter name="kF21" value="0x84H"/>
122
+ <parameter name="kF22" value="0x85H"/>
123
+ <parameter name="kF23" value="0x86H"/>
124
+ <parameter name="kF24" value="0x87H"/>
125
+ <parameter name="kNumlocl" value="0x90"/>
126
+ <parameter name="kScroll" value="0x91"/>
127
+ <parameter name="kLShift" value="0xA0"/>
128
+ <parameter name="kShift" value="0xA1"/>
129
+ <parameter name="kLControl" value="0xA2"/>
130
+ <parameter name="kRControl" value="0xA3"/>
131
+ <parameter name="kLMenu" value="0xA4"/>
132
+ <parameter name="kRMenu" value="0xA5"/>
133
+ <parameter name="kBrowserBack" value="0xA6"/>
134
+ <parameter name="kBrowserForward" value="0xA7"/>
135
+ <parameter name="kBrowserRefresh" value="0xA8"/>
136
+ <parameter name="kBrowserStop" value="0xA9"/>
137
+ <parameter name="kBrowserSearch" value="0xAA"/>
138
+ <parameter name="kBrowserFavorites" value="0xAB"/>
139
+ <parameter name="kBrowserHome" value="0xAC"/>
140
+ <parameter name="kVolumeMute" value="0xAD"/>
141
+ <parameter name="kVolumeDown" value="0xAE"/>
142
+ <parameter name="kVolumeUp" value="0xAF"/>
143
+ <parameter name="kNextTrack" value="0xB0"/>
144
+ <parameter name="kPrevTrack" value="0xB1"/>
145
+ <parameter name="kStop" value="0xB2"/>
146
+ <parameter name="kPause" value="0xB3"/>
147
+ <parameter name="kLaunchMail" value="0xB4"/>
148
+ <parameter name="kMediaSelect" value="0xB5"/>
149
+ <parameter name="kLaunchApp1" value="0xB6"/>
150
+ <parameter name="kLaunchApp2" value="0xB7"/>
151
+ <parameter name="kOem1" value="0xBA"/>
152
+ <parameter name="kOemPlus" value="0xBB"/>
153
+ <parameter name="kOemMinus" value="0xBD"/>
154
+ <parameter name="kOemPeriod" value="0xBE"/>
155
+ <parameter name="kOem2" value="0xBF"/>
156
+ <parameter name="kOem3" value="0xC0"/>
157
+ <parameter name="kOem4" value="0xDB"/>
158
+ <parameter name="kOem5" value="0xDC"/>
159
+ <parameter name="kOem6" value="0xDD"/>
160
+ <parameter name="kOem7" value="0xDE"/>
161
+ <parameter name="kOem8" value="0xDF"/>
162
+ <parameter name="kOem102" value="0xE2"/>
163
+ <parameter name="kProcess" value="0xE5"/>
164
+ <parameter name="kPacket" value="0xE7"/>
165
+ <parameter name="kAttn" value="0xF6"/>
166
+ <parameter name="kCrSel" value="0xF7"/>
167
+ <parameter name="kExSel" value="0xF8"/>
168
+ <parameter name="kEraseEof" value="0xF9"/>
169
+ <parameter name="kPlay" value="0xFa"/>
170
+ <parameter name="kZoom" value="0xFB"/>
171
+ <parameter name="kNoName" value="0xFC"/>
172
+ <parameter name="kPa1" value="0xFD"/>
173
+ <parameter name="kClear" value="0xFE"/>
174
+ </keymap>