testability-driver-qt-sut-plugin 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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>