da_funk 3.18.1 → 3.22.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce9673172b8ee5806e0b9e798fc82ecb6c485f4d17ce42b9da09dd8819078376
4
- data.tar.gz: 8fe7ccbeaa715ac1e3753755c442a346e9f10dc99c43db72eb781691f88a595c
3
+ metadata.gz: 9d9da9734840cb62d685e992ecfdc1e4ec6e94f89edc88776ecf21657163ff75
4
+ data.tar.gz: 34988efe41726c098afcf776d45c6c060b2f1aa2f0a1f4df222207950e6b2e87
5
5
  SHA512:
6
- metadata.gz: 22e35877246d833aa5c459061a78cc31528342a3e3c508790d1b5143d722b84dc5f516a600a449196ad931a8e561d0376cd852b0a75a010f286e6d3e77b5fc8c
7
- data.tar.gz: 51f09c79c484aba8fd8d788763195a11c892f025b5857106c60707186e15f1277f6e302f05eca10a971fddd774dc8c25d731877747d9c809d27923a1bc5880df
6
+ metadata.gz: f29efdace790ad94ed7a15be5874b3ac5aba147c6d52656b158f6aadb12dd8ffcc7bbc249d3b55fa67dc32f43059c22d591d1aaa4039c538e1d2dcdfa4ba45af
7
+ data.tar.gz: f47226c97b9d6e86a0d00cf70f77ce40fd095c823ce90b0d5d3f981d2581374b78bbc3aad4dd6b227df84f8ae42c2eb0793cea360bb4c0585f38d70489f0130e
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- da_funk (3.18.1)
4
+ da_funk (3.22.0)
5
5
  archive-zip (~> 0.5)
6
6
  bundler
7
7
  cloudwalk_handshake
@@ -14,36 +14,41 @@ GEM
14
14
  specs:
15
15
  archive-zip (0.12.0)
16
16
  io-like (~> 0.3.0)
17
- ast (2.4.0)
17
+ ast (2.4.1)
18
18
  cloudwalk (1.15.0)
19
19
  bundler
20
20
  rake
21
- cloudwalk_handshake (1.13.0)
21
+ cloudwalk_handshake (1.14.0)
22
22
  funky-simplehttp (~> 0.6)
23
- funky-emv (1.2.2)
23
+ funky-emv (1.4.0)
24
24
  funky-tlv (~> 0.2)
25
25
  funky-mock (0.1.0)
26
26
  funky-simplehttp (0.6.0)
27
27
  funky-tlv (0.2.3)
28
28
  io-like (0.3.1)
29
- jaro_winkler (1.5.4)
30
- parallel (1.19.1)
31
- parser (2.7.0.2)
29
+ parallel (1.19.2)
30
+ parser (2.7.1.3)
32
31
  ast (~> 2.4.0)
33
32
  posxml_parser (2.26.0)
34
33
  funky-emv (~> 1)
35
34
  rainbow (3.0.0)
36
35
  rake (13.0.1)
37
- rubocop (0.79.0)
38
- jaro_winkler (~> 1.5.1)
36
+ regexp_parser (1.7.1)
37
+ rexml (3.2.4)
38
+ rubocop (0.85.1)
39
39
  parallel (~> 1.10)
40
40
  parser (>= 2.7.0.1)
41
41
  rainbow (>= 2.2.2, < 4.0)
42
+ regexp_parser (>= 1.7)
43
+ rexml
44
+ rubocop-ast (>= 0.0.3)
42
45
  ruby-progressbar (~> 1.7)
43
- unicode-display_width (>= 1.4.0, < 1.7)
46
+ unicode-display_width (>= 1.4.0, < 2.0)
47
+ rubocop-ast (0.0.3)
48
+ parser (>= 2.7.0.1)
44
49
  ruby-progressbar (1.10.1)
45
- unicode-display_width (1.6.1)
46
- yard (0.9.24)
50
+ unicode-display_width (1.7.0)
51
+ yard (0.9.25)
47
52
 
48
53
  PLATFORMS
49
54
  ruby
@@ -59,4 +64,4 @@ DEPENDENCIES
59
64
  yard
60
65
 
61
66
  BUNDLED WITH
62
- 2.0.2
67
+ 2.1.4
@@ -1,5 +1,42 @@
1
1
  # DaFunk
