extface 0.5.9 → 0.6.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
  SHA1:
3
- metadata.gz: bfe76bc059c789a5646a9da7fc5b40a4a56c6e67
4
- data.tar.gz: 2cfadeb3180e60562574111190856e8e6a0e49d1
3
+ metadata.gz: cd1126c53dc93e2a74c7924b5f1d539a41a7c127
4
+ data.tar.gz: d9426f418c1464e4745f970d75f8b008fb3f1793
5
5
  SHA512:
6
- metadata.gz: 1fe34ae4dfccfe58dec45ab0c3a6194650fe01b446e32bf66ee6c7c7331957c35122065c27740685ca003c22dbb8d4220c8c97f911651b93ca81aab2a87a6809
7
- data.tar.gz: e7ecc09793575cc0f6ca1a121d8d2e0a3bc42b441ca78e05d96f0849726e078d938051298ffd5dec5929e4ecb8d70915ac3d0ed3a1c599c26fa9ca811384163f
6
+ metadata.gz: 09b1d1f4967722d9af90f14f6c892d769f788b7d1584c385d9ed0336f78bbdc4178127feded977132b7638d1d31c083104aecef5f31d614d57b4f2649081c77a
7
+ data.tar.gz: 0b353b388d3788f067cc2dd25467f6f3216de1274e8a0452982f22a658b410e9d1b9e105887d3885886042bb3a9f1a7b91b9ea54bae71b86ac0c4c38461d800a
@@ -0,0 +1,352 @@
1
+ module Extface
2
+ class Driver::Datecs::Dp25 < Extface::Driver::Base::Fiscal
3
+ NAME = 'Datecs DP25'.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 = "1")
111
+ fsend Sales::START_FISCAL_DOC, "#{operator.presence || "1"},#{password.presence || "1"},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 = "1")
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
@@ -241,10 +241,10 @@ module Extface
241
241
  def build_packet(cmd, data = "")
242
242
  "".b.tap() do |packet|
243
243
  packet << STX #Preamble. 1 byte long. Value: 01H.
244
- packet << 0x20 + 4 + data.length #Number of bytes from <01> preamble (excluded) to <05> (included) plus the fixed offset of 20H
244
+ packet << 0x20 + 4 + data.b.length #Number of bytes from <01> preamble (excluded) to <05> (included) plus the fixed offset of 20H
245
245
  packet << sequence_number #Sequence number of the frame. Length : 1 byte. Value: 20H – FFH.
246
246
  packet << cmd #Length: 1 byte. Value: 20H - 7FH.
247
- packet << data #Length: 0 - 218 bytes for Host to printer
247
+ packet << data.b #Length: 0 - 218 bytes for Host to printer
248
248
  packet << PA1 #Post-amble. Length: 1 byte. Value: 05H.
249
249
  packet << Frame.bcc(packet[1..-1])#Control sum (0000H-FFFFH). Length: 4 bytes. Value of each byte: 30H-3FH
250
250
  packet << ETX #Terminator. Length: 1 byte. Value: 03H.
@@ -270,8 +270,8 @@ module Extface
270
270
 
271
271
  private
272
272
  def build_sale_data(item)
273
- "".tap() do |data|
274
- data << item.text1 unless item.text1.blank?
273
+ "".b.tap() do |data|
274
+ data << item.text1.truncate(30) unless item.text1.blank?
275
275
  data << "\x0a#{text2}" unless item.text2.blank?
276
276
  data << "\t"
277
277
  data << TAX_GROUPS_MAP[item.tax_group || 2]
@@ -349,4 +349,4 @@ module Extface
349
349
  end
350
350
 
351
351
  end
