extface 0.6.1 → 0.6.2
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 +4 -4
- data/app/models/extface/driver/daisy_fx1200.rb +5 -5
- data/app/models/extface/driver/datecs/dp35.rb +352 -0
- data/app/models/extface/driver/datecs/fp550.rb +3 -3
- data/lib/extface/version.rb +1 -1
- data/test/dummy/config/boot.rb +1 -1
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +87 -0
- data/test/fixtures/extface/devices.yml +7 -1
- data/test/fixtures/extface/drivers.yml +3 -0
- data/test/models/extface/driver/datecs/dp35_test.rb +63 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f16bc8f1e7ca869e7d047a48a537e929af5b4c47
|
4
|
+
data.tar.gz: 765d65dd09939aa371ed039e6b2a294a66f9de6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09bf70bedb4e4aece277206127ce886e52ff8e34d03a22b687fe1106392188ff869e2767a36f60737509a9e62d1c578260c14c22179db31e642efdc45b073a14'
|
7
|
+
data.tar.gz: 829d396c2765c2b7c4bd88dd552c895257da677599ee1a68a2c381f04f84725457ca4bd7dd5fae344d8517719ecb60cf60bccd70aa33aeb7a9e9a617de797755
|
@@ -209,7 +209,7 @@ module Extface
|
|
209
209
|
end
|
210
210
|
|
211
211
|
def build_packet(cmd, data = "")
|
212
|
-
|
212
|
+
"".b.tap() do |packet|
|
213
213
|
packet << STX
|
214
214
|
packet << 0x20 + 4 + data.length
|
215
215
|
packet << sequence_number
|
@@ -294,17 +294,17 @@ module Extface
|
|
294
294
|
|
295
295
|
private
|
296
296
|
def build_sale_data(item)
|
297
|
-
encoded_text1 = device.encoding.present? ? item.text1.encode(device.encoding) : item.text1
|
297
|
+
encoded_text1 = device.encoding.present? ? item.text1.encode(device.encoding).b : item.text1
|
298
298
|
encoded_text1 = encoded_text1.mb_chars.limit(27).to_s + '...' if encoded_text1 && encoded_text1.b.length > 30
|
299
299
|
|
300
|
-
encoded_text2 = device.encoding.present? ? item.text2.encode(device.encoding) : item.text2
|
300
|
+
encoded_text2 = device.encoding.present? ? item.text2.encode(device.encoding).b : item.text2
|
301
301
|
encoded_text2 = encoded_text1.mb_chars.limit(27).to_s + '...' if encoded_text2 && encoded_text2.b.length > 30
|
302
302
|
|
303
|
-
"".tap() do |data|
|
303
|
+
"".b.tap() do |data|
|
304
304
|
data << encoded_text1 unless encoded_text1.blank?
|
305
305
|
data << "\x0a#{encoded_text2}" unless encoded_text2.blank?
|
306
306
|
data << "\t"
|
307
|
-
data << TAX_GROUPS_MAP[item.tax_group || 2]
|
307
|
+
data << TAX_GROUPS_MAP[item.tax_group || 2].b
|
308
308
|
data << ("%.2f" % item.price)
|
309
309
|
data << "*#{item.qty.to_s}" unless item.qty.blank?
|
310
310
|
data << ",#{item.percent}" unless item.percent.blank?
|
@@ -0,0 +1,352 @@
|
|
1
|
+
module Extface
|
2
|
+
class Driver::Datecs::Dp35 < Extface::Driver::Base::Fiscal
|
3
|
+
NAME = 'Datecs DP35'.freeze
|
4
|
+
|
5
|
+
RESPONSE_TIMEOUT = 3 #seconds
|
6
|
+
INVALID_FRAME_RETRIES = 6 #count (bad length, bad checksum)
|
7
|
+
ACKS_MAX_WAIT = 60 #count / nothing is forever
|
8
|
+
NAKS_MAX_COUNT = 3 #count
|
9
|
+
BAD_SEQ_MAX_COUNT = 3
|
10
|
+
NO_RESP_MAX_COUNT = 3
|
11
|
+
|
12
|
+
TAX_GROUPS_MAP = {
|
13
|
+
1 => "\xc0",
|
14
|
+
2 => "\xc1",
|
15
|
+
3 => "\xc2",
|
16
|
+
4 => "\xc3",
|
17
|
+
5 => "\xc4",
|
18
|
+
6 => "\xc5",
|
19
|
+
7 => "\xc6",
|
20
|
+
8 => "\xc7"
|
21
|
+
}
|
22
|
+
|
23
|
+
PAYMENT_TYPE_MAP = {
|
24
|
+
1 => "P",
|
25
|
+
2 => "N",
|
26
|
+
3 => "C",
|
27
|
+
4 => "D",
|
28
|
+
5 => "B"
|
29
|
+
}
|
30
|
+
|
31
|
+
include Extface::Driver::Datecs::CommandsV1
|
32
|
+
|
33
|
+
def handle(buffer)
|
34
|
+
#if i = buffer.index(/[\x03\x16\x15]/) # find position of frame possible delimiter
|
35
|
+
if i = buffer.index("\x03") || buffer.index("\x16") || buffer.index("\x15")
|
36
|
+
rpush buffer[0..i] # this will make data available for #pull(timeout) method
|
37
|
+
return i+1 # return number of bytes processed
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
#tests
|
42
|
+
def non_fiscal_test
|
43
|
+
device.session("Non Fiscal Text") do |s|
|
44
|
+
s.notify "Printing Non Fiscal Text"
|
45
|
+
s.open_non_fiscal_doc
|
46
|
+
s.print "********************************"
|
47
|
+
s.print "Extface Print Test".center(32)
|
48
|
+
s.print "********************************"
|
49
|
+
s.fsend Printer::PAPER_MOVE, "1"
|
50
|
+
s.print "Driver: " + "#{self.class::NAME}".truncate(24)
|
51
|
+
s.close_non_fiscal_doc
|
52
|
+
s.notify "Printing finished"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def fiscal_test
|
57
|
+
sale_and_pay_items_session([
|
58
|
+
SaleItem.new( price: 0.01, text1: "Extface Test" )
|
59
|
+
])
|
60
|
+
end
|
61
|
+
|
62
|
+
#reports
|
63
|
+
def z_report_session
|
64
|
+
device.session("Z Report") do |s|
|
65
|
+
s.notify "Z Report Start"
|
66
|
+
s.fsend Closure::DAY_FIN_REPORT, "0"
|
67
|
+
s.notify "Z Report End"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def x_report_session
|
72
|
+
device.session("X Report") do |s|
|
73
|
+
s.notify "X Report Start"
|
74
|
+
s.fsend Closure::DAY_FIN_REPORT, "2"
|
75
|
+
s.notify "X Report End"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def period_report_session(from, to, detailed = true)
|
80
|
+
device.session("Period Report #{ '(detailed)' if detailed }") do |s|
|
81
|
+
s.notify "Period Report Start #{ '(detailed)' if detailed }"
|
82
|
+
s.fsend detailed ? Reports::REPORT_FP_BY_DATE : Reports::COMPACT_REPORT_FP_BY_DATE, "#{from.strftime('%d%m%y')},#{to.strftime('%d%m%y')}"
|
83
|
+
s.notify "Period Report End"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
#print
|
88
|
+
def open_non_fiscal_doc
|
89
|
+
fsend Sales::START_NON_FISCAL_DOC
|
90
|
+
@print_session = true
|
91
|
+
end
|
92
|
+
|
93
|
+
def print(text) #up to 38 sybols, TODO check
|
94
|
+
raise "Not in print session" unless @print_session
|
95
|
+
fsend Sales::PRINT_NON_FISCAL_TEXT, text
|
96
|
+
end
|
97
|
+
|
98
|
+
def close_non_fiscal_doc
|
99
|
+
fsend Sales::END_NON_FISCAL_DOC
|
100
|
+
@print_session = false
|
101
|
+
end
|
102
|
+
|
103
|
+
def check_status
|
104
|
+
flush #clear receive buffer
|
105
|
+
fsend(Info::GET_STATUS, 'X') # get 6 bytes status
|
106
|
+
errors.empty?
|
107
|
+
end
|
108
|
+
|
109
|
+
#fiscal
|
110
|
+
def open_fiscal_doc(operator = "1", password = "0000")
|
111
|
+
fsend Sales::START_FISCAL_DOC, "#{operator.presence || "1"},#{password.presence || "0000"},1"
|
112
|
+
@fiscal_session = true
|
113
|
+
end
|
114
|
+
|
115
|
+
def close_fiscal_doc
|
116
|
+
raise "Not in fiscal session" unless @fiscal_session
|
117
|
+
fsend Sales::END_FISCAL_DOC
|
118
|
+
@fiscal_session = false
|
119
|
+
end
|
120
|
+
|
121
|
+
def add_sale(sale_item)
|
122
|
+
raise "Not in fiscal session" unless @fiscal_session
|
123
|
+
fsend Sales::SALE_AND_SHOW, build_sale_data(sale_item)
|
124
|
+
end
|
125
|
+
|
126
|
+
def add_comment(text)
|
127
|
+
raise "Not in fiscal session" unless @fiscal_session
|
128
|
+
end
|
129
|
+
|
130
|
+
def add_payment(value = nil, type_num = nil)
|
131
|
+
raise "Not in fiscal session" unless @fiscal_session
|
132
|
+
payment_data = "".tap() do |data|
|
133
|
+
data << "\t"
|
134
|
+
data << PAYMENT_TYPE_MAP[type_num || 1]
|
135
|
+
data << ("%.2f" % value) unless value.blank?
|
136
|
+
end
|
137
|
+
fsend(Sales::TOTAL, payment_data)
|
138
|
+
end
|
139
|
+
|
140
|
+
def total_payment
|
141
|
+
raise "Not in fiscal session" unless @fiscal_session
|
142
|
+
fsend(Sales::TOTAL, "\t")
|
143
|
+
end
|
144
|
+
|
145
|
+
#basket
|
146
|
+
def sale_and_pay_items_session(items = [], operator = "1", password = "0000")
|
147
|
+
device.session("Fiscal Doc") do |s|
|
148
|
+
s.notify "Fiscal Doc Start"
|
149
|
+
s.open_fiscal_doc
|
150
|
+
s.notify "Register Sale"
|
151
|
+
items.each do |item|
|
152
|
+
s.add_sale(item)
|
153
|
+
end
|
154
|
+
s.notify "Register Payment"
|
155
|
+
s.total_payment
|
156
|
+
s.notify "Close Fiscal Receipt"
|
157
|
+
s.close_fiscal_doc
|
158
|
+
s.notify "Fiscal Doc End"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def cancel_doc_session
|
163
|
+
device.session("Doc cancel") do |s|
|
164
|
+
s.notify "Doc Cancel Start"
|
165
|
+
s.fsend Sales::CANCEL_FISCAL_DOC
|
166
|
+
s.paper_cut
|
167
|
+
s.notify "Doc Cancel End"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
#common
|
172
|
+
def fsend(cmd, data = "") #return data or nil
|
173
|
+
packet_data = build_packet(cmd, data) #store packet to be able to re-transmit it with the same sequence number
|
174
|
+
result = false
|
175
|
+
invalid_frames = 0 #counter for bad responses
|
176
|
+
nak_messages = 0 #counter for rejected packets (should re-transmit the packet)
|
177
|
+
no_resp = 0
|
178
|
+
flush #prevent double packet response issue like daisy driver
|
179
|
+
push packet_data #send packet
|
180
|
+
ACKS_MAX_WAIT.times do |retries|
|
181
|
+
errors.clear
|
182
|
+
if resp = frecv(RESPONSE_TIMEOUT)
|
183
|
+
if resp.valid?
|
184
|
+
human_status_errors(resp.status)
|
185
|
+
if errors.empty?
|
186
|
+
result = resp.data
|
187
|
+
break
|
188
|
+
else
|
189
|
+
raise errors.full_messages.join(',')
|
190
|
+
end
|
191
|
+
else #ack, nak or bad
|
192
|
+
if resp.nak?
|
193
|
+
nak_messages += 1
|
194
|
+
if nak_messages > NAKS_MAX_COUNT
|
195
|
+
errors.add :base, "#{NAKS_MAX_COUNT} NAKs Received. Abort!"
|
196
|
+
break
|
197
|
+
end
|
198
|
+
elsif !resp.ack?
|
199
|
+
invalid_frames += 1
|
200
|
+
if invalid_frames > INVALID_FRAME_RETRIES
|
201
|
+
errors.add :base, "#{INVALID_FRAME_RETRIES} Broken Packets Received. Abort!"
|
202
|
+
break
|
203
|
+
end
|
204
|
+
end
|
205
|
+
push packet_data unless resp.ack?
|
206
|
+
end
|
207
|
+
else
|
208
|
+
no_resp += 1
|
209
|
+
if no_resp > NO_RESP_MAX_COUNT
|
210
|
+
p "No reply in #{NO_RESP_MAX_COUNT * RESPONSE_TIMEOUT} seconds. Abort!"
|
211
|
+
errors.add :base, "No reply in #{NO_RESP_MAX_COUNT * RESPONSE_TIMEOUT} seconds. Abort!"
|
212
|
+
return result
|
213
|
+
end
|
214
|
+
end
|
215
|
+
errors.add :base, "#{ACKS_MAX_WAIT} ACKs Received. Abort!"
|
216
|
+
end
|
217
|
+
return result
|
218
|
+
end
|
219
|
+
|
220
|
+
def frecv(timeout) # return Frame or nil
|
221
|
+
rframe = nil
|
222
|
+
BAD_SEQ_MAX_COUNT.times do
|
223
|
+
errors.clear
|
224
|
+
if frame_bytes = pull(timeout)
|
225
|
+
rframe = Frame.new(frame_bytes.b)
|
226
|
+
if rframe.seq.nil? || rframe.seq.ord == sequence_number(false) #accept only current sequence number as reply
|
227
|
+
break
|
228
|
+
else
|
229
|
+
errors.add :base, "Sequence mismatch"
|
230
|
+
p "Invalid sequence (expected: #{sequence_number(false).to_s(16)}, got: #{rframe.seq.ord.to_s(16)})"
|
231
|
+
rframe = nil #invalidate mismatch sequence frame for the last retry
|
232
|
+
end
|
233
|
+
else
|
234
|
+
errors.add :base, "No data received from device"
|
235
|
+
break
|
236
|
+
end
|
237
|
+
end
|
238
|
+
return rframe
|
239
|
+
end
|
240
|
+
|
241
|
+
def build_packet(cmd, data = "")
|
242
|
+
"".b.tap() do |packet|
|
243
|
+
packet << STX #Preamble. 1 byte long. Value: 01H.
|
244
|
+
packet << 0x20 + 4 + data.b.length #Number of bytes from <01> preamble (excluded) to <05> (included) plus the fixed offset of 20H
|
245
|
+
packet << sequence_number #Sequence number of the frame. Length : 1 byte. Value: 20H – FFH.
|
246
|
+
packet << cmd #Length: 1 byte. Value: 20H - 7FH.
|
247
|
+
packet << data.b #Length: 0 - 218 bytes for Host to printer
|
248
|
+
packet << PA1 #Post-amble. Length: 1 byte. Value: 05H.
|
249
|
+
packet << Frame.bcc(packet[1..-1])#Control sum (0000H-FFFFH). Length: 4 bytes. Value of each byte: 30H-3FH
|
250
|
+
packet << ETX #Terminator. Length: 1 byte. Value: 03H.
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def paper_cut
|
255
|
+
device.session('Paper Cut') do |s|
|
256
|
+
s.push build_packet(Printer::PAPER_CUT)
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def human_status_errors(status) #6 bytes status
|
261
|
+
status_0 = status[0].ord
|
262
|
+
errors.add :base, "Fiscal Device General Error" unless (status_0 & 0x20).zero?
|
263
|
+
errors.add :base, "Invalid Command" unless (status_0 & 0x02).zero?
|
264
|
+
errors.add :base, "Date & Time Not Set" unless (status_0 & 0x04).zero?
|
265
|
+
errors.add :base, "Syntax Error" unless (status_0 & 0x01).zero?
|
266
|
+
status_1 = status[1].ord
|
267
|
+
errors.add :base, "Unpermitted Command In This Mode" unless (status_1 & 0x02).zero?
|
268
|
+
errors.add :base, "Field Overflow" unless (status_1 & 0x01).zero?
|
269
|
+
end
|
270
|
+
|
271
|
+
private
|
272
|
+
def build_sale_data(item)
|
273
|
+
"".b.tap() do |data|
|
274
|
+
data << item.text1.truncate(30) unless item.text1.blank?
|
275
|
+
data << "\x0a#{text2}" unless item.text2.blank?
|
276
|
+
data << "\t"
|
277
|
+
data << TAX_GROUPS_MAP[item.tax_group || 2]
|
278
|
+
data << ("%.2f" % item.price)
|
279
|
+
data << "*#{item.qty.to_s}" unless item.qty.blank?
|
280
|
+
data << ",#{item.percent}" unless item.percent.blank?
|
281
|
+
data << ",;#{'%.2f' % item.neto}" unless item.neto.blank?
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
def sequence_number(increment = true)
|
286
|
+
@seq ||= 0x1f
|
287
|
+
@seq += 1 if increment
|
288
|
+
@seq = 0x1f if @seq == 0x7f
|
289
|
+
@seq
|
290
|
+
end
|
291
|
+
|
292
|
+
class Frame
|
293
|
+
include ActiveModel::Validations
|
294
|
+
attr_reader :frame, :len, :seq, :cmd, :data, :status, :bcc
|
295
|
+
|
296
|
+
validates_presence_of :frame#, unless: :unpacked?
|
297
|
+
validate :bcc_validation
|
298
|
+
validate :len_validation
|
299
|
+
|
300
|
+
def initialize(buffer)
|
301
|
+
if match = buffer.match(/\x01(.{1})(.{1})(.{1})(.*)\x04(.{6})\x05(.{4})\x03/nm)
|
302
|
+
@frame = match.to_a.first
|
303
|
+
@len, @seq, @cmd, @data, @status, @bcc = match.captures
|
304
|
+
else
|
305
|
+
if buffer[/^\x16+$/] # only ACKs
|
306
|
+
@ack = true
|
307
|
+
elsif buffer.index("\x15")
|
308
|
+
@nak = true
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
def ack?; !!@ack; end #should wait, response is yet to come
|
314
|
+
|
315
|
+
def nak?; !!@nak; end #should retry command with same seq
|
316
|
+
|
317
|
+
private
|
318
|
+
|
319
|
+
def unpacked? # is it packed or unpacked message?
|
320
|
+
@ack || @nak
|
321
|
+
end
|
322
|
+
|
323
|
+
def bcc_validation
|
324
|
+
unless unpacked? || frame.blank?
|
325
|
+
calc_bcc = self.class.bcc frame[1..-6]
|
326
|
+
errors.add(:bcc, I18n.t('errors.messages.invalid')) if bcc != calc_bcc
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def len_validation
|
331
|
+
unless unpacked? || frame.blank?
|
332
|
+
errors.add(:len, I18n.t('errors.messages.invalid')) if frame.nil? || len.ord != (frame[1..-6].length + 0x20)
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
class << self
|
337
|
+
def bcc(buffer)
|
338
|
+
sum = 0
|
339
|
+
buffer.each_byte do |byte|
|
340
|
+
sum += byte
|
341
|
+
end
|
342
|
+
"".tap() do |bcc|
|
343
|
+
4.times do |halfbyte|
|
344
|
+
bcc.insert 0, (0x30 + ((sum >> (halfbyte*4)) & 0x0f)).chr
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
end
|
352
|
+
end
|
@@ -269,17 +269,17 @@ module Extface
|
|
269
269
|
end
|
270
270
|
|
271
271
|
def build_sale_data(item)
|
272
|
-
encoded_text1 = device.encoding.present? ? item.text1.encode(device.encoding) : item.text1
|
272
|
+
encoded_text1 = device.encoding.present? ? item.text1.encode(device.encoding).b : item.text1
|
273
273
|
encoded_text1 = encoded_text1.mb_chars.limit(27).to_s + '...' if encoded_text1 && encoded_text1.b.length > 30
|
274
274
|
|
275
|
-
encoded_text2 = device.encoding.present? ? item.text2.encode(device.encoding) : item.text2
|
275
|
+
encoded_text2 = device.encoding.present? ? item.text2.encode(device.encoding).b : item.text2
|
276
276
|
encoded_text2 = encoded_text1.mb_chars.limit(27).to_s + '...' if encoded_text2 && encoded_text2.b.length > 30
|
277
277
|
|
278
278
|
"".b.tap() do |data|
|
279
279
|
data << encoded_text1 unless encoded_text1.blank?
|
280
280
|
data << "\x0a#{encoded_text2}" unless encoded_text2.blank?
|
281
281
|
data << "\t"
|
282
|
-
data << TAX_GROUPS_MAP[item.tax_group || 2]
|
282
|
+
data << TAX_GROUPS_MAP[item.tax_group || 2].b
|
283
283
|
data << ("%.2f" % item.price)
|
284
284
|
data << "*#{item.qty.to_s}" unless item.qty.blank?
|
285
285
|
data << ",#{item.percent}" unless item.percent.blank?
|
data/lib/extface/version.rb
CHANGED
data/test/dummy/config/boot.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Set up gems listed in the Gemfile.
|
2
2
|
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
|
3
3
|
|
4
|
-
require 'bundler/setup' if File.
|
4
|
+
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
5
5
|
$LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
|
data/test/dummy/db/test.sqlite3
CHANGED
Binary file
|
data/test/dummy/log/test.log
CHANGED
@@ -18642,3 +18642,90 @@ Extface::Driver::Posiflex::Aura80Test: test_status
|
|
18642
18642
|
[1m[36mExtface::Job Load (0.5ms)[0m [1mSELECT "extface_jobs".* FROM "extface_jobs" WHERE "extface_jobs"."device_id" = ?[0m [["device_id", 1033518405]]
|
18643
18643
|
[1m[35mExtface::Job Load (0.5ms)[0m SELECT "extface_jobs".* FROM "extface_jobs" WHERE "extface_jobs"."device_id" = ? AND ("extface_jobs"."completed_at" IS NULL AND "extface_jobs"."failed_at" IS NULL AND "extface_jobs"."started_at" IS NOT NULL) ORDER BY "extface_jobs"."id" ASC LIMIT 1 [["device_id", 1033518405]]
|
18644
18644
|
Completed 200 OK in 10004ms (ActiveRecord: 3.2ms)
|
18645
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18646
|
+
[1m[35m (133.3ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_devices"[0m
|
18647
|
+
[1m[35m (0.3ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
18648
|
+
[1m[35m (113.7ms)[0m [1m[35mCREATE TABLE "extface_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar, "name" varchar, "extfaceable_id" integer, "extfaceable_type" varchar, "driver_id" integer, "created_at" datetime, "updated_at" datetime, "encoding" varchar)[0m
|
18649
|
+
[1m[35m (120.4ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_drivers"[0m
|
18650
|
+
[1m[35m (155.6ms)[0m [1m[35mCREATE TABLE "extface_drivers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar, "settings" text, "created_at" datetime, "updated_at" datetime)[0m
|
18651
|
+
[1m[35m (167.1ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_jobs"[0m
|
18652
|
+
[1m[35m (164.0ms)[0m [1m[35mCREATE TABLE "extface_jobs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer, "created_at" datetime, "updated_at" datetime, "description" varchar, "error" varchar, "failed_at" datetime, "completed_at" datetime, "connected_at" datetime, "started_at" datetime)[0m
|
18653
|
+
[1m[35m (229.0ms)[0m [1m[35mCREATE INDEX "index_extface_jobs_on_device_id" ON "extface_jobs" ("device_id")[0m
|
18654
|
+
[1m[35m (172.1ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_serial_configs"[0m
|
18655
|
+
[1m[35m (189.0ms)[0m [1m[35mCREATE TABLE "extface_serial_configs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "driver_id" integer, "serial_boud_rate" integer, "serial_data_length" integer, "serial_parity_check" integer, "serial_stop_bits" integer, "serial_handshake" integer, "created_at" datetime, "updated_at" datetime)[0m
|
18656
|
+
[1m[35m (226.9ms)[0m [1m[35mDROP TABLE IF EXISTS "shops"[0m
|
18657
|
+
[1m[35m (125.9ms)[0m [1m[35mCREATE TABLE "shops" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime, "updated_at" datetime)[0m
|
18658
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18659
|
+
[1m[35m (186.3ms)[0m [1m[35mCREATE TABLE "ar_internal_metadata" ("key" varchar NOT NULL PRIMARY KEY, "value" varchar, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL)[0m
|
18660
|
+
[1m[36mActiveRecord::InternalMetadata Load (0.2ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? LIMIT ?[0m [["key", "environment"], ["LIMIT", 1]]
|
18661
|
+
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
|
18662
|
+
[1m[35mSQL (0.3ms)[0m [1m[32mINSERT INTO "ar_internal_metadata" ("key", "value", "created_at", "updated_at") VALUES (?, ?, ?, ?)[0m [["key", "environment"], ["value", "test"], ["created_at", "2017-11-18 00:22:16.699389"], ["updated_at", "2017-11-18 00:22:16.699389"]]
|
18663
|
+
[1m[35m (131.6ms)[0m [1m[36mcommit transaction[0m
|
18664
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18665
|
+
[1m[35m (3845.4ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_devices"[0m
|
18666
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
18667
|
+
[1m[35m (103.2ms)[0m [1m[35mCREATE TABLE "extface_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar, "name" varchar, "extfaceable_id" integer, "extfaceable_type" varchar, "driver_id" integer, "created_at" datetime, "updated_at" datetime, "encoding" varchar)[0m
|
18668
|
+
[1m[35m (101.1ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_drivers"[0m
|
18669
|
+
[1m[35m (350.0ms)[0m [1m[35mCREATE TABLE "extface_drivers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar, "settings" text, "created_at" datetime, "updated_at" datetime)[0m
|
18670
|
+
[1m[35m (109.6ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_jobs"[0m
|
18671
|
+
[1m[35m (131.3ms)[0m [1m[35mCREATE TABLE "extface_jobs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer, "created_at" datetime, "updated_at" datetime, "description" varchar, "error" varchar, "failed_at" datetime, "completed_at" datetime, "connected_at" datetime, "started_at" datetime)[0m
|
18672
|
+
[1m[35m (121.4ms)[0m [1m[35mCREATE INDEX "index_extface_jobs_on_device_id" ON "extface_jobs" ("device_id")[0m
|
18673
|
+
[1m[35m (147.7ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_serial_configs"[0m
|
18674
|
+
[1m[35m (131.3ms)[0m [1m[35mCREATE TABLE "extface_serial_configs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "driver_id" integer, "serial_boud_rate" integer, "serial_data_length" integer, "serial_parity_check" integer, "serial_stop_bits" integer, "serial_handshake" integer, "created_at" datetime, "updated_at" datetime)[0m
|
18675
|
+
[1m[35m (122.9ms)[0m [1m[35mDROP TABLE IF EXISTS "shops"[0m
|
18676
|
+
[1m[35m (111.8ms)[0m [1m[35mCREATE TABLE "shops" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime, "updated_at" datetime)[0m
|
18677
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18678
|
+
[1m[36mActiveRecord::InternalMetadata Load (0.3ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? LIMIT ?[0m [["key", "environment"], ["LIMIT", 1]]
|
18679
|
+
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
|
18680
|
+
[1m[35m (0.1ms)[0m [1m[36mcommit transaction[0m
|
18681
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18682
|
+
[1m[35m (216.0ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_devices"[0m
|
18683
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
18684
|
+
[1m[35m (130.7ms)[0m [1m[35mCREATE TABLE "extface_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar, "name" varchar, "extfaceable_id" integer, "extfaceable_type" varchar, "driver_id" integer, "created_at" datetime, "updated_at" datetime, "encoding" varchar)[0m
|
18685
|
+
[1m[35m (188.6ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_drivers"[0m
|
18686
|
+
[1m[35m (114.4ms)[0m [1m[35mCREATE TABLE "extface_drivers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar, "settings" text, "created_at" datetime, "updated_at" datetime)[0m
|
18687
|
+
[1m[35m (105.4ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_jobs"[0m
|
18688
|
+
[1m[35m (114.1ms)[0m [1m[35mCREATE TABLE "extface_jobs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer, "created_at" datetime, "updated_at" datetime, "description" varchar, "error" varchar, "failed_at" datetime, "completed_at" datetime, "connected_at" datetime, "started_at" datetime)[0m
|
18689
|
+
[1m[35m (180.5ms)[0m [1m[35mCREATE INDEX "index_extface_jobs_on_device_id" ON "extface_jobs" ("device_id")[0m
|
18690
|
+
[1m[35m (114.7ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_serial_configs"[0m
|
18691
|
+
[1m[35m (105.8ms)[0m [1m[35mCREATE TABLE "extface_serial_configs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "driver_id" integer, "serial_boud_rate" integer, "serial_data_length" integer, "serial_parity_check" integer, "serial_stop_bits" integer, "serial_handshake" integer, "created_at" datetime, "updated_at" datetime)[0m
|
18692
|
+
[1m[35m (98.4ms)[0m [1m[35mDROP TABLE IF EXISTS "shops"[0m
|
18693
|
+
[1m[35m (106.6ms)[0m [1m[35mCREATE TABLE "shops" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime, "updated_at" datetime)[0m
|
18694
|
+
[1m[35m (0.3ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18695
|
+
[1m[36mActiveRecord::InternalMetadata Load (0.2ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? LIMIT ?[0m [["key", "environment"], ["LIMIT", 1]]
|
18696
|
+
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
|
18697
|
+
[1m[35m (0.1ms)[0m [1m[36mcommit transaction[0m
|
18698
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18699
|
+
[1m[35m (126.0ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_devices"[0m
|
18700
|
+
[1m[35m (0.3ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
18701
|
+
[1m[35m (102.4ms)[0m [1m[35mCREATE TABLE "extface_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar, "name" varchar, "extfaceable_id" integer, "extfaceable_type" varchar, "driver_id" integer, "created_at" datetime, "updated_at" datetime, "encoding" varchar)[0m
|
18702
|
+
[1m[35m (97.6ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_drivers"[0m
|
18703
|
+
[1m[35m (89.5ms)[0m [1m[35mCREATE TABLE "extface_drivers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar, "settings" text, "created_at" datetime, "updated_at" datetime)[0m
|
18704
|
+
[1m[35m (101.6ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_jobs"[0m
|
18705
|
+
[1m[35m (94.9ms)[0m [1m[35mCREATE TABLE "extface_jobs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer, "created_at" datetime, "updated_at" datetime, "description" varchar, "error" varchar, "failed_at" datetime, "completed_at" datetime, "connected_at" datetime, "started_at" datetime)[0m
|
18706
|
+
[1m[35m (97.3ms)[0m [1m[35mCREATE INDEX "index_extface_jobs_on_device_id" ON "extface_jobs" ("device_id")[0m
|
18707
|
+
[1m[35m (108.5ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_serial_configs"[0m
|
18708
|
+
[1m[35m (103.7ms)[0m [1m[35mCREATE TABLE "extface_serial_configs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "driver_id" integer, "serial_boud_rate" integer, "serial_data_length" integer, "serial_parity_check" integer, "serial_stop_bits" integer, "serial_handshake" integer, "created_at" datetime, "updated_at" datetime)[0m
|
18709
|
+
[1m[35m (93.4ms)[0m [1m[35mDROP TABLE IF EXISTS "shops"[0m
|
18710
|
+
[1m[35m (106.4ms)[0m [1m[35mCREATE TABLE "shops" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime, "updated_at" datetime)[0m
|
18711
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18712
|
+
[1m[36mActiveRecord::InternalMetadata Load (0.2ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? LIMIT ?[0m [["key", "environment"], ["LIMIT", 1]]
|
18713
|
+
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
|
18714
|
+
[1m[35m (0.0ms)[0m [1m[36mcommit transaction[0m
|
18715
|
+
[1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18716
|
+
[1m[35m (70.7ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_devices"[0m
|
18717
|
+
[1m[35m (0.3ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
18718
|
+
[1m[35m (63.7ms)[0m [1m[35mCREATE TABLE "extface_devices" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "uuid" varchar, "name" varchar, "extfaceable_id" integer, "extfaceable_type" varchar, "driver_id" integer, "created_at" datetime, "updated_at" datetime, "encoding" varchar)[0m
|
18719
|
+
[1m[35m (70.9ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_drivers"[0m
|
18720
|
+
[1m[35m (65.5ms)[0m [1m[35mCREATE TABLE "extface_drivers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar, "settings" text, "created_at" datetime, "updated_at" datetime)[0m
|
18721
|
+
[1m[35m (60.4ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_jobs"[0m
|
18722
|
+
[1m[35m (73.0ms)[0m [1m[35mCREATE TABLE "extface_jobs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "device_id" integer, "created_at" datetime, "updated_at" datetime, "description" varchar, "error" varchar, "failed_at" datetime, "completed_at" datetime, "connected_at" datetime, "started_at" datetime)[0m
|
18723
|
+
[1m[35m (72.2ms)[0m [1m[35mCREATE INDEX "index_extface_jobs_on_device_id" ON "extface_jobs" ("device_id")[0m
|
18724
|
+
[1m[35m (73.2ms)[0m [1m[35mDROP TABLE IF EXISTS "extface_serial_configs"[0m
|
18725
|
+
[1m[35m (73.1ms)[0m [1m[35mCREATE TABLE "extface_serial_configs" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "driver_id" integer, "serial_boud_rate" integer, "serial_data_length" integer, "serial_parity_check" integer, "serial_stop_bits" integer, "serial_handshake" integer, "created_at" datetime, "updated_at" datetime)[0m
|
18726
|
+
[1m[35m (64.6ms)[0m [1m[35mDROP TABLE IF EXISTS "shops"[0m
|
18727
|
+
[1m[35m (65.5ms)[0m [1m[35mCREATE TABLE "shops" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "created_at" datetime, "updated_at" datetime)[0m
|
18728
|
+
[1m[35m (0.1ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m
|
18729
|
+
[1m[36mActiveRecord::InternalMetadata Load (0.1ms)[0m [1m[34mSELECT "ar_internal_metadata".* FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = ? LIMIT ?[0m [["key", "environment"], ["LIMIT", 1]]
|
18730
|
+
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
|
18731
|
+
[1m[35m (0.1ms)[0m [1m[36mcommit transaction[0m
|
@@ -23,7 +23,13 @@ datecs_dp25:
|
|
23
23
|
name: Datect DP25
|
24
24
|
extfaceable: one(Shop)
|
25
25
|
driver: datecs_dp25
|
26
|
-
|
26
|
+
|
27
|
+
datecs_dp35:
|
28
|
+
uuid: datecs_dp35
|
29
|
+
name: Datect DP35
|
30
|
+
extfaceable: one(Shop)
|
31
|
+
driver: datecs_dp35
|
32
|
+
|
27
33
|
daisy_fx1200:
|
28
34
|
uuid: daisy_fx1200
|
29
35
|
name: Daisy Fx1200
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module Extface
|
4
|
+
class Driver::Datecs::Dp35Test < ActiveSupport::TestCase
|
5
|
+
setup do
|
6
|
+
@driver = extface_drivers(:datecs_dp35)
|
7
|
+
@driver.flush # clear receive buffer
|
8
|
+
end
|
9
|
+
|
10
|
+
test "handle" do
|
11
|
+
assert_equal nil, @driver.handle('bad packet')
|
12
|
+
assert_equal 6, @driver.handle("\x01data\x03data"), "Frame not match"
|
13
|
+
assert_equal 9, @driver.handle("pre\x01data\x03data"), "Frame with preamble not match"
|
14
|
+
assert_equal 8, @driver.handle("\x16\x16\x01data\x03data"), "Frame with ACK preamble not match"
|
15
|
+
assert_equal 4, @driver.handle("pre\x15"), "NAK not match"
|
16
|
+
end
|
17
|
+
|
18
|
+
test "build packet" do
|
19
|
+
assert_equal "\x01\x24\x20\x4a\x05\x30\x30\x39\x33\x03".b, @driver.build_packet(0x4a), "packet without data"
|
20
|
+
assert_equal "\x01\x25\x21\x4a\x58\x05\x30\x30\x3e\x3d\x03".b, @driver.build_packet(0x4a, 'X'), "packet with data"
|
21
|
+
end
|
22
|
+
|
23
|
+
test "response frame" do
|
24
|
+
frame_class = @driver.class::Frame
|
25
|
+
assert frame_class.new("\x15").nak?, "NAK message failed"
|
26
|
+
assert frame_class.new("\x16\x16").ack?, "ACK message failed"
|
27
|
+
assert_nothing_raised do
|
28
|
+
assert_equal false, frame_class.new("bad data\x01\x25\x21\x4asome broken packet\x58\x05\x30\x30\x3e\x3d\x03".b).valid?
|
29
|
+
end
|
30
|
+
frame = frame_class.new("\x16\x01\x2C\x2F\x2D\x50\x04\x88\x80\xC0\x80\x80\xB0\x05\x30\x34\x35\x39\x03".b)
|
31
|
+
assert frame.valid?, "Vailid frame not recognized"
|
32
|
+
assert_equal "\x01\x2C\x2F\x2D\x50\x04\x88\x80\xC0\x80\x80\xB0\x05\x30\x34\x35\x39\x03".b, frame.frame
|
33
|
+
assert_equal "\x2c".b, frame.len
|
34
|
+
assert_equal "\x2f".b, frame.seq
|
35
|
+
assert_equal "\x2d".b, frame.cmd
|
36
|
+
assert_equal "\x50".b, frame.data
|
37
|
+
assert_equal "\x88\x80\xC0\x80\x80\xB0".b, frame.status
|
38
|
+
assert_equal "\x30\x34\x35\x39".b, frame.bcc
|
39
|
+
#bad check sum
|
40
|
+
frame = frame_class.new("\x01\x2C\x2F\x2D\x50\x04\x88\x80\xC0\x80\x80\xB0\x05\x30\x34\x35\x38\x03".b)
|
41
|
+
assert_equal false, frame.valid?
|
42
|
+
assert frame.errors.messages[:bcc]
|
43
|
+
#bad length
|
44
|
+
frame = frame_class.new("\x01\x2b\x2F\x2D\x50\x04\x88\x80\xC0\x80\x80\xB0\x05\x30\x34\x35\x38\x03".b)
|
45
|
+
assert_equal false, frame.valid?
|
46
|
+
assert frame.errors.messages[:len]
|
47
|
+
end
|
48
|
+
|
49
|
+
test "fsend" do
|
50
|
+
job = extface_jobs(:one)
|
51
|
+
job_thread = Thread.new do
|
52
|
+
@driver.set_job(job)
|
53
|
+
result = @driver.fsend(0x2C) # paper move command
|
54
|
+
end
|
55
|
+
simulate_device_pull(job)
|
56
|
+
@driver.handle("\x01\x31\x20\x4A\x88\x80\xC0\x80\x80\xB8\x04\x88\x80\xC0\x80\x80\xB8\x05\x30\x37\x3A\x34\x03".b)
|
57
|
+
simulate_device_pull(job)
|
58
|
+
@driver.handle("\x01\x38\x21\x30\x30\x30\x30\x30\x35\x30\x2C\x30\x30\x30\x30\x34\x39\x04\x80\x80\x88\x80\x80\xB8\x05\x30\x36\x35\x30\x03".b)
|
59
|
+
job_thread.join
|
60
|
+
assert @driver.errors.empty?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extface
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Vangelov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -105,6 +105,7 @@ files:
|
|
105
105
|
- app/models/extface/driver/daisy_fx1200.rb
|
106
106
|
- app/models/extface/driver/datecs/commands_v1.rb
|
107
107
|
- app/models/extface/driver/datecs/dp25.rb
|
108
|
+
- app/models/extface/driver/datecs/dp35.rb
|
108
109
|
- app/models/extface/driver/datecs/fp550.rb
|
109
110
|
- app/models/extface/driver/eltrade/commands_fp4.rb
|
110
111
|
- app/models/extface/driver/eltrade_tm_u220.rb
|
@@ -259,6 +260,7 @@ files:
|
|
259
260
|
- test/models/extface/device_test.rb
|
260
261
|
- test/models/extface/driver/daisy_fx1200_test.rb
|
261
262
|
- test/models/extface/driver/datecs/dp25_test.rb
|
263
|
+
- test/models/extface/driver/datecs/dp35_test.rb
|
262
264
|
- test/models/extface/driver/datecs/fp550_test.rb
|
263
265
|
- test/models/extface/driver/generic_pos_test.rb
|
264
266
|
- test/models/extface/driver/posiflex/aura80_test.rb
|
@@ -287,7 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
287
289
|
version: '0'
|
288
290
|
requirements: []
|
289
291
|
rubyforge_project:
|
290
|
-
rubygems_version: 2.
|
292
|
+
rubygems_version: 2.6.14
|
291
293
|
signing_key:
|
292
294
|
specification_version: 4
|
293
295
|
summary: External Interfaces for Cloud-Based Applications (Rails 4)
|
@@ -387,6 +389,7 @@ test_files:
|
|
387
389
|
- test/models/extface/driver/posiflex/aura80_test.rb
|
388
390
|
- test/models/extface/driver/daisy_fx1200_test.rb
|
389
391
|
- test/models/extface/driver/star_tsp200_test.rb
|
392
|
+
- test/models/extface/driver/datecs/dp35_test.rb
|
390
393
|
- test/models/extface/driver/datecs/fp550_test.rb
|
391
394
|
- test/models/extface/driver/datecs/dp25_test.rb
|
392
395
|
- test/models/extface/serial_config_test.rb
|