da_funk 3.31.0 → 3.34.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -1
- data/Gemfile.lock +18 -8
- data/README.md +0 -0
- data/README_GUIDE.md +0 -0
- data/RELEASE_NOTES.md +22 -0
- data/Rakefile +14 -0
- data/guides/sample_input_output.rb +0 -0
- data/guides/sample_message_iso8583.rb +0 -0
- data/guides/sample_network_gprs.rb +0 -0
- data/guides/sample_read_magnect_card.rb +0 -0
- data/guides/sample_socket.rb +0 -0
- data/guides/sample_transaction.rb +0 -0
- data/guides/sample_transaction_download_application.rb +0 -0
- data/guides/sample_transaction_download_file.rb +0 -0
- data/guides/sample_transaction_download_parameter_file.rb +0 -0
- data/lib/da_funk/connection_management.rb +25 -10
- data/lib/da_funk/event_handler.rb +1 -1
- data/lib/da_funk/helper.rb +55 -16
- data/lib/da_funk/helper/status_bar.rb +42 -46
- data/lib/da_funk/params_dat.rb +65 -25
- data/lib/da_funk/transaction/download.rb +0 -0
- data/lib/da_funk/transaction/iso.rb +0 -0
- data/lib/da_funk/version.rb +1 -1
- data/lib/device.rb +0 -0
- data/lib/device/crypto.rb +0 -0
- data/lib/device/display.rb +0 -0
- data/lib/device/io.rb +53 -0
- data/lib/device/network.rb +19 -33
- data/lib/device/printer.rb +0 -0
- data/lib/device/setting.rb +0 -0
- data/lib/device/version.rb +0 -0
- data/lib/device/virtual_keyboard.rb +81 -34
- data/lib/file_db.rb +0 -0
- data/lib/iso8583/bitmap.rb +94 -54
- data/lib/iso8583/codec.rb +3 -3
- data/lib/iso8583/field.rb +48 -4
- data/lib/iso8583/fields.rb +3 -1
- data/lib/iso8583/message.rb +25 -12
- data/lib/iso8583/util.rb +1 -1
- data/test/iso8583/bitmap_test.rb +277 -0
- data/test/iso8583/message_test.rb +111 -0
- data/test/iso8583/minitest_helper.rb +11 -0
- metadata +12 -6
data/lib/da_funk/params_dat.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module DaFunk
|
2
2
|
class ParamsDat
|
3
|
-
FILE_NAME
|
3
|
+
FILE_NAME = "./main/params.dat"
|
4
|
+
SEARCHING_IMAGE_PATH = './shared/searching_updates_app.bmp'
|
5
|
+
UPDATING_IMAGE_PATH = './shared/updating.bmp'
|
6
|
+
ATTACH_IMAGE_PATH = './shared/network_conectar_init.bmp'
|
7
|
+
CONNECTION_ERROR_IMAGE_PATH = './shared/network_system_error.bmp'
|
4
8
|
|
5
9
|
include DaFunk::Helper
|
6
10
|
|
@@ -117,31 +121,40 @@ module DaFunk
|
|
117
121
|
end
|
118
122
|
|
119
123
|
def self.download(enable_txt_ui = true)
|
124
|
+
ret = false
|
125
|
+
download_ret = false
|
126
|
+
Device::Display.print_bitmap(ATTACH_IMAGE_PATH) unless enable_txt_ui
|
120
127
|
if attach(attach_options(enable_txt_ui))
|
121
128
|
parse
|
122
|
-
|
129
|
+
try(3) do |attempt|
|
123
130
|
if enable_txt_ui
|
124
131
|
Device::Display.clear
|
125
132
|
I18n.pt(:downloading_content, :args => ["PARAMS", 1, 1])
|
133
|
+
getc(100)
|
126
134
|
end
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
getc(2000)
|
131
|
-
false
|
132
|
-
else
|
133
|
-
true
|
134
|
-
end
|
135
|
+
Device::Display.print_bitmap(SEARCHING_IMAGE_PATH) unless enable_txt_ui
|
136
|
+
download_ret = DaFunk::Transaction::Download.request_param_file(FILE_NAME)
|
137
|
+
ret = check_download_error(download_ret, enable_txt_ui)
|
135
138
|
end
|
139
|
+
show_download_error(download_ret, enable_txt_ui) unless ret
|
136
140
|
parse if ret
|
137
|
-
|
141
|
+
else
|
142
|
+
unless enable_txt_ui
|
143
|
+
Device::Display.print_bitmap(CONNECTION_ERROR_IMAGE_PATH)
|
144
|
+
getc(5000)
|
145
|
+
end
|
138
146
|
end
|
147
|
+
ret
|
139
148
|
end
|
140
149
|
|
141
150
|
def self.update_apps(force_params = false, force_crc = false, force = false, enable_txt_ui = true)
|
142
|
-
|
151
|
+
ret = true
|
152
|
+
if force_params || ! self.valid
|
153
|
+
ret = self.download(enable_txt_ui)
|
154
|
+
end
|
155
|
+
|
143
156
|
main_updated = nil
|
144
|
-
if self.valid
|
157
|
+
if self.valid && ret
|
145
158
|
apps_to_update = self.outdated_apps(force_crc, force)
|
146
159
|
size_apps = apps_to_update.size
|
147
160
|
apps_to_update.each_with_index do |app, index|
|
@@ -149,12 +162,15 @@ module DaFunk
|
|
149
162
|
main_updated ||= (ret && app.main_application?)
|
150
163
|
end
|
151
164
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
165
|
+
if ret
|
166
|
+
files_to_update = self.outdated_files(force_crc, force)
|
167
|
+
size_files = files_to_update.size
|
168
|
+
files_to_update.each_with_index do |file_, index|
|
169
|
+
ret = self.update_file(file_, index+1, size_files, force_crc || force, enable_txt_ui)
|
170
|
+
end
|
156
171
|
end
|
157
172
|
end
|
173
|
+
ret
|
158
174
|
ensure
|
159
175
|
self.restart if main_updated
|
160
176
|
end
|
@@ -199,34 +215,58 @@ module DaFunk
|
|
199
215
|
end
|
200
216
|
|
201
217
|
def self.update_app(application, index = 1, all = 1, force = false, enable_txt_ui = true)
|
218
|
+
ret = false
|
219
|
+
download_ret = false
|
220
|
+
Device::Display.print_bitmap(ATTACH_IMAGE_PATH) unless enable_txt_ui
|
202
221
|
if attach(attach_options(enable_txt_ui)) && application
|
203
222
|
try(3) do |attempt|
|
204
223
|
if enable_txt_ui
|
205
224
|
Device::Display.clear
|
206
225
|
I18n.pt(:downloading_content, :args => [I18n.t(:apps), index, all])
|
226
|
+
getc(100)
|
207
227
|
end
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
228
|
+
Device::Display.print_bitmap(UPDATING_IMAGE_PATH) unless enable_txt_ui
|
229
|
+
download_ret = application.download(force)
|
230
|
+
ret = check_download_error(download_ret, enable_txt_ui)
|
231
|
+
end
|
232
|
+
show_download_error(download_ret, enable_txt_ui) unless ret
|
233
|
+
else
|
234
|
+
unless enable_txt_ui
|
235
|
+
Device::Display.print_bitmap(CONNECTION_ERROR_IMAGE_PATH)
|
236
|
+
getc(5000)
|
212
237
|
end
|
213
238
|
end
|
239
|
+
ret
|
214
240
|
end
|
215
241
|
|
216
242
|
def self.update_file(file_parameter, index = 1, all = 1, force = false, enable_txt_ui = true)
|
243
|
+
ret = false
|
244
|
+
download_ret = false
|
245
|
+
Device::Display.print_bitmap(ATTACH_IMAGE_PATH) unless enable_txt_ui
|
217
246
|
if attach(attach_options(enable_txt_ui)) && file_parameter
|
218
247
|
try(3) do |attempt|
|
219
248
|
if enable_txt_ui
|
220
249
|
Device::Display.clear
|
221
250
|
I18n.pt(:downloading_content, :args => [I18n.t(:files), index, all])
|
251
|
+
getc(100)
|
252
|
+
end
|
253
|
+
Device::Display.print_bitmap(UPDATING_IMAGE_PATH) unless enable_txt_ui
|
254
|
+
download_ret = file_parameter.download(force)
|
255
|
+
ret = check_download_error(download_ret, enable_txt_ui)
|
256
|
+
if ret
|
257
|
+
file_parameter.unzip
|
258
|
+
getc(1000)
|
222
259
|
end
|
223
|
-
getc(100)
|
224
|
-
ret = check_download_error(file_parameter.download(force), enable_txt_ui)
|
225
|
-
file_parameter.unzip if ret
|
226
|
-
getc(1000)
|
227
260
|
ret
|
228
261
|
end
|
262
|
+
show_download_error(download_ret, enable_txt_ui) unless ret
|
263
|
+
else
|
264
|
+
unless enable_txt_ui
|
265
|
+
Device::Display.print_bitmap(CONNECTION_ERROR_IMAGE_PATH)
|
266
|
+
getc(5000)
|
267
|
+
end
|
229
268
|
end
|
269
|
+
ret
|
230
270
|
end
|
231
271
|
|
232
272
|
def self.apps
|
File without changes
|
File without changes
|
data/lib/da_funk/version.rb
CHANGED
data/lib/device.rb
CHANGED
File without changes
|
data/lib/device/crypto.rb
CHANGED
File without changes
|
data/lib/device/display.rb
CHANGED
File without changes
|
data/lib/device/io.rb
CHANGED
@@ -161,6 +161,59 @@ class Device
|
|
161
161
|
end
|
162
162
|
end
|
163
163
|
|
164
|
+
def self.get_format_or_touchscreen_action(max, touch_map, options = {})
|
165
|
+
set_default_format_option(options)
|
166
|
+
key = text = options[:value] || ""
|
167
|
+
time = Time.now + (options[:timeout] || 30000) / 1000
|
168
|
+
ret = {}
|
169
|
+
touch_clear
|
170
|
+
Device::Display.clear options[:line]
|
171
|
+
Device::Display.print_line format(text, options), options[:line], options[:column]
|
172
|
+
loop do
|
173
|
+
line_x, line_y = getxy_stream(100)
|
174
|
+
if line_x && line_y
|
175
|
+
ret = parse_touchscreen(touch_map, line_x, line_y)
|
176
|
+
break(ret) if ret.include?(:touch_action)
|
177
|
+
else
|
178
|
+
key = getc(100)
|
179
|
+
if key == BACK
|
180
|
+
text = text[0..-2]
|
181
|
+
Device::Display.clear options[:line]
|
182
|
+
Device::Display.print_line format(text, options), options[:line], options[:column]
|
183
|
+
elsif options[:timeout_enabled] && time < Time.now
|
184
|
+
ret[:timeout] = Device::IO::KEY_TIMEOUT
|
185
|
+
break(ret)
|
186
|
+
elsif key == ENTER
|
187
|
+
ret[:text] = text
|
188
|
+
break(ret)
|
189
|
+
elsif key == CANCEL
|
190
|
+
ret[:cancel] = Device::IO::CANCEL
|
191
|
+
break(ret)
|
192
|
+
elsif key == F1 || key == DOWN || key == UP || key == ALPHA
|
193
|
+
change_next(text, check_mask_type(text, options))
|
194
|
+
next
|
195
|
+
elsif text.size >= max
|
196
|
+
next
|
197
|
+
elsif insert_key?(key, options)
|
198
|
+
text << key
|
199
|
+
Device::Display.clear options[:line]
|
200
|
+
Device::Display.print_line format(text, options), options[:line], options[:column]
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.parse_touchscreen(touch_map, line_x, line_y)
|
207
|
+
ret = {}
|
208
|
+
touch_map.each do |key, value|
|
209
|
+
if value[:x].include?(line_x) && value[:y].include?(line_y)
|
210
|
+
Device::Audio.beep(7, 60)
|
211
|
+
ret[:touch_action] = key
|
212
|
+
end
|
213
|
+
end
|
214
|
+
ret
|
215
|
+
end
|
216
|
+
|
164
217
|
def self.set_default_format_option(options)
|
165
218
|
options[:mode] ||= IO_INPUT_LETTERS
|
166
219
|
options[:line] ||= 2
|
data/lib/device/network.rb
CHANGED
@@ -159,9 +159,7 @@ class Device
|
|
159
159
|
# Device::Setting.mode = selected[:mode]
|
160
160
|
def self.scan
|
161
161
|
if wifi?
|
162
|
-
|
163
|
-
adapter.scan if Device::Network.init(*self.config)
|
164
|
-
end
|
162
|
+
adapter.scan if Device::Network.init(*self.config)
|
165
163
|
end
|
166
164
|
end
|
167
165
|
|
@@ -192,39 +190,28 @@ class Device
|
|
192
190
|
def self.attach(options = nil)
|
193
191
|
Device::Network.connected?
|
194
192
|
if self.code != SUCCESS
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
process[:ret] == PROCESSING || process[:ret] == 2 || process[:ret] == -3307 # if true keep trying
|
206
|
-
end
|
207
|
-
self.code = hash[:ret]
|
208
|
-
|
209
|
-
if self.code == SUCCESS
|
210
|
-
self.load_metadata
|
211
|
-
self.code = Device::Network.dhcp_client(20000) if (wifi? || ethernet?)
|
212
|
-
else
|
213
|
-
self.code = ERR_USER_CANCEL if hash[:key] == Device::IO::CANCEL
|
214
|
-
Device::Network.shutdown
|
215
|
-
end
|
193
|
+
self.code = Device::Network.init(*self.config)
|
194
|
+
self.code = Device::Network.connect
|
195
|
+
Device::Network.connected? if self.code != SUCCESS
|
196
|
+
|
197
|
+
hash = try_user(self.attach_timeout, options) do |process|
|
198
|
+
Device::Network.connected?
|
199
|
+
process[:ret] = self.code
|
200
|
+
# TODO develop an interface to keep waiting communication module dial
|
201
|
+
# based on platform returns
|
202
|
+
process[:ret] == PROCESSING || process[:ret] == 2 || process[:ret] == -3307 # if true keep trying
|
216
203
|
end
|
217
|
-
|
218
|
-
Context::ThreadPubSub.publish('communication_update')
|
219
|
-
self.code
|
220
|
-
end
|
204
|
+
self.code = hash[:ret]
|
221
205
|
|
222
|
-
|
223
|
-
|
224
|
-
|
206
|
+
if self.code == SUCCESS
|
207
|
+
self.code = Device::Network.dhcp_client(20000) if (wifi? || ethernet?)
|
208
|
+
else
|
209
|
+
self.code = ERR_USER_CANCEL if hash[:key] == Device::IO::CANCEL
|
210
|
+
Device::Network.shutdown
|
211
|
+
end
|
225
212
|
end
|
213
|
+
self.code
|
226
214
|
end
|
227
|
-
|
228
215
|
def self.shutdown
|
229
216
|
if self.adapter.started?
|
230
217
|
Device::Network.disconnect
|
@@ -276,4 +263,3 @@ class Device
|
|
276
263
|
end
|
277
264
|
end
|
278
265
|
end
|
279
|
-
|
data/lib/device/printer.rb
CHANGED
File without changes
|
data/lib/device/setting.rb
CHANGED
File without changes
|
data/lib/device/version.rb
CHANGED
File without changes
|
@@ -82,34 +82,76 @@ class Device
|
|
82
82
|
],
|
83
83
|
|
84
84
|
keyboard_symbol_number: [
|
85
|
-
{ x: 0..
|
86
|
-
{ x: 0..
|
87
|
-
{ x: 0..
|
88
|
-
{ x: 0..
|
89
|
-
{ x: 0..
|
90
|
-
{ x: 0..
|
91
|
-
{ x: 0..
|
92
|
-
{ x: 0..
|
93
|
-
{ x: 0..
|
94
|
-
{ x: 0..
|
95
|
-
{ x: 0..
|
96
|
-
{ x: 0..
|
97
|
-
{ x: 0..
|
98
|
-
{ x: 0..
|
99
|
-
{ x: 0..
|
100
|
-
{ x: 0..
|
101
|
-
{ x: 0..
|
102
|
-
{ x: 0..
|
103
|
-
{ x: 0..
|
104
|
-
{ x: 0..
|
105
|
-
{ x: 0..
|
106
|
-
{ x: 0..
|
107
|
-
{ x: 0..
|
108
|
-
{ x: 0..
|
109
|
-
{ x: 0..
|
110
|
-
{ x: 0..
|
111
|
-
{ x: 0..
|
112
|
-
{ x: 0..
|
85
|
+
{ x: 0..34, y: 191..209, char: '1' },
|
86
|
+
{ x: 0..46, y: 191..209, char: '2' },
|
87
|
+
{ x: 0..65, y: 191..209, char: '3' },
|
88
|
+
{ x: 0..96, y: 191..209, char: '4' },
|
89
|
+
{ x: 0..115, y: 191..209, char: '5' },
|
90
|
+
{ x: 0..145, y: 191..209, char: '6' },
|
91
|
+
{ x: 0..161, y: 191..209, char: '7' },
|
92
|
+
{ x: 0..191, y: 191..209, char: '8' },
|
93
|
+
{ x: 0..216, y: 191..209, char: '9' },
|
94
|
+
{ x: 0..255, y: 191..209, char: '0' },
|
95
|
+
{ x: 0..31, y: 223..241, char: '%' },
|
96
|
+
{ x: 0..52, y: 223..241, char: '#' },
|
97
|
+
{ x: 0..77, y: 223..241, char: '$' },
|
98
|
+
{ x: 0..97, y: 223..241, char: '_' },
|
99
|
+
{ x: 0..121, y: 223..241, char: '&' },
|
100
|
+
{ x: 0..143, y: 223..241, char: '-' },
|
101
|
+
{ x: 0..168, y: 223..241, char: '+' },
|
102
|
+
{ x: 0..186, y: 223..241, char: '(' },
|
103
|
+
{ x: 0..215, y: 223..241, char: ')' },
|
104
|
+
{ x: 0..236, y: 223..241, char: '/' },
|
105
|
+
{ x: 0..42, y: 223..274, char: :keyboard_symbol_number_2 },
|
106
|
+
{ x: 0..60, y: 223..274, char: '*' },
|
107
|
+
{ x: 0..84, y: 223..274, char: '"' },
|
108
|
+
{ x: 0..107, y: 223..274, char: "'" },
|
109
|
+
{ x: 0..130, y: 223..274, char: ':' },
|
110
|
+
{ x: 0..152, y: 223..274, char: ';' },
|
111
|
+
{ x: 0..171, y: 223..274, char: '!' },
|
112
|
+
{ x: 0..197, y: 223..274, char: '?' },
|
113
|
+
{ x: 0..255, y: 223..274, char: :erase },
|
114
|
+
{ x: 0..36, y: 223..315, char: :keyboard_capital },
|
115
|
+
{ x: 0..63, y: 223..315, char: '@' },
|
116
|
+
{ x: 0..88, y: 223..315, char: ',' },
|
117
|
+
{ x: 0..152, y: 223..315, char: :space },
|
118
|
+
{ x: 0..168, y: 223..315, char: '.' },
|
119
|
+
{ x: 0..255, y: 223..315, char: :enter }
|
120
|
+
],
|
121
|
+
|
122
|
+
keyboard_symbol_number_2: [
|
123
|
+
{ x: 0..34, y: 191..209, char: '1' },
|
124
|
+
{ x: 0..46, y: 191..209, char: '2' },
|
125
|
+
{ x: 0..69, y: 191..209, char: '3' },
|
126
|
+
{ x: 0..96, y: 191..209, char: '4' },
|
127
|
+
{ x: 0..115, y: 191..209, char: '5' },
|
128
|
+
{ x: 0..145, y: 191..209, char: '6' },
|
129
|
+
{ x: 0..161, y: 191..209, char: '7' },
|
130
|
+
{ x: 0..191, y: 191..209, char: '8' },
|
131
|
+
{ x: 0..216, y: 191..209, char: '9' },
|
132
|
+
{ x: 0..255, y: 191..209, char: '0' },
|
133
|
+
{ x: 0..35, y: 223..241, char: '^' },
|
134
|
+
{ x: 0..63, y: 223..241, char: '[' },
|
135
|
+
{ x: 0..97, y: 223..241, char: ']' },
|
136
|
+
{ x: 0..128, y: 223..241, char: '{' },
|
137
|
+
{ x: 0..158, y: 223..241, char: '}' },
|
138
|
+
{ x: 0..193, y: 223..241, char: '<' },
|
139
|
+
{ x: 0..255, y: 223..241, char: '>' },
|
140
|
+
{ x: 0..39, y: 223..274, char: :keyboard_symbol_number },
|
141
|
+
{ x: 0..63, y: 223..274, char: '\\' },
|
142
|
+
{ x: 0..86, y: 223..274, char: '-' },
|
143
|
+
{ x: 0..106, y: 223..274, char: '+' },
|
144
|
+
{ x: 0..130, y: 223..274, char: '=' },
|
145
|
+
{ x: 0..149, y: 223..274, char: '_' },
|
146
|
+
{ x: 0..175, y: 223..274, char: '˜' },
|
147
|
+
{ x: 0..195, y: 223..274, char: '|' },
|
148
|
+
{ x: 0..255, y: 223..274, char: :erase },
|
149
|
+
{ x: 0..34, y: 223..310, char: :keyboard_capital },
|
150
|
+
{ x: 0..61, y: 223..310, char: '@' },
|
151
|
+
{ x: 0..87, y: 223..310, char: ',' },
|
152
|
+
{ x: 0..146, y: 223..313, char: :space },
|
153
|
+
{ x: 0..168, y: 223..311, char: '.' },
|
154
|
+
{ x: 0..194, y: 223..319, char: :enter }
|
113
155
|
]
|
114
156
|
}
|
115
157
|
|
@@ -117,9 +159,11 @@ class Device
|
|
117
159
|
phisical_keys = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', "\017"]
|
118
160
|
change_keyboard
|
119
161
|
Device::Display.print_line("#{self.text}", params[:line], params[:column])
|
120
|
-
|
121
|
-
|
162
|
+
if params[:timeout_enabled]
|
163
|
+
time = Time.now + (params[:timeout] || Device::IO.timeout) / 1000
|
164
|
+
end
|
122
165
|
|
166
|
+
key = nil
|
123
167
|
while text_not_ready?(key)
|
124
168
|
line_x, line_y = getxy_stream(100)
|
125
169
|
|
@@ -127,8 +171,9 @@ class Device
|
|
127
171
|
touch_clear
|
128
172
|
key = parse(line_x, line_y, params)
|
129
173
|
else
|
130
|
-
|
131
|
-
|
174
|
+
if params[:timeout_enabled]
|
175
|
+
break(Device::IO::KEY_TIMEOUT) if Time.now > time
|
176
|
+
end
|
132
177
|
key = getc(100)
|
133
178
|
if phisical_keys.include?(key)
|
134
179
|
if key == Device::IO::BACK
|
@@ -161,7 +206,7 @@ class Device
|
|
161
206
|
|
162
207
|
def self.show_text(key, params)
|
163
208
|
case key[:char]
|
164
|
-
when :keyboard_uppercase, :keyboard_symbol_number, :keyboard_capital
|
209
|
+
when :keyboard_uppercase, :keyboard_symbol_number, :keyboard_symbol_number_2, :keyboard_capital
|
165
210
|
self.type = key[:char]
|
166
211
|
change_keyboard
|
167
212
|
when :erase
|
@@ -170,7 +215,9 @@ class Device
|
|
170
215
|
when :space
|
171
216
|
self.text += ' '
|
172
217
|
else
|
173
|
-
self.text
|
218
|
+
if self.text && self.text.size < 20
|
219
|
+
self.text << key[:char] unless key[:char] == :enter
|
220
|
+
end
|
174
221
|
end
|
175
222
|
Device::Display.print_line("#{self.text}", params[:line], params[:column])
|
176
223
|
end
|