2
2
 
3
+ ### 3.22.0 - 2020-06-18
4
+
5
+ - Update libs:
6
+ - cloudwalk_handshake (1.14.0)
7
+ - funky-emv (1.4.0)
8
+
9
+ ### 3.21.2 - 2020-06-16
10
+
11
+ - Fixed timeout return on DaFunK::Helper#menu, it should return Device::IO::KEY_TIMEOUT not options[:timeout];
12
+ - Set cloudwalk endpoint as default.
13
+
14
+ ### 3.21.1 - 2020-06-16
15
+
16
+ - Fix error when timeout on DaFunk::menu_image_touchscreen_or_keyboard.
17
+
18
+ ### 3.21.0 - 2020-06-12
19
+
20
+ - Removed unnecessary processing method call;
21
+ - Status bar refactored:
22
+ - Removed link icon;
23
+ - Added support to SLOT_MEDIA to print WIFI or GPRS;
24
+ - Renamed SLOT_CONNECTION to SLOT_SIGNAL_LEVEL;
25
+ - Added support to SLOT_BATTERY_PERCENTUAL to print percentual of battery level;
26
+ - Renamed SLOT_BATTERY to SLOT_BATTERY_LEVEL;
27
+ - Update battery and wifi images;
28
+ - Added BATTERY_PERCENTAGE_IMAGES;
29
+ - Show searching icon when network is not connected;
30
+ - Added support to virtual keyboard;
31
+ - Added support to touchscreen event on DaFunk::Helper#menu;
32
+ - Added support to return timeout parameter on DaFunk::Helper#menu when timeout is achieved;
33
+ - Update funky-emv 1.3.0.
34
+
35
+ ### 3.20.0 - 2020-05-28
36
+
37
+ - Rename PaymentChannel::client to ::current;
38
+ - Fix status bar change link to cache old value.
39
+
3
40
  ### 3.18.1 - 2020-05-20
4
41
 
5
42
  - Fix issue on DaFunk::Helper#menu_image_touchscreen_or_keyboard it was not checking for special keys
data/Rakefile CHANGED
@@ -68,7 +68,8 @@ FILES = FileList[
68
68
  "lib/device/setting.rb",
69
69
  "lib/device/support.rb",
70
70
  "lib/device/system.rb",
71
- "lib/device/magnetic.rb"
71
+ "lib/device/magnetic.rb",
72
+ "lib/device/virtual_keyboard.rb"
72
73
  ]
73
74
 
74
75
  DaFunk::RakeTask.new do |t|
@@ -15,7 +15,7 @@ module DaFunk
15
15
  end
16
16
 
17
17
  def attach_options(enable_txt_ui = true)
18
- if DaFunk::PaymentChannel.client == Context::CommunicationChannel
18
+ if DaFunk::PaymentChannel.current == Context::CommunicationChannel
19
19
  {:print_last => true, :enable_txt_ui => enable_txt_ui}
20
20
  else
21
21
  {:print_last => false, :enable_txt_ui => enable_txt_ui}
@@ -179,7 +179,7 @@ module DaFunk
179
179
  # menu_image_touchscreen_or_keyboard('image.bmp', menu_itens, options)
180
180
  #
181
181
  # @return menu_item_index selected will be returned
182
- # @return if timeout nil will be returned
182
+ # @return if timeout Device::IO::KEY_TIMEOUT will be returned
183
183
  def menu_image_touchscreen_or_keyboard(path, menu_itens, options = {})
184
184
  return nil if menu_itens.empty?
185
185
 
@@ -205,6 +205,8 @@ module DaFunk
205
205
  end
206
206
  elsif event == :touchscreen
207
207
  menu_itens.select {|k, v| k == key}.shift[0]
208
+ elsif event == :timeout
209
+ Device::IO::KEY_TIMEOUT
208
210
  end
209
211
  end
210
212
 
@@ -274,7 +276,7 @@ module DaFunk
274
276
  # }
275
277
  #
276
278
  # menu("Option menu", selection, options)
277
- #
279
+ # @return nil if user canceled or Device::IO::KEY_TIMEOUT if timeout or option selected
278
280
  def menu(title, selection, options = {})
279
281
  return nil if selection.empty?
280
282
  options[:number] = true if options[:number].nil?