352
- end
352
+ end
@@ -0,0 +1,12 @@
1
+
2
+ <%= button_to 'Paper Cut', fiscal_device_path(@device), remote: true, name: :paper_cut, value: true, class: 'btn btn-warning' %>
3
+
4
+ <%= button_to 'Non Fiscal Test', fiscal_device_path(@device), remote: true, name: :non_fiscal_test, value: true, class: 'btn btn-warning' %>
5
+
6
+ <%= button_to 'Fiscal Test', fiscal_device_path(@device), remote: true, name: :fiscal_test, value: true, class: 'btn btn-warning' %>
7
+
8
+ <%= button_to 'X Report', fiscal_device_path(@device), remote: true, name: :x_report, value: true, class: 'btn btn-warning' %>
9
+ <%= button_to 'Z Report', fiscal_device_path(@device), remote: true, name: :z_report, value: true, class: 'btn btn-warning' %>
10
+
11
+ <%= button_to 'Cancel Fiscal Doc', fiscal_device_path(@device), remote: true, name: :cancel_fiscal_doc, value: true, class: 'btn btn-danger' %>
12
+
@@ -1,3 +1,3 @@
1
1
  module Extface
2
- VERSION = "0.5.9"
2
+ VERSION = "0.6.0"
3
3
  end