@@ -296,6 +298,8 @@ module DaFunk
296
298
 
297
299
  if key == Device::IO::ENTER
298
300
  options[:default]
301
+ elsif key == Device::IO::KEY_TIMEOUT
302
+ Device::IO::KEY_TIMEOUT
299
303
  else
300
304
  selected
301
305
  end
@@ -303,7 +307,10 @@ module DaFunk
303
307
 
304
308
  # TODO Scalone: Refactor.
305
309
  def pagination(title, options, collection, &block)
310
+ timeout = options[:timeout].nil? ? options[:timeout] : Device::IO.timeout
311
+ touchscreen_options = {}
306
312
  start_line, options[:limit], options[:header] = pagination_limit(title, options)
313
+
307
314
  if collection.size > (options[:limit] - options[:header]) # minus pagination header
308
315
  key = Device::IO.back_key
309
316
  pages = pagination_page(collection, options[:limit] - options[:header]) # minus pagination header
@@ -313,7 +320,13 @@ module DaFunk
313
320
  pagination_header(title, page, pages.size, start_line, options[:default], options[:header])
314
321
  values = pages[page].to_a
315
322
  block.call(values, start_line + options[:header])
316
- key = try_key(pagination_keys(values.size, true))
323
+
324
+ params = {special_keys: pagination_keys(values.size, true)}
325
+ if options.include?(:touchscreen_options)
326
+ touchscreen_options = options[:touchscreen_options]
327
+ end
328
+
329
+ _, key = wait_touchscreen_or_keyboard_event(touchscreen_options, timeout, params)
317
330
  page = pagination_key_page(page, key, pages.size)
318
331
  end
319
332
  else
@@ -321,7 +334,8 @@ module DaFunk
321
334
  print_title(title, options[:default]) if title
322
335
  values = collection.to_a
323
336
  block.call(values, start_line)
324
- key = try_key(pagination_keys(collection.size, false))
337
+ params = {special_keys: pagination_keys(collection.size, false)}
338
+ _, key = wait_touchscreen_or_keyboard_event(touchscreen_options, timeout, params)
325
339
  end
326
340
  result = values[key.to_i-1] if key.integer?
327
341
  if result.is_a? Array
@@ -441,18 +455,6 @@ module DaFunk
441
455
  end
442
456
  end
443
457
 
444
- def processing(image, message = {})
445
- Device::Display.print_bitmap(to_bmp(image)) if bmp_exists?(image)
446
- end
447
-
448
- def bmp_exists?(bmp)
449
- File.exists?(to_bmp(bmp))
450
- end
451
-
452
- def to_bmp(image)
453
- "./shared/#{image.to_s}.bmp"
454
- end
455
-
456
458
  private
457
459
  def parse_touchscreen_event(menu_itens, x, y)
458
460
  menu_itens.each do |key, value|
@@ -1,18 +1,26 @@
1
1
  module DaFunk
2
2
  module Helper
3
3
  class StatusBar
4
- STATUS_TIMEOUT = 60
5
- SLOT_CONNECTION = 0
6
- SLOT_BATTERY = 7
7
- SLOT_LINK = 1
8
- SLOT_UPDATE = 2
4
+ STATUS_TIMEOUT = 60
5
+ SLOT_MEDIA = 0
6
+ SLOT_SIGNAL_LEVEL = 1
7
+ SLOT_UPDATE = 2
8
+ SLOT_BATTERY_PERCENTUAL = 6
9
+ SLOT_BATTERY_LEVEL = 7
9
10
 
10
11
  BATTERY_IMAGES = {
11
- 0..24 => "./shared/battery0.png",
12
- 25..49 => "./shared/battery25.png",
13
- 50..74 => "./shared/battery50.png",
14
- 75..99 => "./shared/battery75.png",
15
- 100..100 => "./shared/battery100.png"
12
+ 0..4 => "./shared/battery0.png",
13
+ 5..9 => "./shared/baterry5.png",
14
+ 10..19 => "./shared/battery10.png",
15
+ 20..29 => "./shared/battery20.png",
16
+ 30..39 => "./shared/battery30.png",
17
+ 40..49 => "./shared/battery40.png",
18
+ 50..59 => "./shared/battery50.png",
19
+ 60..69 => "./shared/battery60.png",
20
+ 70..79 => "./shared/battery70.png",
21
+ 80..89 => "./shared/battery80.png",
22
+ 90..99 => "./shared/battery90.png",
23
+ 100..100 => "./shared/battery100.png",
16
24
  }