Binary file
@@ -1,61 +1,11 @@
1
- # Logfile created on 2016-08-30 20:10:05 -0400 by logger.rb/44203
2
- D, [2016-08-30T20:10:05.445384 #10681] DEBUG -- : --> 1D 72 49
3
- D, [2016-08-30T20:10:43.555111 #10749] DEBUG -- : --> 1D 72 49
4
- D, [2016-08-30T20:12:21.189809 #10888] DEBUG -- : --> 1D 72 49
5
- D, [2016-08-30T20:12:47.637313 #10956] DEBUG -- : --> 1D 72 49
6
- D, [2016-08-30T20:13:03.193540 #11002] DEBUG -- : --> 1D 72 49
7
- D, [2016-08-30T20:13:04.239676 #11002] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
8
- D, [2016-08-30T20:13:14.243196 #11002] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
9
- D, [2016-08-30T20:13:44.485910 #11097] DEBUG -- : --> 1D 72 49
10
- D, [2016-08-30T20:13:47.566834 #11097] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
11
- D, [2016-08-30T20:13:57.568682 #11097] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
12
- D, [2016-08-30T20:14:16.703247 #11185] DEBUG -- : --> 1D 72 49
13
- D, [2016-08-30T20:15:06.313416 #11278] DEBUG -- : --> 1D 72 49
14
- D, [2016-08-30T20:17:07.375733 #11444] DEBUG -- : --> 1D 72 49
15
- D, [2016-08-30T20:17:24.647971 #11493] DEBUG -- : --> 1D 72 49
16
- D, [2016-08-30T20:18:37.464329 #11616] DEBUG -- : --> 1D 72 49
17
- D, [2016-08-30T20:19:20.679790 #11685] DEBUG -- : --> 1D 72 49
18
- D, [2016-08-30T20:21:02.922394 #11869] DEBUG -- : --> 1D 72 49
19
- D, [2016-08-30T20:21:32.495893 #11940] DEBUG -- : --> 1D 72 49
20
- D, [2016-08-30T20:22:00.172068 #11996] DEBUG -- : --> 1D 72 49
21
- D, [2016-08-30T20:22:30.752293 #12059] DEBUG -- : --> 1D 72 49
22
- D, [2016-08-30T20:23:11.439869 #12131] DEBUG -- : --> 1D 72 49
23
- D, [2016-08-30T20:25:12.466082 #12347] DEBUG -- : --> 1D 72 49
24
- D, [2016-08-30T20:25:13.544813 #12347] DEBUG -- : --> 1D 72 49
25
- D, [2016-08-30T20:25:36.772943 #12409] DEBUG -- : --> 1D 72 49
26
- D, [2016-08-30T20:25:37.826787 #12409] DEBUG -- : --> 1D 72 49
27
- D, [2016-08-30T20:26:08.174733 #12492] DEBUG -- : --> 1D 72 49
28
- D, [2016-08-30T20:26:09.309872 #12492] DEBUG -- : --> 1D 72 49
29
- D, [2016-08-30T20:26:25.326032 #12549] DEBUG -- : --> 1D 72 49
30
- D, [2016-08-30T20:26:26.422158 #12549] DEBUG -- : --> 1D 72 49
31
- D, [2016-08-30T20:30:26.748199 #12939] DEBUG -- : --> 1D 72 49
32
- D, [2016-08-30T20:30:27.768289 #12939] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
33
- D, [2016-08-30T20:30:37.770416 #12939] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
34
- D, [2016-08-30T20:30:47.797936 #12939] DEBUG -- : --> 1D 72 49
35
- D, [2016-08-30T20:30:48.838943 #12939] DEBUG -- : --> 1D 72 49
36
- D, [2016-08-30T20:31:48.872915 #13113] DEBUG -- : --> 1D 72 49
37
- D, [2016-08-30T20:31:49.905292 #13113] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
38
- D, [2016-08-30T20:31:49.912748 #13113] DEBUG -- : --> 1B 69
39
- D, [2016-08-30T20:31:51.017460 #13113] DEBUG -- : --> 1D 72 49
40
- D, [2016-08-30T20:31:52.122170 #13113] DEBUG -- : --> 1D 72 49
41
- D, [2016-08-30T20:32:18.631939 #13201] DEBUG -- : --> 1D 72 49
42
- D, [2016-08-30T20:32:19.685756 #13201] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
43
- D, [2016-08-30T20:32:19.691691 #13201] DEBUG -- : --> 1B 69
44
- D, [2016-08-30T20:32:20.805019 #13201] DEBUG -- : --> 1D 72 49
45
- D, [2016-08-30T20:32:21.901567 #13201] DEBUG -- : --> 1D 72 49
46
- D, [2016-08-30T20:32:58.169297 #13288] DEBUG -- : --> 1D 72 49
47
- D, [2016-08-30T20:32:59.194279 #13288] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
48
- D, [2016-08-30T20:32:59.200145 #13288] DEBUG -- : --> 1B 69
49
- D, [2016-08-30T20:33:00.306228 #13288] DEBUG -- : --> 1D 72 49
50
- D, [2016-08-30T20:33:01.409001 #13288] DEBUG -- : --> 1D 72 49
51
- D, [2016-08-30T20:33:54.473995 #13365] DEBUG -- : --> 1D 72 49
52
- D, [2016-08-30T20:33:55.558490 #13365] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
53
- D, [2016-08-30T20:33:55.564694 #13365] DEBUG -- : --> 1B 69
54
- D, [2016-08-30T20:33:57.764655 #13365] DEBUG -- : --> 1D 72 49
55
- D, [2016-08-30T20:34:07.768330 #13365] DEBUG -- : --> 1D 72 49
56
- D, [2016-08-30T20:34:59.749887 #13488] DEBUG -- : --> 1D 72 49
57
- D, [2016-08-30T20:35:09.752793 #13488] DEBUG -- : --> 1D 72 49
58
- D, [2016-08-30T20:35:52.810287 #13603] DEBUG -- : --> 1D 72 49
59
- D, [2016-08-30T20:36:02.812555 #13603] DEBUG -- : --> 1D 72 49
60
- D, [2016-08-30T20:42:42.680478 #14028] DEBUG -- : --> 1D 72 49
61
- D, [2016-08-30T20:42:52.680945 #14028] DEBUG -- : --> 1D 72 49
1
+ # Logfile created on 2017-03-28 20:49:40 -0400 by logger.rb/44203
2
+ D, [2017-03-28T20:49:40.028578 #9345] DEBUG -- : --> 1D 72 49
3
+ D, [2017-03-28T20:49:41.104858 #9345] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
4
+ D, [2017-03-28T20:49:41.110390 #9345] DEBUG -- : --> 1B 69
5
+ D, [2017-03-28T20:49:42.173477 #9345] DEBUG -- : --> 1D 72 49
6
+ D, [2017-03-28T20:49:43.268342 #9345] DEBUG -- : --> 1D 72 49
7
+ D, [2017-03-28T20:51:06.085122 #9490] DEBUG -- : --> 1D 72 49
8
+ D, [2017-03-28T20:51:07.158484 #9490] DEBUG -- : --> 0D 0A 0D 0A 0D 0A
9
+ D, [2017-03-28T20:51:07.161589 #9490] DEBUG -- : --> 1B 69
10
+ D, [2017-03-28T20:51:08.278707 #9490] DEBUG -- : --> 1D 72 49
11
+ D, [2017-03-28T20:51:09.379386 #9490] DEBUG -- : --> 1D 72 49