17
25
 
18
26
  BATTERY_CHARGE_IMAGES = {
@@ -20,11 +28,27 @@ module DaFunk
20
28
  100 => "./shared/battery100c.png"
21
29
  }
22
30
 
31
+ BATTERY_PERCENTAGE_IMAGES = {
32
+ 0..4 => "./shared/battery1_percent.png",
33
+ 5..9 => "./shared/battery5_percent.png",
34
+ 10..19 => "./shared/battery10_percent.png",
35
+ 20..29 => "./shared/battery20_percent.png",
36
+ 30..39 => "./shared/battery30_percent.png",
37
+ 40..49 => "./shared/battery40_percent.png",
38
+ 50..59 => "./shared/battery50_percent.png",
39
+ 60..69 => "./shared/battery60_percent.png",
40
+ 70..79 => "./shared/battery70_percent.png",
41
+ 80..89 => "./shared/battery80_percent.png",
42
+ 90..99 => "./shared/battery90_percent.png",
43
+ 100..100 => "./shared/battery100_percent.png",
44
+ }
45
+
23
46
  WIFI_IMAGES = {
24
- 0..29 => "./shared/wifi0.png",
25
- 30..59 => "./shared/wifi30.png",
26
- 60..79 => "./shared/wifi60.png",
27
- 80..200 => "./shared/wifi100.png"
47
+ 0..0 => "./shared/wifi0.png",
48
+ 1..25 => "./shared/wifi25.png",
49
+ 26..50 => "./shared/wifi50.png",
50
+ 59..75 => "./shared/wifi75.png",
51
+ 76..200 => "./shared/wifi100.png"
28
52
  }
29
53
 
30
54
  MOBILE_IMAGES = {
@@ -37,14 +61,13 @@ module DaFunk
37
61
  }
38
62
 
39
63
  class << self
40
- attr_accessor :signal, :battery, :power, :managment, :link
64
+ attr_accessor :signal, :battery, :power, :managment
41
65
  end
42
66
 
43
67
  def self.check
44
68
  if self.valid?
45
69
  self.change_connection
46
70
  self.change_battery
47
- self.change_link
48
71
  self.change_update
49
72
  end
50
73
  end
@@ -57,44 +80,45 @@ module DaFunk
57
80
  end
58
81
  end
59
82
 
60
- def self.change_link
83
+ def self.change_connection
61
84
  if Device::Network.connected?
62
- if DaFunk::PaymentChannel.alive?
63
- PAX::Display.print_status_bar(SLOT_LINK, "./shared/link.png")
64
- else
65
- PAX::Display.print_status_bar(SLOT_LINK, "./shared/unlink.png")
66
- end
67
- else
68
- PAX::Display.print_status_bar(SLOT_LINK, "./shared/unlink.png")
69
- end
70
- end
85
+ sig = Device::Network.signal
71
86
 
72
- def self.change_connection
73
- sig = Device::Network.signal
74
- if self.signal != sig
75
- self.signal = sig
76
- if Device::Network.gprs?
77
- Device::Display.print_status_bar(SLOT_CONNECTION,
78
- get_image_path(:gprs, self.signal))
79
- elsif Device::Network.wifi?
80
- Device::Display.print_status_bar(SLOT_CONNECTION,
81
- get_image_path(:wifi, self.signal))
87
+ if self.signal != sig
88
+ self.signal = sig
89
+
90
+ if Device::Network.gprs?
91
+ Device::Display.print_status_bar(SLOT_MEDIA, "./shared/GPRS.png")
92
+ Device::Display.print_status_bar(SLOT_SIGNAL_LEVEL,
93
+ get_image_path(:gprs, self.signal))
94
+ elsif Device::Network.wifi?
95
+ Device::Display.print_status_bar(SLOT_MEDIA, "./shared/WIFI.png")
96
+ Device::Display.print_status_bar(SLOT_SIGNAL_LEVEL,
97
+ get_image_path(:wifi, self.signal))
98
+ end
82
99
  end
100
+ else
101
+ Device::Display.print_status_bar(SLOT_MEDIA, nil)
102
+ Device::Display.print_status_bar(SLOT_SIGNAL_LEVEL, "./shared/searching.png")
83
103
  end
84
104
  end
85
105
 
86
106
  def self.change_battery
87
107
  bat = Device::System.battery
88
108
  dock = Device::System.power_supply
109
+
89
110
  if self.battery != bat || self.power != dock
90
111
  self.battery = bat
91
112
  self.power = dock
113
+
114
+ Device::Display.print_status_bar(SLOT_BATTERY_PERCENTUAL,
115
+ get_image_path(:battery_percentual, self.battery))
92
116
  if self.power
93
117
  Device::Display.print_status_bar(
94
- SLOT_BATTERY, get_image_path(:battery_charge, self.battery))
118
+ SLOT_BATTERY_LEVEL, get_image_path(:battery_charge, self.battery))
95
119
  else
96
- Device::Display.print_status_bar(
97
- SLOT_BATTERY, get_image_path(:battery, self.battery))
120
+ Device::Display.print_status_bar(SLOT_BATTERY_LEVEL,
121
+ get_image_path(:battery, self.battery))
98
122
  end
99
123
  end
100
124
  end
@@ -110,6 +134,8 @@ module DaFunk
110
134
  BATTERY_IMAGES.each {|k,v| return v if k.include? sig }
111
135
  when :battery_charge
112
136
  BATTERY_CHARGE_IMAGES[sig]
137
+ when :battery_percentual
138
+ BATTERY_PERCENTAGE_IMAGES.each {|k,v| return v if k.include? sig }
113
139
  else
114
140
  nil
115
141
  end
@@ -3,11 +3,29 @@ module DaFunk
3
3
  DEFAULT_HEARBEAT = "180"
4
4
 
5
5
  class << self
6
- attr_accessor :client, :app
6
+ attr_accessor :current, :app
7
7
  end
8
8
 
9
9
  attr_accessor :handshake_response, :handshake_request, :client, :host, :port
10
10
 
11
+ # Backward compatibility
12
+ def self.client
13
+ self.current
14
+ end
15
+
16
+ # Backward compatibility
17
+ def self.client=(obj)
18
+ self.current = obj
19
+ end
20
+
21
+ def self.current
22
+ @current
23
+ end
24
+
25
+ def self.current=(obj)
26
+ @current = obj
27
+ end
28
+
11
29
  def self.ready?
12
30
  Device::Network.connected? && self.configured?
13
31
  end
@@ -22,8 +40,8 @@ module DaFunk
22
40
  if @app != application
23
41
  @app = application
24
42
  # if Context::CommunicationChannel send application name thought threads
25
- if @client == Context::CommunicationChannel
26
- @client.app = application
43
+ if self.current == Context::CommunicationChannel
44
+ self.current.app = application
27
45
  else
28
46
  Device::System.klass = application
29
47
  end
@@ -48,11 +66,11 @@ module DaFunk
48
66
  self.print_info(I18n.t(:attach_attaching), display_message)
49
67
  create
50
68
  self.print_info(I18n.t(:attach_authenticate), display_message)
51
- @client.handshake
69
+ self.current.handshake
52
70
  else
53
71
  client_clear!
54
72
  end
55
- @client
73
+ self.current
56
74
  end
57
75
 
58
76
  def self.payment_channel_limit?
@@ -84,18 +102,16 @@ module DaFunk
84
102
  if self.dead?
85
103
  unless self.channel_limit_exceed?
86
104
  PaymentChannel.connect(display_message)
87
- if @client
105
+ if self.current
88
106
  self.print_info(I18n.t(:attach_waiting), display_message)
89
- if message = @client.check || @client.handshake?
107
+ if message = self.current.check || self.current.handshake?
90
108
  self.print_info(I18n.t(:attach_connected), display_message)
91
109
  message
92
110
  end
93
111
  end
94
112
  end
95
113
  else
96
- if @client
97
- @client.check
98
- end
114
+ self.current&.check
99
115
  end
100
116
  end
101
117
 
@@ -104,11 +120,11 @@ module DaFunk
104
120
  end
105
121
 
106
122
  def self.alive?
107
- Device::Network.connected? && @client && @client.connected?
123
+ Device::Network.connected? && self.current&.connected?
108
124
  end
109
125
 
110
126
  def self.close!
111
- @client && @client.close
127
+ self.current&.close
112
128
  ensure
113
129
  client_clear!
114
130
  end
@@ -133,16 +149,16 @@ module DaFunk
133
149
  end
134
150
 
135
151
  def self.create
136
- if @client != Context::CommunicationChannel
152
+ if self.current != Context::CommunicationChannel
137
153
  payment_channel_increment_attempts
138
- @client = PaymentChannel.new
154
+ self.current = PaymentChannel.new
139
155
  else
140
- @client.connect
156
+ self.current.connect
141
157
  end
142
158
  end
143
159
 
144
160
  def self.client_clear!
145
- @client = nil unless @client == Context::CommunicationChannel
161
+ self.current = nil unless self.current == Context::CommunicationChannel
146
162
  end
147
163
 
148
164
  def initialize(client = nil)
@@ -180,13 +196,13 @@ module DaFunk
180
196
  end
181
197
 
182
198
  def close
183
- @client.close if @client
199
+ @client&.close
184
200
  @client = nil
185
- PaymentChannel.client = nil
201
+ PaymentChannel.current = nil
186
202
  end
187
203
 
188
204
  def connected?
189
- self.client && self.client.connected?
205
+ self.client&.connected?
190
206
  end
191
207
 
192
208
  def handshake?
@@ -215,7 +231,7 @@ module DaFunk
215
231
  if Context.development?
216
232
  ContextLog.exception(exception, exception.backtrace, "PaymentChannel error")
217
233
  end
218
- PaymentChannel.client = nil
234
+ PaymentChannel.current = nil
219
235
  @client = nil
220
236
  end
221
237
 
@@ -1,4 +1,4 @@
1
1
  module DaFunk
2
- VERSION="3.18.1"
2
+ VERSION="3.22.0"
3
3
  end
4
4
 
@@ -14,7 +14,6 @@ class Device
14
14
  # @param json [String] Parameters to confifure new aplication.
15
15
  # @return [Object] From the new runtime instance.
16
16
  def self.execute(app, json = nil)
17
- processing(:processing)
18
17
  buf = "#{json.dup}" if json.is_a?(String)
19
18
  mrb_eval("Context.execute('#{app.dup}', '#{Device.adapter}', '#{buf}')", "#{app.dup}")
20
19
  ensure
@@ -62,8 +62,8 @@ class Device
62
62
  "payment_channel_date" => "",
63
63
  "infinitepay_authorizer" => "0",
64
64
  "infinitepay_api" => "0",
65
- "infinitepay_cw_endpoint" => "0",
66
- "infinitepay_google_endpoint" => "1",
65
+ "infinitepay_cw_endpoint" => "1",
66
+ "infinitepay_google_endpoint" => "0",
67
67
  "transaction_http_enabled" => "1",
68
68
  "transaction_http_host" => HTTP_HOST_PRODUCTION,
69
69
  "transaction_http_port" => HTTP_PORT,
@@ -0,0 +1,187 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Device
4
+ class VirtualKeyboard
5
+ class << self
6
+ attr_accessor :attributes, :type, :text
7
+ end
8
+
9
+ self.attributes = {
10
+ keyboard_capital: [
11
+ { x: 0..34, y: 191..209, char: 'q' },
12
+ { x: 0..46, y: 191..209, char: 'w' },
13
+ { x: 0..65, y: 191..209, char: 'e' },
14
+ { x: 0..96, y: 191..209, char: 'r' },
15
+ { x: 0..115, y: 191..209, char: 't' },
16
+ { x: 0..145, y: 191..209, char: 'y' },
17
+ { x: 0..161, y: 191..209, char: 'u' },
18
+ { x: 0..191, y: 191..209, char: 'i' },
19
+ { x: 0..216, y: 191..209, char: 'o' },
20
+ { x: 0..255, y: 191..209, char: 'p' },
21
+ { x: 0..34, y: 223..241, char: 'a' },
22
+ { x: 0..59, y: 223..241, char: 's' },
23
+ { x: 0..83, y: 223..241, char: 'd' },
24
+ { x: 0..106, y: 223..241, char: 'f' },
25
+ { x: 0..131, y: 223..241, char: 'g' },
26
+ { x: 0..153, y: 223..241, char: 'h' },
27
+ { x: 0..178, y: 223..241, char: 'j' },
28
+ { x: 0..201, y: 223..241, char: 'k' },
29
+ { x: 0..230, y: 223..241, char: 'l' },
30
+ { x: 0..30, y: 223..273, char: :keyboard_uppercase },
31
+ { x: 0..56, y: 223..273, char: 'y' },
32
+ { x: 0..82, y: 223..273, char: 'x' },
33
+ { x: 0..109, y: 223..273, char: 'c' },
34
+ { x: 0..130, y: 223..273, char: 'v' },
35
+ { x: 0..154, y: 223..273, char: 'b' },
36
+ { x: 0..176, y: 223..273, char: 'n' },
37
+ { x: 0..201, y: 223..273, char: 'm' },
38
+ { x: 0..240, y: 223..273, char: :erase },
39
+ { x: 0..34, y: 223..315, char: :keyboard_symbol_number },
40
+ { x: 0..58, y: 223..315, char: '@' },
41
+ { x: 0..83, y: 223..315, char: ',' },
42
+ { x: 0..148, y: 223..315, char: :space },
43
+ { x: 0..177, y: 223..315, char: '.' },
44
+ { x: 0..255, y: 223..315, char: :enter }
45
+ ],
46
+
47
+ keyboard_uppercase: [
48
+ { x: 0..34, y: 191..209, char: 'Q' },
49
+ { x: 0..46, y: 191..209, char: 'W' },
50
+ { x: 0..65, y: 191..209, char: 'E' },
51
+ { x: 0..96, y: 191..209, char: 'R' },
52
+ { x: 0..115, y: 191..209, char: 'T' },
53
+ { x: 0..145, y: 191..209, char: 'Y' },
54
+ { x: 0..161, y: 191..209, char: 'U' },
55
+ { x: 0..191, y: 191..209, char: 'I' },
56
+ { x: 0..216, y: 191..209, char: 'O' },
57
+ { x: 0..255, y: 191..209, char: 'P' },
58
+ { x: 0..34, y: 223..241, char: 'A' },
59
+ { x: 0..59, y: 223..241, char: 'S' },
60
+ { x: 0..83, y: 223..241, char: 'D' },
61
+ { x: 0..106, y: 223..241, char: 'F' },
62
+ { x: 0..131, y: 223..241, char: 'G' },
63
+ { x: 0..153, y: 223..241, char: 'H' },
64
+ { x: 0..178, y: 223..241, char: 'J' },
65
+ { x: 0..201, y: 223..241, char: 'K' },
66
+ { x: 0..230, y: 223..241, char: 'L' },
67
+ { x: 0..30, y: 223..273, char: :keyboard_capital },
68
+ { x: 0..56, y: 223..273, char: 'Y' },
69
+ { x: 0..82, y: 223..273, char: 'X' },
70
+ { x: 0..109, y: 223..273, char: 'C' },
71
+ { x: 0..130, y: 223..273, char: 'V' },
72
+ { x: 0..154, y: 223..273, char: 'B' },
73
+ { x: 0..176, y: 223..273, char: 'N' },
74
+ { x: 0..201, y: 223..273, char: 'M' },
75
+ { x: 0..240, y: 223..273, char: :erase },
76
+ { x: 0..34, y: 223..315, char: :keyboard_symbol_number },
77
+ { x: 0..58, y: 223..315, char: '@' },
78
+ { x: 0..83, y: 223..315, char: ',' },
79
+ { x: 0..148, y: 223..315, char: :space },
80
+ { x: 0..177, y: 223..315, char: '.' },
81
+ { x: 0..255, y: 223..315, char: :enter }
82
+ ],
83
+
84
+ keyboard_symbol_number: [
85
+ { x: 0..35, y: 190..210, char: '(' },
86
+ { x: 0..68, y: 190..210, char: ')' },
87
+ { x: 0..104, y: 190..210, char: '1' },
88
+ { x: 0..138, y: 190..210, char: '2' },
89
+ { x: 0..169, y: 190..210, char: '3' },
90
+ { x: 0..203, y: 190..210, char: '+' },
91
+ { x: 0..239, y: 190..210, char: '-' },
92
+ { x: 0..35, y: 220..245, char: '?' },
93
+ { x: 0..68, y: 220..245, char: '$' },
94
+ { x: 0..104, y: 220..245, char: '4' },
95
+ { x: 0..138, y: 220..245, char: '5' },
96
+ { x: 0..169, y: 220..245, char: '6' },
97
+ { x: 0..203, y: 220..245, char: '*' },
98
+ { x: 0..239, y: 220..245, char: '/' },
99
+ { x: 0..35, y: 255..275, char: '!' },
100
+ { x: 0..68, y: 255..275, char: ';' },
101
+ { x: 0..104, y: 255..275, char: '7' },
102
+ { x: 0..138, y: 255..275, char: '8' },
103
+ { x: 0..169, y: 255..275, char: '9' },
104
+ { x: 0..203, y: 255..275, char: '=' },
105
+ { x: 0..239, y: 255..275, char: :erase },
106
+ { x: 0..35, y: 290..315, char: :keyboard_capital },
107
+ { x: 0..68, y: 290..315, char: '@' },
108
+ { x: 0..104, y: 290..315, char: '%' },
109
+ { x: 0..138, y: 290..315, char: '0' },
110
+ { x: 0..169, y: 290..315, char: '#' },
111
+ { x: 0..203, y: 290..315, char: '_' },
112
+ { x: 0..239, y: 290..315, char: :enter }
113
+ ]
114
+ }
115
+
116
+ def self.type_text(params = {})
117
+ change_keyboard
118
+ Device::Display.print_line("#{self.text}", params[:line], params[:column])
119
+ time = Time.now + (params[:timeout] || Device::IO.timeout) / 1000
120
+ key = nil
121
+
122
+ while text_not_ready?(key)
123
+ line_x, line_y = getxy_stream(100)
124
+
125
+ if line_x && line_y
126
+ touch_clear
127
+ key = parse(line_x, line_y, params)
128
+ else
129
+ break(Device::IO::KEY_TIMEOUT) if Time.now > time
130
+
131
+ key = getc(100)
132
+ end
133
+ end
134
+
135
+ [key, self.text]
136
+ end
137
+
138
+ def self.text_not_ready?(key)
139
+ key != :enter && key != Device::IO::ENTER && key != Device::IO::CANCEL
140
+ end
141
+
142
+ def self.parse(line_x, line_y, params)
143
+ key = attributes[type].find do |value|
144
+ value[:x].include?(line_x) && value[:y].include?(line_y)
145
+ end
146
+ return if key.nil?
147
+
148
+ Device::Audio.beep(7, 60)
149
+ show_text(key, params)
150
+
151
+ key[:char]
152
+ end
153
+
154
+ def self.show_text(key, params)
155
+ case key[:char]
156
+ when :keyboard_uppercase, :keyboard_symbol_number, :keyboard_capital
157
+ self.type = key[:char]
158
+ change_keyboard
159
+ when :erase
160
+ self.text += '' if text.nil?
161
+ self.text = text[0..-2]
162
+ when :space
163
+ self.text += ' '
164
+ else
165
+ self.text << key[:char] unless key[:char] == :enter
166
+ end
167
+ Device::Display.print_line("#{self.text}", params[:line], params[:column])
168
+ end
169
+
170
+ def self.change_keyboard
171
+ if type.nil?
172
+ self.type = :keyboard_capital
173
+ Device::Display.print_bitmap('./shared/keyboard_capital.bmp')
174
+ else
175
+ Device::Display.print_bitmap("./shared/#{type}.bmp")
176
+ end
177
+ end
178
+
179
+ def self.wifi_password
180
+ self.text = if Device::Setting.wifi_password == 'false'
181
+ ''
182
+ else
183
+ Device::Setting.wifi_password
184
+ end
185
+ end
186
+ end
187
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: da_funk
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.18.1
4
+ version: 3.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thiago Scalone
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-20 00:00:00.000000000 Z
11
+ date: 2020-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -192,6 +192,7 @@ files:
192
192
  - lib/device/support.rb
193
193
  - lib/device/system.rb
194
194
  - lib/device/version.rb
195
+ - lib/device/virtual_keyboard.rb
195
196
  - lib/ext/array.rb
196
197
  - lib/ext/float.rb
197
198
  - lib/ext/hash.rb